为什么我们需要fakeroot
指挥?我们不能简单地使用sudo
orsu
命令吗?
手册页说:
fakeroot - 在伪造 root 权限的环境中运行命令文件操作
About.com 说道:
提供一个假的根环境。该软件包旨在实现以下功能:
dpkg-buildpackage -rfakeroot
即无需成为软件包构建的根用户。这是通过设置LD_PRELOAD
to 来完成的libfakeroot.so
,它提供了getuid
,chown
,chmod
,mknod
,stat
, ... 的包装器,从而创建了一个假根环境。如果你不明白这些,你就不需要fakeroot
!
我的问题是,它解决了一个简单的su
或sudo
没有解决的特殊目的吗?例如,为了重新打包 ubuntu 中所有已安装的软件包,我们给出以下命令:
$ fakeroot -u dpkg-repack `dpkg --get-selections | grep install | cut -f1`
我们可以使用 sudo 或 su 而不是 fakeroot 来执行上述命令,如下所示:
$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`
编辑:
跑步:
$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`
给我这个错误:
控制目录的权限错误 700(必须 >=0755 且 <=0775)
有什么理由吗?
答案1
想象一下,您是一名在远程服务器上工作的开发人员/软件包维护人员等。您想要更新包的内容并重建它,从 kernel.org 下载和自定义内核并构建它,等等。在尝试执行这些操作时,您会发现某些步骤需要您拥有root
权限(UID
并且GID
0) 出于不同的原因(安全、被忽视的权限等)。但不可能获得root
权限,因为您正在远程计算机上工作(许多其他用户也有与您相同的问题)。这正是它的作用:它对需要它们的环境fakeroot
假装有效UID
且为 0。GID
在实践中,你永远不会获得真正的特权(与你提到的root
相反)。su
sudo
答案2
由于答案很难理解(对我自己来说)并且需要一些思考才能理解它(这条评论让我理解这一点),我将给出一个希望更好的解释。
1. fakeroot 中会发生什么
只不过是您自己的用户发生的情况而已。绝对没有更多了。如果你fakeroot
(当调用时会给你一个新的 shell,就像sudo
会的那样),假装做你需要许可的事情,然后退出,绝对不会发生任何事情。
如果你仔细想想,这完全是浪费时间。为什么你要做一些实际上不会发生的事情?太疯狂了。你完全可以不做任何事情,也不会有什么区别,因为没有任何痕迹。
等一下...
2.fakeroot的踪迹
那里可以留下痕迹fakeroot
。我们来看看里面的命令莫滕西克尔的回答这非常好,值得点赞:
$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root 23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst
乍一看,使用似乎fakeroot
完全是浪费时间。最后,如果你没有使用fakeroot
,你也会得到同样的东西。
这里微妙的事情是这样的:
$ cat root.tst
Wow I have root access
这意味着文件的内容仍然记得是根目录。您可能会说不使用fakeroot
也会产生相同的结果。你是对的,这个例子太简单了。
我们再举一个例子:
$ fakeroot
# touch x
# touch y
# chown myuser:myuser x
# ls -l > listing
# exit
$ ls -l
total 4
-rw-rw-r-- 1 myuser myuser 152 Jan 7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan 7 21:39 x
-rw-rw-r-- 1 myuser myuser 0 Jan 7 21:39 y
$ cat listing
total 0
-rw-rw-r-- 1 root root 0 Jan 7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan 7 21:39 x
-rw-rw-r-- 1 root root 0 Jan 7 21:39 y
让我们来看看发生了什么。我假装是root
,这是完全无效的,并创建了x
和y
。我假装x
属于myuser
并且y
属于root
。他们实际上都属于myuser
(正如我们最后看到的),但我只是假装就这样吧。
然后我创建了一个列表并将我的想象力保存到一个文件中。稍后,当我回头查看该文件时,我可以看到我想象的文件应该属于谁。再说一遍,它们实际上并不属于我想象中的人所有,我只是简单地想象一下。
3.那么...你为什么又想要那个?
您可能会说我真的不需要假装是 root 来创建该列表。我可以简单地创建列表,然后对其进行编辑以反映我的想象力。你是对的,你不需要fakeroot
那样。事实上,知道这fakeroot
实际上并没有什么作用,你不可能获得任何你以前没有的能力。
但,这就是fakeroot
全部,编辑列表可能并不简单。就像可以安装在您的系统上的软件包一样,您有tar
ed、gzip
ed、xz
ed、bzip2
ed 或任何其他格式,可以将文件保存在一起并记住它们的权限和所有者。您可以轻松修改压缩文件并编辑文件的所有权吗?我不了解你,但我想不出什么办法。
是否可以构建一个工具,一旦所有内容都被压缩,它就会修改压缩文件并以编程方式编辑所有权和权限?是的,可以。因此,您可以在压缩之前伪造所有权,或者在压缩之后更改它们。 Debian 人们认为前者更容易。
4.为什么不直接使用sudo
?
首先,您不需要 root 权限来构建软件,也不需要 root 权限来压缩它们。因此,如果您不需要它,您就必须真正成为 Windows 用户才能考虑获得该权限。但撇开讽刺不谈,你可能甚至没有 root 密码。
此外,假设您确实拥有 root 权限。假设您想假装某个文件只能对根目录具有读取访问权限。因此sudo
,您实际上将文件所有者和权限更改为root
,退出 root shell 并尝试打包所有内容。你失败了,因为现在你无法再读取该文件,因为你没有 root 访问权限。因此,您必须sudo
以 root 身份压缩并构建包。实际上,您必须以 root 身份执行所有操作。
这是坏TM。
作为打包者,您不需要 root 权限,也不应该获得它。当您安装软件包时,您可能需要以A
root 身份安装某些文件 ( ),这就是您需要 root 权限的地方。所做的一切fakeroot
都是为了让这一切成为可能。它让打包程序列出A
为归档程序的 root 所有,以便当用户解压缩包时,归档程序需要 root 权限并创建A
为 root 所有。
答案3
要清楚地看到 fakeroot 和真正的 sudo / su 之间的区别,只需执行以下操作:
$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root 23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst
只要您处于 fakeroot shell 中,看起来就像您是 root 一样——只要您不尝试执行任何真正需要 root 权限的操作。这正是包装工具制作在任何机器上都有意义的包装所需要的。
事实上,当你使用fakeroot进行打包时,你想要实现的目标是让你在fakeroot下运行的工具看到你的文件是root拥有的。不多不少。因此,事实上,su 或 sudo 无法获得正确的文件所有权。
答案4
我已将其用于包构建脚本。我不确定运行该脚本的人是否具有 root 级别访问权限,但该脚本仍然需要生成一个 tar 文件,其中包含属于 root 的文件。最简单的方法是在 fakeroot 下运行包构建脚本,这会欺骗归档器相信这些文件属于 root,并将它们打包到归档中。这样,当包被解压到目标计算机(完全在不同的计算机上)时,文件不属于奇怪的或不存在的用户。
想一想,我见过的唯一一个地方是用于构建某种存档:嵌入式系统的 rootfs、tar.gz 存档、rpm 包、.deb 包等。