在chroot环境中挂载dev,proc,sys?


87

我正在尝试使用自定义选择的软件包创建Linux映像。
我想做的是手工制作要在XO笔记本电脑上使用的软件包,因为如果可以构建所需的所有软件包并只是将它们刷新,则在真正的XO硬件上编译软件包会花费很长时间。映像到XO,可以节省时间和空间。

当我尝试安装一些软件包时,由于缺少proc,sys,dev目录,因此配置失败。因此,我从其他地方了解到需要将主机proc ...目录“挂载”到我的chroot环境中。

我看到了两种语法,不确定使用哪种语法。

在主机中:

  mount --bind /proc <chroot dir>/proc 

和另一种语法(在chroot环境中):

  mount -t proc none /proc

我应该使用哪一个,有什么区别?


当心:授予对磁盘设备的访问权限意味着您失去了' chroot()'的某些好处。特别是,如果您不小心,则确定的文件可以读取文件系统部分之外的文件。
乔纳森·莱夫勒

2
@乔纳森·莱夫勒(Jonathan Leffler):这听起来并不像他在做什么。
齐弗尔

@JonathanLeffler chroot中的root用户始终可以始终逃脱chroot。
LtWorf

Answers:


43

对于/proc/sys,我想您可以使用任何一种方法。它们都是特殊的文件系统,因此可以重新创建任意次(bind mount方法使用与主机系统完全相同的安装,而其他方法使用新的安装)。我总是在指南中看到推荐的绑定安装,所以我会用它。据我所知,没有真正重要的区别。

但是,/dev通常是由udev管理的tmpfs挂载,因此它必须是与主机上实际相同的文件系统。这意味着您将需要使用绑定安装方法。

如果此chroot将存在一段时间,则可以将这些条目/etc/fstab放在主机系统上以简化操作。


我想问一下将proc / sys从主机复制(绑定)到其他计算机是否有意义?他们为什么要匹配那台机器?
ransh

@ransh如果将/ proc绑定到$ chrootdir / proc会有意义,您将有可能处理来自两个系统的过程以及这两个系统的/ proc内部的情况;例如:从chroot您可以检查主机上是否正在运行某个程序...等等
乔纳(Jonah)

也许sys type文件系统的(今天)似乎不再存在?
174140

111

Arch Linux的维基提出以下命令:

cd /mnt/arch # or where you are preparing the chroot dir
mount -t proc proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/

2
他们似乎也在ubuntu为我工作。
isaaclw 2012年

4
就我而言(也是Ubuntu),我也需要一个“ mount -o bind / dev / pts dev / pts”。
汤玛斯(Thomas)

请提供源链接。
发泡胶飞

@styrofoamfly已添加。
gacrux

1
截至2019年,ArchLinux Wiki现在--rbind支持sysdev
萨德·马利克

12

Gentoo手册特别提出用于重新安装的/ proc和/ dev这两个命令。我已经使用过几次了。

mount -t proc none /mnt/chroot/proc
mount -o bind /dev /mnt/chroot/dev

我怀疑/ sys只是一个普通文件夹,因此您应该可以进行硬链接。

ln /sys /mnt/chroot/sys

17
您不能像通常为/ sys建议那样硬链接目录,如果使用符号链接,则在您更改chroot时它将断开。

他们基于systemd添加了一些新功能。也许添加它们是个好主意。
AzP

1

在这个流行的问题中可能值得注意的是,Arch Linux已将脚本arch-chroot制作成了;下载arch-install-scripts-15-1-any.pkg.tar.xz

这可以解决Arch-LinuxManjaro中的各种相关问题,我也成功地使用了它。可能还会有更多类似Parabola的 Arch 衍生产品兼容。

虽然将简单的标准chroot安装到辅助Manjaro安装中将无法运行

pacman --sync linux

(系统崩溃后的银弹),将其替换为

arch-chroot /run/media/*YOURSELF*/manja-disk2

将使您能够通过以下方式修复次要的Arch-derivate安装

pacman --sync linux

像个魅力。bash脚本arch-chroot负责所有工作/dev /sys /proc,而这些工作则由standard单独处理chroot

另请参阅:使用arch-chroot


-1

还有其他伪文件系统和tmpfs位置。这是在debian上的:

/dev/pts 
/run
/run/shm
/proc/sys/fs/binfmt_mist
/var/lib/nfs/rpc_pipefs
/proc/fs/nfsd
/proc/bus/usb

可以从chroot内挂载usbfsrpc_pipefsdevpts伪文件系统。我建议不要绑定/proc到chroot /proc,因为内核具有名称空间的概念,并且实际上可以在chroot的proc中放入不同的内容。

更新:根据此邮件列表线程,/ sys不应绑定安装,特别是如果chroot进程正在使用其自己的网络名称空间。

这是一个坏主意来安装系统/var/run到chroot环境,如果在chroot有自己的PID命名空间。


投机?在超级用户(和其他堆栈论坛)上,如果不确定,通常最好推迟或研究链接源并进行回答。这是为了避免散布错误提示的风险。对不起,如果您感到失望,祝您好运!
西蒙B.

@SimonB。我已经添加了指向邮件列表的链接,以支持/ sys不应绑定安装的想法。
布赖恩·明顿

使用pid名称空间,您正在谈论的是我们可以在现代linux内核上找到的更高级的用户名称空间功能(即“容器”所基于的功能),而当我们使用术语chroot时,我们指的是传统的文件名称空间更改(别无其他)。
JohanBoulé2016年

-1

最简单的方法是使用for循环:

cd /

for i in proc sys dev; do mount -o bind $i /folder/$i; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.