我用来systemd-nspawn
运行一些容器。我可以使用它们在后台启动systemctl start systemd-nspawn@foo
。然而,有时我会从 开始systemd-nspawn -bD foo
。我找不到任何方法将其发送到后台。如图所示,关闭终端只会杀死容器machinectl list
。我可以这样做吗?如果可以,怎么做?
我知道容器不仅仅是一个进程,但从这个意义上说,预期的效果与后台进程相同 - 我希望容器运行,但我原来的 shell 还给我。
答案1
好吧,就其价值而言,以下内容对我来说是成功的:
sudo systemd-nspawn -bxD/
与你的几乎相同,除了我不给出machine
一个名称,我就获得了容器根目录-x
的临时 btrfs 快照。/
getty
这在我的终端 pty上调出了容器,我登录了login
所有内容。
我承认我有一段时间有点困惑,但systemctl
在容器中稍微戳了一下之后,zsh
我想出了(从容器内运行):
systemctl stop console-getty.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or other units.
Authenticating as: mikeserv
Password:
==== AUTHENTICATION COMPLETE ===
这使得机器放弃了终端控制权。唯一的事情是,我首先使用sudo
- 它也获得了自己的终端控制层来进行身份验证。这给我留下了一个空白的终端,而且对kill -CONT "$(pgrep ksh)"
我来说没有任何好处。于是我又被难住了一两分钟,但是(在另一个终端)...
sudo fuser -v /dev/pts/*
USER PID ACCESS COMMAND
/dev/pts/0: mikeserv 8347 F.... zsh
root 18003 F.... sudo
/dev/pts/13: mikeserv 9553 F.... zsh
mikeserv 16838 F.... ksh
root 17657 F.... sudo
root 17658 F.... systemd-nspawn
/dev/pts/14: root 17675 F.... systemd
给了我上面的清单,所以我想 - 到底是什么?
sudo kill -STOP 17657
然后 - 你瞧 - 我ksh
又回到了原来的航站楼。总结一下,我需要验证我仍然可以访问machine
,当然,否则它就没用了:
machinectl -l
MACHINE CLASS SERVICE
localhost-35ceaa76b1306897 container nspawn
好的...
sudo machinectl login localhost-35ceaa76b1306897
Connected to machine localhost-35ceaa76b1306897.
Press ^] three times within 1s to exit session.
Arch Linux 4.0.7-2-ARCH (pts/0)
localhost-35ceaa76b1306897 login:
我getty
在另一个终端上得到了另一个!
答案2
我有一个类似的问题。我的方法是用于dtach
控制与运行容器的终端的附加和分离。然后在容器内我可以运行tmux
/screen
等。
machinectl
将允许您在启动时运行容器,但截至撰写本文时,debian stable 还没有systemd
包含此功能的版本。