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

Tal*_*Kit 14 udev

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

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

小智 14

尽管 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
[…]
Run Code Online (Sandbox Code Playgroud)

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]"
Run Code Online (Sandbox Code Playgroud)

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

编辑: ali_m指出环境变量是由以前的规则设置的,因此只有在您的.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}"
Run Code Online (Sandbox Code Playgroud)

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

我使用 udev 而不是/etc/fstabudisks挂载设备的实际用例是挂载 zfs 文件系统,这些文件系统有一些特性,使它们不太适合常用工具。

  • 我花了一段时间才弄清楚的一个关键点:为了与环境变量匹配,必须在*设置这些变量之后*应用您的规则。为此,[您的`.rules` 文件名需要以大于 60 的数字开头](http://superuser.com/a/380431/156433)。 (2认同)
  • 在 Ubuntu 18.04 中,一些 udevadm 命令可以指向 /dev/sdXX(例如 udevadm info),其他的由于某种原因需要指向 /sys/block/sdXX(例如 udevadm test)。 (2认同)

小智 0

我脑子里浮现出一个粗略的解决方案。设置相应的由 UUID 标识的 fstab 条目。在 udev 规则中,mount -a每次添加新的 sd* 设备时都会执行。