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

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

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

Running in chroot, ignoring request.

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

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

答案1

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

Systemd 取代了 sysvinit,并且比 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 点提供的解决方案的修改版本)。

答案2

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

我真的受够了 Systemd,因为我遇到了一些我从未遇到过的问题,比如 Upstart 或 Openrc:

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

唯一的解决方案:

Systemd 在解决问题时过于复杂:例如使用 alsa 而不是 ossv4。因此,如果您有使用 systemd 的东西,只需清除所有数据:

dd if=/dev/urandom of=/dev/dm−0 bs=1M count=1

并在解决 SysV Init 问题时安装一些根本不使用它的东西像 Gentoo 和 Openrc 一样
关于我的问题,systemd 使诸如 Windows® 注册表之类的东西变得无法使用:如果其中的一部分搞砸了,那么它就完了。

答案3

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

因此,

service sshd start

我用

/usr/sbin/sshd -D &

答案4

曾经尝试使用 chroot 的网络配置在救援模式下启动网络时遇到过此问题。最后这个方法对我有用:

service --skip-redirect <service> restart

或者:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart

相关内容