从非基于 systemd 的 rootfs 启动 chroot 内的 systemd 服务

use*_*570 52 unix chroot systemd sysvinit openrc

使用 init 脚本(或使用 openrc)我总是可以从不同的安装根运行服务。
但是当我跑步时,chroot /somepath/to_root /usr/bin/systemctl start someservice我得到了:

Running in chroot, ignoring request.
Run Code Online (Sandbox Code Playgroud)

有没有办法强制systemd运行服务?

更新:
我忘了说我的主机系统运行 init 脚本或 openrc,但从来没有使用 systemd,而且我使用 chroot 来对 Unix 系统进行故障排除,这些系统甚至无法启动最小的 shell。

Mar*_*iae 41

systemd 发行版(Arch Linux、OpenSUSE、Fedora)中的一个众所周知的问题。

Systemd 取代了 sysvinit,并提供了一个巨大的优势。在 sysvinit 中,当您要求启动服务时,它会继承调用脚本的人的执行上下文,其中包括环境变量、ulimit 等。相反,Systemd 通过通知守护进程对此进行了改进,守护进程将在明确定义的、健康的、恒定的环境中启动服务,当然,服务的性能更容易预测,因为环境总是相同的。

这意味着,当我从 chroot 内部调用 systemctl 时,与我在 chroot 内部无关,将被继承的环境仍然是 PID 1 的环境,而不是我当前的环境。但比这更糟糕的是:由于通信套接字放置在 /run/systemd 中,chroot 中的进程甚至无法与 init 系统对话!

那么你如何在 systemd 发行版中进行 chroot 操作呢?

  1. 如果您只想拥有一个 Linux 容器,这个 Arch Wiki 页面将告诉您如何在 30 秒内设置 Linux 容器,感谢systemd-nspawn.

  2. 相反,如果您真的想要一个 chroot 环境,这个漂亮而清晰的网页将为您提供两个可行的解决方案(第二个是第 1 点提供的解决方案的修改版本)。

  • 我从来没有在我的主机系统根目录中使用 systemd。就我而言,我不能将 systemd 与 openrc 混合使用。 (2认同)
  • @TwoD 那行不通。运行 `systemd-nspawn` 失败并显示“不在 systemd 系统上运行”。除非主机也在使用 systemd。 (2认同)

use*_*570 12

几年后,我必须承认,对于大多数 Systemd 实际问题,只有一种解决方案。因为错误是Systemd本身

我真的厌倦了 Systemd,因为我遇到了从未遇到过 Upstart 或 Openrc 之类的问题:

  • 即使对于只有 24Mb ram且没有可写存储的嵌入式系统,也需要强制执行需要 cgroups 支持的内核(而不是被 设为可选,而是在配置文件中默认启用)。 虽然支持者认为在这种情况下无法使用它是想要的行为,因为它不是为这种情况设计的,但现实是其他 init 系统也不关心,而在 systemd 中,这种功能不是一个单独的项目这再次凸显了不接吻的后果
  • 尽管声称是模块化的,但在运行时依赖地狱使它成为一个强大的上帝对象:想要通过单个 reiser4 rootfs 启动?这是不可能的,因为许多程序需要systemd-udevd哪个需要systemd-init哪个需要systemd-boot不能同时安装的包,grub2也不能从 reiser4 分区读取内核映像。
  • 想通过蓝牙拨号上网??如果它不适用于您的三星 java me 手机,那么您将无法运行以前手动运行的脚本和命令行软件,因为networkd.
  • 虽然我认识到最大的问题是如果您正在构建和维护自己的 Linux 发行版:systemd init 模块本身具有如此多的依赖项,您不能建议通过不同的安装包选择另一个 init 系统。
  • 如果没有在隐私方面定义解析器,则默认使用Google dns for systemd
  • 无法启动后台非服务进程并注销,因为在新的 systemd 范围内没有简单的方法可以做到这一点。
  • 如果您无法在系统中 chroot 或从 libdb4.8 升级(而至少,在最坏的情况下,Microsoft 拥有 xml 格式的日志文件),祝您查看日志好运。

唯一的解决办法:

Systemd 对于解决问题来说是不必要的复杂:像 alsa 而不是 ossv4。因此,如果您有使用 systemd 的东西,只需擦除所有数据:

dd if=/dev/urandom of=/dev/dm?0 bs=1M
Run Code Online (Sandbox Code Playgroud)

并安装一些根本不使用它的东西,同时使用 Openrc解决像 Gentoo 这样的 SysV Init 问题。
关于我的问题,systemd 制作了类似于 Windows® 注册表的东西:如果其中的一部分被搞砸了,那么它就结束了。

  • **请认识到某些东西的设计确实可以阻止得到答案,因此答案是切换到有效的东西**。这是一个真正的答案。 (7认同)
  • 我也有同样的看法,现在我的看法更加平衡了。 Systemd有一个超级大的优势,那就是*它能真正杀死该杀死的东西*。这是因为它使用内核 cgroup 功能跟踪所有分叉的子进程。任何较旧的工具都无法做到这一点。此外,你还记得 /etc/init/*.sh 中的脚本的废话吗?我也记得,但这对我来说只是今天的一个糟糕的记忆。 systemd 服务文件很清晰,*configs* 长约 10 行。 *脚本* 不超过 200 行。 systemd 拥有这些巨大的优势,但我同意它的所有其他功能都是劣势。 (3认同)

小智 7

systemd 只忽略“服务”,所以我只是手动运行守护程序命令。

所以代替

service sshd start
Run Code Online (Sandbox Code Playgroud)

我用

/usr/sbin/sshd -D &
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于所有服务。有些需要作为系统服务启动器的一部分启动,如 Xorg。 (2认同)