过去半年来,我每个工作日都在使用这个托管在 vSphere 中的 ubuntu 16.04 盒子。我使用 putty/kitty 从 Windows 连接到它。今天,我收到了类似于这个问题。
我不确定是什么原因造成的。以下是消息:
Authenticating with public key "imported-openssh-key"
Server refused to allocate pty
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-116-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
0 packages can be updated.
0 updates are security updates.
我保留了打印出来的格式。
这个答案解决了问题,但每次重启时我都必须输入命令:
mount devpts /dev/pts -t devpts
添加 fstab 行,如下所示关联在原始问题之一中给出的答案似乎并没有改变任何东西。
说实话,我不知道为什么我以前不需要安装这个设备,直到现在它突然停止工作了,而我需要这个支架。
对我来说,解决这个问题的正确方法是什么,这样我就不需要在每次重启后手动安装它了?很乐意提供您可能要求的日志或其他诊断信息。
更新
因此,最初我通过重建盒子来处理该问题,但现在它再次发生了,并且也开始发生在我管理的其他机器上。
跟随Filipe 的回答。
跑步gzip -dc /boot/initrd.img-$(uname -r) | cpio -i --quiet --to-stdout init | grep devpts
给予
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
跑步gzip -dc /boot/initrd.img-$(uname -r) | cpio -i --quiet --to-stdout scripts/init-bottom/udev | grep move
给予
# move the /dev tmpfs to the rootfs
mount -n -o move /dev ${rootmnt}/dev
使用“调试”开关运行此输出。
我还能做些什么来找到问题的根本原因?
重启后,重新生成sudo update-initramfs -c -k $(uname -r)
没有产生任何明显变化。
这是我手动安装 devpts 之前和之后在 mtab 中看到的内容:
>sudo cat /etc/mtab | grep devpts
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666 0 0
>sudo mount devpts /dev/pts -t devpts
>sudo cat /etc/mtab | grep devpts
devpts /dev/pts devpts rw,nosuid,noexec,relatime,mode=600,ptmxmode=000 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666 0 0
devpts /dev/pts devpts rw,relatime,mode=600,ptmxmode=000 0 0
答案1
/dev/pts 文件系统通常由 Ubuntu 中的 initrd(又名 initramfs)挂载。
initramfs 是一个小型文件系统,它在内核启动时加载到内存中,在设置基本内容并加载挂载真实根所需的任何内核驱动程序后,设置系统切换到真实根文件系统。
您可以在 /boot 下找到它,名为 initrd.img-*,其中最后一部分与内核版本相匹配。
它是一个 xz 压缩的 cpio 档案。
您可以使用以下命令查看挂载时首先运行的“init”脚本。其末尾的“grep”查看挂载 devpts 的行:
$ xz -dc /boot/initrd.img-$(uname -r) | cpio -i --quiet --to-stdout init | grep devpts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
devpts 实际上安装在 initramfs 的根目录中,因此稍后还有另一个步骤将其移动到真正的根目录中,然后再切换到它。您可以在这里查看:
$ xz -dc /boot/initrd.img-$(uname -r) | cpio -i --quiet --to-stdout scripts/init-bottom/udev | grep move
# move the /dev tmpfs to the rootfs
mount -n -o move /dev ${rootmnt}/dev
如果你想要提取 initrd 的全部内容,你可以使用:
# First go to an empty directory
$ mkdir -p /tmp/extract_initrd
$ cd /tmp/extract_initrd
$ xz -dc /boot/initrd.img-$(uname -r) | cpio -id
然后探索那棵树……
如果您的 initramfs 似乎有问题,您可以尝试使用以下update-initramfs
命令重新生成它,如下所示:
$ sudo update-initramfs -c -k $(uname -r)
注意此命令输出中的任何错误,它们可能会给你提供一些可能出错的线索......
另一种可能性是启用 initrd 中的调试日志记录。为此,请在内核命令行中添加“debug”并重新启动。然后在系统启动后查看文件 /run/initramfs/initramfs.debug,该文件将包含 initrd 脚本打印的消息。请参阅这里有关 initramfs 调试的更多详细信息。
答案2
当我收到“服务器拒绝分配 pty”时,这是一个简单得多的问题:我的 SSH 服务器将“PermitTTY”选项设置为“否”。 (在最新版本的 OpenSSH 中,该行通常会被注释掉,因为“是”是默认值。因此,只要没有手动将其设置为“否”,就没问题。)
使用您最喜欢的编辑器仔细检查您的 sshd_config 文件。
sudo nano /etc/ssh/sshd_config
确保“PermitTTY”行不存在、被注释掉或手动设置为“是”,然后重新启动 SSH 服务器。
sudo service sshd restart
这也许就是您所需要的全部。
答案3
我遇到了类似的问题https://serverfault.com/a/934030/33095
权限与预期不同,但可以使用以下方法修复:
sudo mount -o remount /dev/pts
sudo grep devpts /proc/mounts
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0