我使用以下方式创建容器
# 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
经过一番谷歌搜索后,我发现有一个产生此行为的旧错误,但这个问题已在systemd v226,并且/usr/bin/systemd --version
在我的 Debian 上显示版本 246。
我可以使用“非 systemd 容器”方法,但我的容器运行 systemd,我应该能够使用machinectl
。
答案1
我好像失踪了dbus
容器内部。
# chroot /var/lib/machines/test apt install dbus
或者从头开始使用:
# debootstrap --variant=minbase --include=systemd,dbus buster "/var/lib/machines/test"
两者都解决了问题。
答案2
教程
创建 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:~#