语境:
我正在尝试将.deb
包转换为.rpm
使用外星人,我使用这个命令:
$ alien -r foo.deb
但它这样抱怨:
> Warning: alien is not running as root!
> Warning: Ownerships of files in the generated packages will probably be wrong.
我认为所有alien
需要root
的是保证它有权为输出创建foo.deb
'sroot
拥有的文件foo.rpm
,但我不确定。
问题:
- 包总是需要一些
root
- 拥有的文件吗? - 为什么他们需要
root
- 拥有的文件? - 如果我错了,为什么
alien
需要root
?
答案1
使用假根。外星人不需要 root 来操作某些位。 fakeroot 手册页中的一行描述充分总结了这一点:
在伪造 root 权限的环境中运行命令以进行文件操作
因此,fakeroot 是一个程序,它使相关命令相信它正在以 root 身份运行,并且文件权限在应有的位置设置为 root 权限。有关详细信息,请参阅man fakeroot
。
不幸的是,您收到的错误消息具有误导性。
简而言之,
fakeroot alien ...
这是一份错误报告,其中 Alien 的作者 Joey Hess 讨论了使用 fakeroot 的必要性。可能不是最好的链接。如果我找到更好的东西,我会发布它。
答案2
因为更改文件的所有权需要“root”权限;并不是因为这些文件必须由“root”拥有——尽管很多文件都是如此。
在您的主目录中创建一个文件并尝试更改其所有者:-
touch test.txt
ls -l test.txt
-rw-rw-r--. 1 gareth gareth 0 Jun 28 21:24 test.txt
chown nobody. test.txt
chown: changing ownership of ‘test.txt’: Operation not permitted
尽管我拥有该文件并拥有rw
权限,但我无法更改所有者。
sudo chown nobody. test.txt
ls -l test.txt
-rw-rw-r--. 1 nobody gareth 0 Jun 28 21:24 test.txt
但使用 root 身份运行它是sudo
可行的。
正如警告所述;所有权将是错误的。由此,我们可以假设alien
更改了某些文件的所有权。
系统文件通常由具有限制性权限的“root”拥有,因此像您我这样的用户不会更改或删除它们。
系统上还有其他用户和组,但与“root”不同,它们在发行版中并不相同。例如,在 Fedora(以及 RedHat 和 CentOS)下,Apache
网络服务器运行apache
并且数据文件由该用户拥有。另一方面,我相信它在 Debian/Ubuntu 系统上Apache
运行www-data
,因此数据文件归该用户所有。这意味着alien
在转换时需要更改文件的所有者,并且要执行此操作,如上例所示,它需要以“root”身份运行。
答案3
Rpm 和 deb 软件包包含要安装的文件的存档(CPIO在 rpm 的情况下存档,柏油在 deb 的情况下)。这些档案包含有关每个文件的元数据,包括其名称、修改日期、所属用户和组以及权限。安装软件包后,每个文件最终都具有存档中描述的所有权(除非安装后脚本对其进行修改)。
大多数由软件包安装的文件都归 root 所有,因为没有用户被授权修改它们。
Alien 通过解压存档并重新打包来转换软件包(以及转换安装前/安装后脚本等其他操作)。例如,要将 rpm 转换为 deb,alien 调用cpio
将存档提取到临时位置,然后tar
构建新的存档。如果解压不是使用 root 权限完成的,那么所有临时文件将归进行解压的用户所有,因此当文件打包到新存档中时,它们最终将归该用户所有。
Alien 实际上不需要以 root 身份运行,因为它不需要修改系统中的任何内容。假根在该命令接收有关文件系统操作的虚假信息的环境中运行外星人(或任何其他命令),假装通常需要 root 的操作(例如更改文件所有权)已成功。这样,解包就以 root 身份完成,并设置了正确的文件所有权(就alien
其子进程而言),因此重新打包会创建预期的存档。