在 nspawn 下运行 systemd 实用程序(例如 systemctl)?

在 nspawn 下运行 systemd 实用程序(例如 systemctl)?

debootstrap如果我有一个在运行时引导的目录,systemd-nspawn我必须做什么才能使其内部systemd正常工作?

$ sudo systemd-nspawn -D ./foo
Spawning container mschroot on /opt/foo.
Press ^] three times within 1s to kill container.
root@foo:~# systemctl
Failed to connect to bus: No such file or directory

如果我手动尝试,mount --bind会收到不同的错误,

$ sudo mount --bind /proc /opt/foo/proc
$ sudo chroot /opt/foo/
root@x230:/# systemctl
Running in chroot, ignoring request.

在该 chroot 中安装了一个我想启动的服务?

答案1

如果您想使用容器systemd内部的功能,systemd-nspawn您需要做一些事情

  1. dbus在你的容器中
  2. 您需要实际启动容器systemd-nspawn --boot

答案2

systemd 在这里是正确的。您尝试从 chroot 运行它,但 chroot 有一组完全不同的路径、库和服务。允许你调用 systemctl 会很混乱:它是正确的 D-Bus 库吗?里面的systemctl版本和外面的daemon版本一样吗?

如果您只想使用 chroot 内的服务,您有两个选择:

  • 使用新的便携式服务,随 systemd 239 引入。如果您希望内部的服务可以从外部访问,那么这就是您想要的。
  • 确保 chroot 内存在 systemd,并用于systemd-nspawn --boot在 chroot 内运行单独的 systemd 实例。然后,就可以启用它,并且只在内部生效。

相关内容