问题:在 Linux 启动期间,我想知道枚举所有块设备的某个时间实例。我假设块设备不是通过网络(如 iscsi)来的,而是通过 FC 来的,甚至可能是“多路径设备”。
我知道的:
如果编写一些脚本并将其设置为
kernel.hotplug=MyScript 并将其放置在 /etc/sysconfig/MyScript.modules 中(注意 .modules 扩展名)。
我将获取正在枚举的设备的 devpath 名称。
但这种方法效率不高。
示例:我想对块设备执行具有不同类型的签名。
但是,每当将任何块设备添加到系统时(特别是每当创建/删除任何 kobject 时),MyScript 都会被调用。
我想做的是:
启动序列中的另一个实例是,我知道所有连接的块设备都可用,这样我就可以找到我喜欢的块设备并用它们做我想做的事情。
另外,请注意,我不能等到启用 xyz.service,这在启动序列中已经很晚了。
编辑:假设没有 systemd。 Linux 使用旧的(init)启动方式。
答案1
$ systemctl status systemd-udev-settle
● systemd-udev-settle.service - udev Wait for Complete Device Initialization
Loaded: loaded (/usr/lib/systemd/system/systemd-udev-settle.service; static; vendor preset: disabled)
$ systemctl --reverse list-dependencies systemd-udev-settle.service
systemd-udev-settle.service
● └─dmraid-activation.service
$ systemctl cat dmraid-activation.service
# /usr/lib/systemd/system/dmraid-activation.service
[Unit]
Description=Activation of DM RAID sets
DefaultDependencies=no
Conflicts=shutdown.target
After=systemd-udev-settle.service
Before=lvm2-activation-early.service cryptsetup.target local-fs-pre.target shutdown.target
Wants=systemd-udev-settle.service
尝试从上面的 dmraid-activation.service 复制相关行。这包括DefaultDependencies=no
,因为您坚持尽早到达。它记录在man systemd.unit
(指systemd.service
。您还应该阅读man bootup
。