如何使用 udev 在分区上设置 e2label?

如何使用 udev 在分区上设置 e2label?

我想在插入磁盘时自动为分区分配标签。我的任务方法是创建一个新的 udev 规则,如下所示:

KERNEL=="sd[a-z][0-9]", KERNELS=="ata[12]", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ext4", ENV{ID_FS_LABEL}=="", ACTION=="add", RUN+="/bin/sh -c 'sudo e2label %E{DEVNAME} TEST_LABEL'"

该规则检查文件系统是否为ext4,并且当前 e2label 是否为空:""。当满足 udev 规则中的所有条件时,sudo e2label %E{DEVNAME} TEST_LABEL将执行该命令。

这有效。有点儿?当我插入磁盘并使用 检查分配的标签时e2label,我发现它已被TEST_LABEL分配。但是,当我检查标签时lsblk -f,该LABEL部分是空的。我的其他检查标签的 udev 规则TEST_LABEL也不会触发,即使它们的优先级较低。如果我随后移除磁盘并再次插入,则当我运行 时标签将变得可见lsblk -f,并且其他 udev 规则现在会触发。

为什么是这样?我做错了什么和/或我不明白什么?

答案1

udev 不会读取每个操作/规则的标签,它在60-persistent-storage.rules使用时读取一次blkid,然后永远不会更新,除非设备发生更改。因此,更改标签后执行的规则仍然使用在 中获得的(现已过时的)值60-persistent-storage.rules。这也是lsblk看不到新标签的原因——lsblk使用 udev 数据库来获取这些信息,它不会探测设备(您必须使用blkid -p它)。因此,您要么需要在规则中重新探测设备,要么只是将ID_FS_LABEL和设置ID_FS_LABEL_ENC为新标签。

顺便提一句。通常,当您运行时,e2fslabel它会产生一个 udev 更改事件,因此 udev 将重新扫描设备 - udev 使用 inotify 来监视设备上的元数据更改,但如果您根据规则更改设备,则不会发生这种情况(否则可能会导致无限的错误)每次都会产生一个新的更改事件的更改事件循环)。

相关内容