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


13

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

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


1
警告:在使用systemd的现代桌面Linux系统上,udev规则不会在常规用户名称空间中挂载文件系统,即,您无法在udev规则中使用mount命令来挂载文件系统。此外,在这些系统中,保险丝(用户文件系统)系统配置为通过桌面图标处理USB安装,因此使用fstab规则手动安装在某种程度上与保险丝系统冲突。要通过UUID在无头服务器上自动挂载USB文件系统,最好删除systemd保险丝配置,并使用udev规则触发一次性安装服务。
乔纳森·本·阿夫拉罕

使用最近在Debian上测试过的fstab,systemd和automount来查看此解决方案:unix.stackexchange.com/a/347007/31228
Jonathan Ben-Avraham

Answers:


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
[…]

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)。

编辑: 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}"

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

我使用udev而不是/etc/fstabudisk 挂载设备的实际用例是挂载具有某些特质的zfs文件系统,使其不太适合通常的工具。


1
我花了一段时间才弄清楚一个关键点:为了与环境变量匹配,必须在设置这些变量之后应用规则。为此,您的.rules文件名必须以> 60开头
ali_m 2014年

@ali_m:谢谢,我已将您的信息添加到答案中。
英仙座

在Ubuntu 18.04中,某些udevadm命令可以指向/ dev / sdXX(例如udevadm信息),其他某些原因则需要指向/ sys / block / sdXX(例如udevadm测试)。
格雷格·贝尔

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.