![几年后,我必须承认,大多数 Systemd 实际问题只有一个解决方案。因为错误在于 Systemd 本身](https://linux22.com/image/1389760/%E5%87%A0%E5%B9%B4%E5%90%8E%EF%BC%8C%E6%88%91%E5%BF%85%E9%A1%BB%E6%89%BF%E8%AE%A4%EF%BC%8C%E5%A4%A7%E5%A4%9A%E6%95%B0%20Systemd%20%E5%AE%9E%E9%99%85%E9%97%AE%E9%A2%98%E5%8F%AA%E6%9C%89%E4%B8%80%E4%B8%AA%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E3%80%82%E5%9B%A0%E4%B8%BA%E9%94%99%E8%AF%AF%E5%9C%A8%E4%BA%8E%20Systemd%20%E6%9C%AC%E8%BA%AB.png)
使用 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 呢?
如果你想要的只是一个 Linux 容器,这个 Arch Wiki 页面将告诉您如何在不到 30 秒的时间内设置 Linux 容器,感谢
systemd-nspawn
。如果你确实想要一个 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