我正在将自定义Linux init系统从SystemV移植到systemd . 此init系统运行一个脚本,该脚本在绑定安装所选版本并继续启动过程之前,中断正常启动过程以处理某些固件版本控制 .

在我的SystemV设置中,我有/ sbin / init调用/ etc / inittab(此时没有/ etc / rc) . 然后,inittab将使用以下行启动自定义启动脚本:

si:S:sysinit:/opt/pkg/var/oem/etc/init.d/boot

由于我的脚本需要在init进程的早期运行,我想我会将它添加到sysinit.target.wants目录中 .

/lib/systemd/system/sysinit.target.wants/custom_init.service:

[Unit]
Description=Custom System Initialization Routine
ConditionFileIsExecutable=/etc/init.d/boot
Before=sysinit.target shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/init.d/boot

但是,当我启动系统时,我收到以下错误:

basic.target: Found ordering cycle on basic.target/start
basic.target: Found dependency on sysinit.target/start
basic.target: Found dependency on custom_init.service/start
basic.target: Found dependency on basic.target/start
basic.target: Breaking ordering cycle by deleting job custom_init.service.service/start
custom_init.service.service: Job custom_init.service.service/start deleted to break ordering cycle starting with basic.target/start
[ SKIP ] Ordering cycle found, skipping Custom System Initialization Routine

我认为.service文件应该在执行sbin / init(lib / systemd / systemd)后立即运行 . sysinit.target.wants是否为此操作提供了正确的位置?

有关如何重写此.service文件以执行与我的旧inittab相同的角色而没有此排序问题的任何想法?我想尽可能少地对引导脚本本身进行更改 .