我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)不会在主机上带回新终端。
我在这里缺少什么?
打开伪终端的主部分后
int fd_pseudo_term_master = open("/dev/ptmx",O_RDWR);
有/dev/pts/[NUMBER]
创建的文件,代表slave
他伪终端的部分。
像我这样无知的人可能会想象,做完ptsname(fd_pseudo_term_master,filename_pseudo_term_slave,buflen);
一个人就应该简单地
做int fd_pseudo_term_slave = open(filename_pseudo_term_slave,O_RDWR);
和做好。
但是,必须有一个非常重要的“锁定”伪终端从属用例,因为为了使事情简单,在进行open
调用之前,必须使用man 3 unlockpt来“解锁”。
我无法找出这个用例是什么?伪终端初始锁定需要什么?代码实现了什么(取自 libc)
/* Unlock the slave pseudo terminal associated with the master pseudo
terminal specified by FD. */
int
unlockpt (int fd)
{
#ifdef TIOCSPTLCK
int save_errno = errno;
int unlock = 0;
if (ioctl (fd, TIOCSPTLCK, &unlock))
{
if (errno == EINVAL)
{
errno = save_errno;
return 0;
}
else
return -1; …
Run Code Online (Sandbox Code Playgroud) 在我的 Archlinux 上,/dev/pts
是由 devpts 挂载的,那么谁创建了 /dev/pts/ptmx
设备节点?这个节点的目的是什么?它与 相同(Major=5 Minor=2)设备节点/dev/ptmx/
,但访问模式不同,这是为了什么?