为设备节点运行脚本

为设备节点运行脚本

我有以下问题:我有一台运行 arch 的机器,并且在 LVM 中包含加密的 LV。在(加密的)LV 内有另一个 PV。所以我实际上有两个 VG:一个包含未加密的数据,另一个仅包含加密的数据。

我现在正在努力让事情顺利进行。我有脚本来扫描加密卷中的 PV 并安装东西。不幸的是,由于时间问题,这不能很好地发挥作用。

据我所知,当我调用pvscan或磁盘时vgscanlvscan会搜索 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 联机帮助页:

udevadm settle [options]
    Watches the udev event queue, and exits if all current events are handled.

相关内容