在 udev 规则中使用 UUID 并将 USB 驱动器挂载在 /media/$UUID 上

在 udev 规则中使用 UUID 并将 USB 驱动器挂载在 /media/$UUID 上

我想/media根据磁盘的 UUID 挂载 USB 驱动器。如何在 udev 规则文件中使用 USB 驱动器的 UUID,以及使用 UUID 号作为文件夹名称挂载 USB 驱动器的 udev 规则是什么。

blkid命令仅在安装时输出磁盘的 UUID。

答案1

尽管 udev 不能直接访问 UUID,但至少在 Fedora 和 Ubuntu 中,它们被设置为环境变量 ( ENV)。您可以通过调用 读取设备的所有环境变量udevadm info /dev/sdc。例如,对于外部驱动器上的 NTFS,我得到:

$ udevadm info /dev/sdc2
P: /devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host7/target7:0:0/7:0:0:0/block/sdc/sdc2
N: sdc2
[…]
E: ID_FS_TYPE=ntfs
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=4A6F2ABC1232FA37
[…]

前面带有 的所有内容E:都设置为环境变量。

与 UUID 匹配

你可以用 来匹配它ENV{ID_FS_UUID}=="4A6F2ABC1232FA37"。作为第一个过滤器,我匹配它KERNEL=="sd?2"以确保我只处理具有正确分区号的块设备。完整的规则如下所示:

KERNEL=="sd?2", ENV{ID_FS_UUID}=="4A6F2ABC1232FA37", RUN+="/usr/bin/logger --tag my-manual-usb-mount Mounting the device with UUID 4A6F2ABC1232FA37", RUN+="/usr/bin/mount [Your mount options here]"

logger 命令可用于断言规则是否实际运行。接下来,您应该使用 检查规则是否不包含任何语法错误udevadm test /dev/sdc2。您的规则文件应列在输出中,并且旁边不应出现任何错误消息。现在,您可以触发设备的所有规则,以检查规则是否按计划运行:sudo udevadm trigger /dev/sdc2。如果您的规则匹配,您将在系统日志中找到自定义日志消息(/var/log/syslog或通过journalctl -b)。

编辑: 阿里指出环境变量是由先前的规则设置的,因此只有当您的.rules文件具有足够高的字典顺序。以“60”开头就足够了。我个人以“zz”开头(如果可能的话),以便一眼就能将它们与预定义规则区分开来。

RUN在命令和其他地方使用 UUID

Udev 有相当强大的变量和属性替换语法。具体来说,每个出现的 都$env{ID_FS_UUID}将替换为驱动器的 UUID。因此,要将设备挂载在/media/UUID你可以使用这个规则:

KERNEL=="sd??", RUN+="/usr/bin/mkdir /media/$env{ID_FS_UUID}", RUN+="/usr/bin/mount $devpath /media/$env{ID_FS_UUID}"

你可能想配置 udisks,但它专门用于你想要解决的问题空间。请参阅https://wiki.archlinux.org/index.php/udisks#udisks2:_mount_to_.2Fmedia作为起点。

我使用 udev 而不是 udisks 安装设备的实际用例/etc/fstab是安装 zfs 文件系统,因为它们有一些特性,使它们不太适合通常的工具。

答案2

我想到了一个粗略的解决方案。设置相应的 fstab 条目,该条目由 UUID 标识。并在 udev 规则中,mount -a每次添加新的 sd* 设备时都执行。

相关内容