我想在外部驱动器连接到计算机后立即自动安装 LVM 逻辑卷。
我在这里选择的解决方案是使用udev
检测插件事件和udisks2
挂载分区。对于其他替代方案,请参阅一种更通用的逻辑卷自动挂载方法
我想知道我的方法是否udev
注定udisks2
失败,或者我的成就是否失败。以下是我所有尝试的简要总结。
最简单的udev规则不起作用
在我看来,udev
规则似乎适合断言驱动器存在并UDISKS_AUTO
为给定分区设置,以便udisks2
可以自动挂载分区。因此我在自己的文件中创建了以下规则/etc/udev/rules.d/61-lvm-automount-lv.rules
SUBSYSTEM=="block"\
, ENV{ID_FS_UUID}=="<UUID of my LV>"\
, ENV{UDISKS_AUTO}="1"
然后我重新加载规则sudo udevadm control --reload
(或者更好地重新启动计算机),检查规则是否已读取并且 UDISKS_AUTO 对于给定分区设置为 1 sudo udevadm test /sys/devices/virtual/block/dm-1
,并确认在输出的末尾我可以看到UDISKS_AUTO=1
但是,当我拔出/插入外部磁盘时,分区不会自动安装。
我试图通过 找到有关问题所在的最大信息journactl
,udisksctl monitor
但唯一有用的消息来自于udevadm monitor --environment --udev
显示:
UDEV [3897.839040] change /devices/virtual/block/dm-1 (block)
.ID_FS_TYPE_NEW=ext4
ACTION=change
DEVLINKS=/dev/mapper/wdhdd0-wd0 /dev/disk/by-uuid/b32cefaa-041e-4ef7-8c82-fe53739aefff /dev/disk/by-label/wd /dev/disk/by-id/dm-name-wdhdd0-wd0 /dev/wdhdd0/wd0 /dev/disk/by-id/dm-uuid-LVM-hwQrCjWSOCCGpJqcdPv3NHaP3OOK6kFQj2Y6j3X51A69FEYNQeHtt8wVnVnlb93N
DEVNAME=/dev/dm-1
DEVPATH=/devices/virtual/block/dm-1
DEVTYPE=disk
DM_ACTIVATION=1
DM_COOKIE=6324838
DM_LV_LAYER=
DM_LV_NAME=wd0
DM_NAME=wdhdd0-wd0
DM_SUSPENDED=0
DM_UDEV_DISABLE_LIBRARY_FALLBACK_FLAG=1
DM_UDEV_PRIMARY_SOURCE_FLAG=1
DM_UDEV_RULES=1
DM_UDEV_RULES_VSN=2
DM_UUID=LVM-hwQrCjWSOCCGpJqcdPv3NHaP3OOK6kFQj2Y6j3X51A69FEYNQeHtt8wVnVnlb93N
DM_VG_NAME=wdhdd0
ID_FS_LABEL=wd
ID_FS_LABEL_ENC=wd
ID_FS_TYPE=ext4
ID_FS_USAGE=filesystem
ID_FS_UUID=b32cefaa-041e-4ef7-8c82-fe53739aefff
ID_FS_UUID_ENC=b32cefaa-041e-4ef7-8c82-fe53739aefff
ID_FS_VERSION=1.0
MAJOR=253
MINOR=1
SEQNUM=6641
SUBSYSTEM=block
TAGS=:systemd:
UDISKS_AUTO=1
USEC_INITIALIZED=5756122
因此,udisks2 似乎应该自动挂载此分区,UDISKS_AUTO=1
但事实并非如此。但是,我仍然可以执行udisksctl mount -b /dev/wdhdd0/wd0
,现在分区已手动挂载。
其他不起作用的规则
更改 的值,UDISKS_SYSTEM
因为逻辑卷可能会被解释为系统卷,因此默认情况下必须隐藏
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="b32cefaa-041e-4ef7-8c82-fe53739aefff", ENV{UDISKS_SYSTEM}="0", ENV{UDISKS_AUTO}="1"
添加一条规则以取消忽略包含带有 的逻辑卷的物理卷ENV{UDISKS_IGNORE}="0"
。我完全理解为什么物理卷必须隐藏而不是安装在文件系统中,但我认为逻辑卷可能会继承一些属性。
改变规则加载的顺序,需要改变61
文件名开头的数字61-lvm-automount-lv.rules
。要按照首先加载 udev 文件的顺序提前设置我的简单规则,需要IMPORT{builtin}="blkid"
在规则的开头添加到那些想要尝试的人。相反,我试图将简单的规则放在最后。
然而这些尝试并没有带来任何改进
我对 udev 的最后见解
我的最后一个想法是在成功安装 PV 后的正确时间udev
启动我用来手动安装 LV 的 shell 命令。/usr/bin/udisksctl mount -b /dev/wdhdd0/wd0
所以我天真地尝试了以下规则,991-mountthatstupidcomputer.rules
最后评估名称:
ACTION=="add"\
, SUBSYSTEM=="block"\
, ENV{ID_FS_UUID}=="<UUID of my PV>"\
, RUN{program}+="/usr/bin/udisksctl mount -b /dev/wdhdd0/wd0"
根据 udev 的手册页RUN
将程序添加到处理完特定事件的所有规则后要执行的程序列表中
所以应该已经完成了!但自动挂载再次失败,我可以在日志中看到原因。事实上,该脚本是在 udev 认为给定 PV 上的事件添加已完成后立即执行的。然而,这还没有考虑到dmsetup
我不知道的令人讨厌的事情。似乎所有 LVM 设置都被延迟,因此当 udev 执行我的脚本时,PV 尚未安装。在Ubuntu中,我可以在规则中找到dmsetup的用法:
- 55-dm.规则:52
- 95-dm-notify.规则:12
这就是我现在陷入困境的地方。可能有一个基于 dm_setup 似乎使用的 DM_COOKIE 的解决方案,但我在查看 dm_setup 手册时放弃了。在我看来,我已经深入挖掘了一个像安装分区这样简单的问题。我可能在某个地方错过了一些更简单的东西。另外,我想坚持使用标准工具,而不是在我的系统中编写太多脚本,这些脚本迟早会崩溃。
目标
最终,我希望我的系统可以自动安装给定的逻辑卷,就像通常安装标准(非 lvm)分区一样。我愿意接受任何有关最佳方法的建议。我用 udev 和 udisks2 来解决这个问题,因为它似乎在 Ubuntu 下的标准分区上做得很完美,所以我想为 LVM 实现同样的效果。
编辑
我/var/log/syslog
一开始就用最简单的规则插入磁盘后的权利:
[12766.403419] usb 1-1: new high-speed USB device number 9 using xhci_hcd
[12766.553014] usb 1-1: New USB device found, idVendor=1058, idProduct=1003
[12766.553020] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[12766.553024] usb 1-1: Product: External HDD
[12766.553029] usb 1-1: Manufacturer: Western Digital
[12766.553032] usb 1-1: SerialNumber: 57442D574D41565531333130343938
[12766.553817] usb-storage 1-1:1.0: USB Mass Storage device detected
[12766.554314] scsi host5: usb-storage 1-1:1.0
mtp-probe: checking bus 1, device 9: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1"
mtp-probe: bus: 1, device: 9 was not an MTP device
upowerd[2160]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0
upowerd[2160]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1
kernel: [12767.564246] scsi 5:0:0:0: Direct-Access WD 15EARS External 1.75 PQ: 0 ANSI: 4
kernel: [12767.565075] sd 5:0:0:0: Attached scsi generic sg1 type 0
kernel: [12767.565196] sd 5:0:0:0: [sdc] 2930277168 512-byte logical blocks: (1.50 TB/1.36 TiB)
kernel: [12767.565482] sd 5:0:0:0: [sdc] Write Protect is off
kernel: [12767.565487] sd 5:0:0:0: [sdc] Mode Sense: 23 00 00 00
kernel: [12767.565740] sd 5:0:0:0: [sdc] No Caching mode page found
kernel: [12767.565749] sd 5:0:0:0: [sdc] Assuming drive cache: write through
kernel: [12767.620230] sdc: sdc1
kernel: [12767.621669] sd 5:0:0:0: [sdc] Attached SCSI disk
systemd[1]: Starting LVM2 PV scan on device 8:33...
lvm[31988]: 1 logical volume(s) in volume group "wdhdd0" now active
systemd[1]: Started LVM2 PV scan on device 8:33.