Xen*_*hic 6 linux init systemd
因此,长话短说,我试图让 systemd 与 Arch 安装一起工作,但没有从 init 运行 systemd。这意味着我正在启动一个没有运行 systemd 的系统,然后尝试在其上启动 systemd。
我面临的问题与 cgroups 有关 - 在启动期间,systemd 抱怨缺少 /sys/fs/cgroup/systemd 作为 cgroup,因此运行时功能减少,因为它认为 cgroups 不可用。这会导致任何使用 D-Bus 与 systemd 通信的工具出现问题。
正常运行 systemd(作为 PID 1 运行)cgroups 被正确创建并且 systemd 可以完全工作。但是,当它在已经启动的系统上运行时,不会创建 cgroup。我想知道在 init 过程中的哪个点是 /sys/fs/cgroup/systemd 创建/挂载,以及如何在已经运行的系统上复制它?我可以确认不是 /sbin/init 创建了 cgroup,因为运行它会产生相同的结果。
否则,我应该从哪里开始查看 systemd 的源代码?或者也许有一个邮件列表,我可以直接从开发人员那里得到更好的答案?
是的,所以在对 的源代码进行了一番挖掘之后systemd
,我找到了 systemd cgroup 的创建点。在src/core/main.c
内main()
的函数mount_setup_early()
被调用,但只有当systemd
正在作为PID 1且不在容器中。mount_setup_early()
在 中定义src/core/mount-setup.c
,并且只是挂载某些基本文件系统,例如/proc
,/dev
更重要的是/sys/fs/cgroup/systemd
.
我试图以systemd
PID != 1运行的事实意味着这个函数从未被执行过。因此,进一步向下main()
test_cgroups()
执行,并且由于/sys/fs/cgroup/systemd
未安装而失败。由于没有办法欺骗这个进程的 PID(或者至少,不是我知道或愿意尝试的),因此解决方案是在执行systemd
. 至少,这是理论。
这次冒险的另一个有趣的副作用是对命名层次结构如何与 cgroups 一起工作有了更多的了解。几乎没有可用于 cgroup 的文档,尤其是关于命名层次结构的工作原理。要以与安装方式类似的方式挂载命名层次结构systemd
,请运行:
mount -t cgroup cgroup -o none,name=<name> <mountpoint>
Run Code Online (Sandbox Code Playgroud)
这为您提供了一个完全空白的层次结构,类似于name=systemd
安装在 上的层次结构/sys/fs/cgroup/systemd
。如果要将子系统绑定到该层次结构,请替换none
为所需的子系统。
归档时间: |
|
查看次数: |
5404 次 |
最近记录: |