Debian chroot 阻止主机上的 PTTY

lyn*_*nix 9 chroot tty urxvt

debootstrap在 Arch Linux 下创建了一个基于 Debian 的 chroot 环境,并用这样的方式填充它:

#!/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"
Run Code Online (Sandbox Code Playgroud)

问题是,在执行上述脚本后,我无法再在主机系统上打开新终端:

urxvt: can't initialize pseudo-tty, aborting.
Run Code Online (Sandbox Code Playgroud)

关闭chroot(停止sshd、卸载 proc 和 dev/pts)不会在主机上带回新终端。

我在这里缺少什么?

Gil*_*il' 6

当您运行 时mount -t devpts devpts $CHROOT/dev/pts,这会在 chroot 中安装一个单独的 devpts 文件系统实例。在 chroot 中使 devpts 可用的另一种方法是使用绑定安装,它使文件系统的相同实例在新位置可用。绑定挂载就像做一个硬链接,只针对挂载点而不是文件。

mount --bind /dev/pts "$CHROOT"/dev/pts
Run Code Online (Sandbox Code Playgroud)

devpts 的不同实例共享相同的文件(如果您创建或删除终端或更改其元数据,它会反映在所有实例中)。然而,引擎盖下显然存在一些差异,使其无法正常工作。绑定挂载确保需要同步的所有内容都是同步的,因为它是同一个文件系统而不仅仅是相同的文件系统。