为什么 by-partuuid 符号链接缺失或已过时?

loic

ceph-disk 脚本管理 Ceph 设备,并依赖于 /dev/disk/by-partuuid 目录的内容,该目录由 udev 规则更新。例如

  • 创建一个新分区,使用 /sbin/sgdisk --largest-new=1 --change-name=1:ceph data --partition-guid=1:83c14a9b-0493-4ccf-83ff-e3e07adae202 --typecode=1:89c57f98-2fe5-4dc0-89c1-f3ad0ceff2be -- /dev/loop4
  • 内核通过 partprobepartx 发出更改通知,并触发一个 udev 事件
  • udev 守护进程接收 UDEV [249708.246769] add /devices/virtual/block/loop4/loop4p1 (block),并且 /lib/udev/rules.d/60-persistent-storage.rules 脚本创建相应的符号链接。

假设分区表稍后被删除(例如使用 sudo sgdisk --zap-all --clear --mbrtogpt -- /dev/loop4),并且内核未通过 partprobepartx 发出通知。如果第一个分区再次创建并且内核如上所述发出通知,它将无法注意到任何差异,并且不会发送 udev 事件。因此,/dev/disk/by-partuuid 将包含一个过时的符号链接。
可以通过手动从 /dev/disk/by-partuuid 中删除陈旧的符号链接、清除分区表并再次通知内核来解决该问题。发送到 udev 的事件可以使用以下命令显示:

# udevadm monitor ... KERNEL[250902.072077] change /devices/virtual/block/loop4 (block) UDEV [250902.100779] change /devices/virtual/block/loop4 (block) KERNEL[250902.101235] remove /devices/virtual/block/loop4/loop4p1 (block) UDEV [250902.101421] remove /devices/virtual/block/loop4/loop4p1 (block) ...

可以显示用于块设备的环境和脚本:

# udevadm test /block/sdb/sdb1 ... udev_rules_apply_to_event: IMPORT '/sbin/blkid -o udev -p /dev/sdb/sdb1' /lib/udev/rules.d/60-ceph-partuuid-workaround.rules:28 udev_event_spawn: starting '/sbin/blkid -o udev -p /dev/sdb1' ...