如何设置 systemd-nspawn 容器的后台?

如何设置 systemd-nspawn 容器的后台?

我用来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包含此功能的版本。

相关内容