兼容systemd模式运行¶
思路¶
以sysmaster为1号进程,拉起systemd以非1号运行,并负责监控systemd的运行状态。
适配¶
基于openEuler 21.09构建systemd,需要适配systemd源码以支持非1号运行, 所有内容放在tools/run_with_sd下。
适配的代码放在tools/run_with_sd/patches目录,适配的systemd版本是systemd-248.13。
本次适配用于原型验证,故相关代码的修改皆以简单原则,满足功能验证即可。
适配中,部分问题未解决,规避处理。
- 运行systemd需要关闭selinux, /etc/selinux/config, enforcing to disabled
- shutdown中需要增加信号处理代码,用以处理非1号执行时接受子进程信号。当前直接跳过,不做处理。
- systemd从crash中恢复的适配,未考虑状态不可信的问题。因此构造crash的过程中,有概率systemd无法从crash中恢复。
- sysmaster具备监控保活的功能, systemd未实现
验证¶
至少有两种方式验证。
容器方式(在容器中非1号进程运行systemd)¶
- 使用patches目录下的适配代码编译systemd,并将输出的rpms,放在systemd-dockerimg/rpms目录下。
- 使用build.sh(systemd-dockerimg/build.sh)构建systemd的容器image。可以
chroot rootfs /bin/bash,通过password命令修改登录密码,然后执行build.sh更新镜像。 - 修改仓库根目录下的Dockerfile,修改
FROM scratch为FROM systemd, 去除#RUN rm -f /sbin/init注释 并在根目录下执行./docker-run.sh /usr/lib/systemd/systemd - 可另起窗口,执行
docker exec -it prun bash进入容器。
虚拟机方式(在虚拟机中非1号进程运行systemd)¶
- 安装21.09虚拟机镜像。
- 禁用selinux,/etc/selinux/config, enforcing to disabled
- 将systemd的rpms上传到虚拟机中,并执行
rpm -Fvh *.rpm安装升级。 - 将sysmaster中编译的init进程,替换到虚拟机/init, /sbin/init,建议先
rm /sbin/init删除init软链接,否则会覆盖systemd程序。 - 修改dracut,
/usr/lib/dracut/modules.d/00systemd/module-setup.sh, 替换
dracut -f覆盖更新initrd,reboot重启验证。
Last update:
September 21, 2023
Created: November 9, 2021
Created: November 9, 2021