我正在尝试通过添加 systemd 服务来自定义 centos7.6 initramfs,以便在调用 fsck 之前或理想情况下在创建 rootfs 设备后立即执行某些操作。我对如何配置 systemd 服务有经验,例如直接配置、.wants dir、生成器等,
但奇怪的是:所有的 systemd 经验都不起作用,
我很确定 initramfs(来自官方网站)正在使用systemd,你可以/init -> /usr/lib/systemd/systemd
在initramfs的解压文件中看到 。
lrwxrwxrwx 1 root root 7 Dec 9 21:49 bin -> usr/bin/
drwxr-xr-x 2 root root 4.0K Dec 9 21:49 dev/
-rw-r--r-- 1 root root 2 Dec 9 21:49 early_cpio
drwxr-xr-x 9 root root 4.0K Dec 9 21:49 etc/
lrwxrwxrwx 1 root root 23 Dec 9 21:49 init -> usr/lib/systemd/systemd*
drwxr-xr-x 3 root root 4.0K Dec 9 21:49 kernel/
lrwxrwxrwx 1 root root 7 Dec 9 21:49 lib -> usr/lib/
lrwxrwxrwx 1 root root 9 Dec 9 21:49 lib64 -> usr/lib64/
drwxr-xr-x 2 root root 4.0K Dec 9 21:49 proc/
drwxr-xr-x 2 root root 4.0K Dec 9 21:49 root/
drwxr-xr-x 2 root root 4.0K Dec 9 21:49 run/
lrwxrwxrwx 1 root root 8 Dec 9 21:49 sbin -> usr/sbin/
-rwxr-xr-x 1 root root 3.1K Dec 9 21:49 shutdown*
drwxr-xr-x 2 root root 4.0K Dec 9 21:49 sys/
drwxr-xr-x 2 root root 4.0K Dec 9 21:49 sysroot/
drwxr-xr-x 2 root root 4.0K Dec 9 21:49 tmp/
drwxr-xr-x 7 root root 4.0K Dec 9 21:49 usr/
drwxr-xr-x 3 root root 4.0K Dec 9 21:49 var/
虽然我最终添加了 dracut hook usr/lib/dracut/hooks/pre-mount/remove_fs_metadata_csum.sh
,但我仍然想知道我的 systemd 服务不起作用的原因是什么。
这是我对 initramfs 所做的:
+ rm -fr /root/initramfs.tmp
+ mkdir -p /root/initramfs.tmp/usr/lib/systemd/system/initrd-root-device.target.wants
+ cd /root/initramfs.tmp
+ sed 's/^ //g'
+ tee usr/lib/systemd/system/test.service
[Service]
ExecStartPre=bash -c -x 'echo ================hihi==========='
+ ln -s ../test.service usr/lib/systemd/system/initrd-root-device.target.wants/
++ uname -r
+ INITFAMFS_PATH=/boot/initramfs-3.10.0-957.27.2.el7.x86_64.img
+ cp /boot/initramfs-3.10.0-957.27.2.el7.x86_64.img.old /boot/initramfs-3.10.0-957.27.2.el7.x86_64.img
+ find . '!' -type d
+ cpio --format=newc --create --verbose
+ tee --append /boot/initramfs-3.10.0-957.27.2.el7.x86_64.img
./usr/lib/systemd/system/initrd-root-device.target.wants/test.service
./usr/lib/systemd/system/test.service
2 blocks
+ rm -fr /root/initramfs.tmp
它不起作用,我无法在下次重新启动时确认输出====hihi====。请注意,我在 initramfs 中附加了一个 cpio,这是设计使然,我已经成功地使用此方法添加了文件(例如 )usr/lib/dracut/hooks/pre-mount/remove_fs_metadata_csum.sh
或覆盖文件(例如usr/bin/fsck.ext4
.我也尝试过使用usr/lib/systemd/system/systemd-udevd.service.wants
但是不行。
也许我需要使用其他依赖项?例如sysinit.target?但我希望它在 systemd-fsck-root.service 之前执行。
抱歉,这是一个复杂且罕见的案例。有没有人知道为什么添加到 initramfs 的简单服务不起作用?
编辑:我还尝试了其他 systemd 体验,例如 drop-in conf,但都不起作用。