Linux 将SystemV init脚本移植到systemd

Linux 将SystemV init脚本移植到systemd,linux,systemd,Linux,Systemd,我正在通过定制的LinuxInit系统从SystemV移植到systemd。此init系统运行一个脚本,该脚本中断正常引导过程,以在绑定装载所选版本并继续引导过程之前处理某些固件版本控制 在SystemV设置中,我有/sbin/init call/etc/inittab(此时不存在/etc/rc)。然后,inittab将使用以下行启动自定义引导脚本: si:S:sysinit:/opt/pkg/var/oem/etc/init.d/boot 因为我的脚本需要在init进程的早期运行,所以我想我

我正在通过定制的LinuxInit系统从SystemV移植到systemd。此init系统运行一个脚本,该脚本中断正常引导过程,以在绑定装载所选版本并继续引导过程之前处理某些固件版本控制

在SystemV设置中,我有/sbin/init call/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.com是否需要此操作的正确位置


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

您有一个条件,即它应该在
sysinit.target
之前执行,但您将它放置在
sysinit.target.wants
中。如果希望将条件
保留在sysinit.target
之前,则应将其置于
default.target.wants
中。最好的方法是将其放置在
/usr/lib/systemd/system
中,并添加一个
[Install]
部分,其中包含一个条目
WantedBy=default.target
,或者如果您更喜欢
WantedBy=multi-user.target
。您可以将其保存在
sysinit-target中。您需要
但必须修改条件才能运行它。由于您从未提及脚本运行时需要运行什么和不应该运行什么,因此很难建议使用什么
Before=
After=
条件,您可以运行
systemctl list dependencies
。我很确定问题是缺少
DefaultDependencies=no
-这也意味着您确实需要手动指定确实需要的子集。此外,如果您正在进行绑定装载,您可能需要
.mount
单元-这会影响依赖项集。。。甚至可能systemd也会让它延迟加载?您有一个条件,即它应该在
sysinit.target
之前执行,但您将它放置在
sysinit.target.wants
中。如果希望将条件
保留在sysinit.target
之前,则应将其置于
default.target.wants
中。最好的方法是将其放置在
/usr/lib/systemd/system
中,并添加一个
[Install]
部分,其中包含一个条目
WantedBy=default.target
,或者如果您更喜欢
WantedBy=multi-user.target
。您可以将其保存在
sysinit-target中。您需要
但必须修改条件才能运行它。由于您从未提及脚本运行时需要运行什么和不应该运行什么,因此很难建议使用什么
Before=
After=
条件,您可以运行
systemctl list dependencies
。我很确定问题是缺少
DefaultDependencies=no
-这也意味着您确实需要手动指定确实需要的子集。此外,如果您正在进行绑定装载,您可能需要
.mount
单元-这会影响依赖项集。。。可能连systemd都会让它懒洋洋地加载?