我有以下问题:我有一台运行 arch 的机器,并且在 LVM 中包含加密的 LV。在(加密的)LV 内有另一个 PV。所以我实际上有两个 VG:一个包含未加密的数据,另一个仅包含加密的数据。
我现在正在努力让事情顺利进行。我有脚本来扫描加密卷中的 PV 并安装东西。不幸的是,由于时间问题,这不能很好地发挥作用。
据我所知,当我调用pvscan
或磁盘时vgscan
,lvscan
会搜索 LVM 签名,如果找到,则激活新的 VG。到目前为止这有效。然后udev
收到通知并在 下创建不同的链接/dev
。不幸的是,这是异步发生的。因此,我的脚本继续运行,但没有找到检查/挂载文件系统所需的链接。
所以我的问题是:
- 是否可以等待
udev
所有链接生成并准备好使用? - 是否可以注册一个规则,
udev
该规则将调用所有链接作为参数/环境变量/...的脚本? - 是否可以注册与通过
udev
块设备本身生成的链接相匹配的规则? - 有没有办法等到
vgscan
& Co. 终止并udev
解决?
如果您有其他想法,我想听听。
答案1
您的设置有点不寻常(LVM 内的 LVM)。
一般来说,您应该尽可能依赖udev,而不是过多依赖您自己的脚本,即触发一个操作并让udev/systemd 以事件触发的方式处理其余的操作(而不是在某个脚本中顺序运行命令)!另请注意仅扫描您的设备而不是“所有内容”。
您还可以阅读69-lvm-metad.rules
并使用udevadm monitor
来了解发生了什么。
不过我也会回答你的一些问题。
为设备节点运行脚本
要运行脚本,您可以RUN
在 udev 规则中使用。请注意,这RUN
是异步的并且正在运行后规则已被处理(与 相比PROGRAM
)
ACTION=="add", KERNEL=="sdb", RUN+="/usr/local/bin/some_script"
udev 将根据您的 udev-event 中的变量,即等KERNEL
,使用环境变量调用您的脚本。ACTION
当然,您也可以匹配符号链接,但为了完成您的工作,我会与实际设备进行匹配,并可能进一步指定它,而不是依赖符号链接的名称。您可以使用它udevadm monitor --property
来查看不同的事件,包括它们的属性(唯一的 ID 等)。另请注意,链接会被附加,因此可能很难匹配(我自己没有检查过)。
SYMLINK
Match the name of a symlink targeting the node. It can be used once a SYMLINK key has been set in one of the preceding
rules. There may be multiple symlinks; only one needs to match.
等待处理 udev 事件
udevadm settle
将阻塞,直到处理完所有 udev 事件。它还具有用于超时或等待特定文件出现的参数,但对于您的用例,在不带参数的情况下运行它应该足够了。
udevadm settle [options]
Watches the udev event queue, and exits if all current events are handled.