我在 Arch Linux 下创建了一个基于 Debian 的 chroot 环境debootstrap
,并用这样的方式填充它:
#!/bin/sh
mount -t proc proc $CHROOT/proc
mount -t devpts devpts $CHROOT/dev/pts
chroot $CHROOT /bin/bash --login -c "/etc/init.d/ssh start"
问题是,执行上面的脚本后,我无法再在主机系统上打开新终端:
urxvt: can't initialize pseudo-tty, aborting.
关闭chroot
(停止sshd
、卸载 proc 和 dev/pts)不会在主机上恢复新的终端。
我在这里缺少什么?
答案1
当您运行时mount -t devpts devpts $CHROOT/dev/pts
,这会在 chroot 中安装 devpts 文件系统的单独实例。使 devpts 在 chroot 中可用的另一种方法是使用绑定挂载,这使得文件系统的同一实例在新位置可用。绑定挂载就像创建硬链接,仅针对挂载点而不是文件。
mount --bind /dev/pts "$CHROOT"/dev/pts
devpts 的单独实例共享相同的文件(如果您创建或删除终端或更改其元数据,它会反映在所有实例中)。然而,在幕后显然存在一些差异,导致它无法工作。绑定安装可确保需要同步的所有内容都得到同步,因为它们是相同的文件系统,而不仅仅是相同的文件系统。