Ubuntu

“伺服器拒絕分配 pty” - 如何自動掛載 devpts?

  • July 4, 2019

在過去的半年裡,我每個工作日都在使用託管在 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 行,如鍊接所示,也在原始問題答案之一中給出,似乎沒有任何改變。

老實說,我不知道為什麼直到現在我才需要安裝這個設備,然後突然它停止工作,我需要這個安裝。

為我解決此問題的正確方法是什麼,以便我不需要在每次重新啟動後手動安裝它?很高興提供您可能要求的日誌或其他診斷。

更新

所以最初我通過重建盒子來解決這個問題,但現在它再次發生並且它開始發生在我管理的其他機器上。

按照菲利普的回答

執行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

/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 中啟用調試日誌記錄。為此,將“調試”添加到核心命令行並重新啟動。然後在系統啟動後查看文件 /run/initramfs/initramfs.debug,其中將包含由 initrd 腳本列印的消息。有關 initramfs 調試的更多詳細資訊,請參見此處

引用自:https://serverfault.com/questions/905093