Systemd

內部帶有 systemd 的 nspawn 容器的“無法獲取 shell PTY:協議錯誤”

  • March 26, 2022

我創建容器

# debootstrap --variant=minbase --include=systemd,iproute2 buster "/var/lib/machines/test"

然後我執行它:

# systemd-nspawn --machine test

僅用於測試目的。容器啟動,當我嘗試使用它訪問它時,machinectl出現錯誤:

# machinectl shell test
Failed to get shell PTY: Protocol error

經過一番Google搜尋,我意識到有一個舊的錯誤導致了這種行為,但這在systemd v226中得到了修復,並且/usr/bin/systemd --version在我的 debian 上顯示了 246 版本。

我可以使用“非 systemd 容器”方法進入容器,但我的容器執行 systemd,我應該可以使用machinectl.

看起來我dbus 在容器內失踪了。

# chroot /var/lib/machines/test apt install dbus

或者從頭開始使用:

# debootstrap --variant=minbase --include=systemd,dbus buster "/var/lib/machines/test"

兩者都解決了問題。

教程

創建 Debian 容器

此步驟創建最小容器,包括兩個基本包,稍後可以輕鬆啟用“machinectl login debiancontainer”,而不會出現任何“無法獲取登錄 PTY”錯誤。注意 minbase 的缺失(這避免了使用 passwd 時的錯誤)。

debootstrap --include=systemd,dbus unstable /var/lib/machines/debiancontainer

設置root密碼

這一一次性步驟在新容器內配置 root 密碼。

systemd-nspawn --machine debiancontainer

應遵循的範例輸出

systemd-nspawn --machine debiancontainer 
Spawning container debiancontainer on /var/lib/machines/debiancontainer.
Press ^] three times within 1s to kill container.
root@debiancontainer:~#

現在只需執行並使用 exit 或 CTRL-D 完成

root@debiancontainer:~# passwd
New password: 
Retype new password: 
passwd: password updated successfully
root@debiancontainer:~# 
logout

使用 machinectl 啟動容器

注意:這些命令可以作為普通使用者使用,因此請在請求者對話框中提供適用的密碼。

machinectl start debiancontainer
machinectl list

範例輸出:

local@yourhost:~$ machinectl list
MACHINE         CLASS     SERVICE        OS     VERSION ADDRESSES
debiancontainer container systemd-nspawn debian -       -        

1 machines listed.

使用 machinectl 登錄

範例輸出

$ machinectl login debiancontainer
Connected to machine debiancontainer. Press ^] three times within 1s to exit session.

Debian GNU/Linux bookworm/sid yourhost pts/1

yourhost login: root
Password: 
Linux yourhost 5.13.19-2 #1 SMP 5.13.19-4 (Mon, 29 Nov 2021 12:10:09 +0100) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@yourhost:~#

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