udev 为 nvme 驱动器和分区创建重复的 /dev/disk/by-id 符号链接

udev 为 nvme 驱动器和分区创建重复的 /dev/disk/by-id 符号链接

最近,我注意到我的 NVME 驱动器中有额外的符号链接/dev/disk/by-id,并且重复项具有相同的名称并_1附加了名称。

# ls -lF /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW{,_1}
lrwxrwxrwx 1 root root 13 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW -> ../../nvme0n1
lrwxrwxrwx 1 root root 13 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1 -> ../../nvme0n1

(序列号无特殊原因大部分被编辑为 XXXXXXXX)

它还会复制 NVME 驱动器上所有分区的条目:

$ ls -lF /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1*-part*'
lrwxrwxrwx 1 root root 15 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root 15 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1-part3 -> ../../nvme0n1p3
lrwxrwxrwx 1 root root 15 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1-part4 -> ../../nvme0n1p4
lrwxrwxrwx 1 root root 15 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1-part5 -> ../../nvme0n1p5
lrwxrwxrwx 1 root root 15 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1-part6 -> ../../nvme0n1p6
lrwxrwxrwx 1 root root 15 Jul 29 19:22 /dev/disk/by-id/nvme-Samsung_SSD_970_EVO_500GB_S466XXXXXXXXXXW_1-part7 -> ../../nvme0n1p7

这只发生在我的 NVME 驱动器上,而不发生在我的 SATA 或 USB 闪存驱动器上。

我看不出有任何明显的东西/usr/lib/udev/rules.d/60-persistent-storage.rules可以做到这一点。

有谁知道为什么udev这样做?更重要的是,如何阻止它?

答案1

检查这些行/usr/lib/udev/rules.d/60-persistent-storage.rules

KERNEL=="nvme*[0-9]n*[0-9]", ENV{DEVTYPE}=="disk", ATTRS{nsid}=="?*", ENV{ID_NSID}="$attr{nsid}"
# obsolete symlink that might get overridden on adding a new nvme controller, kept for backward compatibility
KERNEL=="nvme*[0-9]n*[0-9]", ENV{DEVTYPE}=="disk", ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", \
  OPTIONS="string_escape=replace", ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}"
KERNEL=="nvme*[0-9]n*[0-9]", ENV{DEVTYPE}=="disk", ENV{ID_MODEL}=="?*", ENV{ID_SERIAL_SHORT}=="?*", ENV{ID_NSID}=="?*",\
  OPTIONS="string_escape=replace", ENV{ID_SERIAL}="$env{ID_MODEL}_$env{ID_SERIAL_SHORT}_$env{ID_NSID}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}"

第一个规则设置 NVMe 设备的 ID_NSID(命名空间 id?),比较head /sys/block/nvme*/nsid。第二条规则设置 ID_SERIAL 并创建常规disk/by-id/nvme-ID_SERIAL符号链接。第三条规则将 ID_NSID 附加到 ID_SERIAL 并创建“重复”disk/by-id/nvme-ID_SERIAL_NSID符号链接。

udevadm info /dev/nvme只会看到 ID_SERIAL 的 NSID 变体,因为第三条规则会覆盖第二条规则设置的内容。

它看起来有点令人困惑,但似乎正在按预期工作。如果你想摆脱它,你必须禁用上面引用的第三条 udev 规则。


在这个提交 c5ba7a2a @ github/systemd您还可以看到各个分区符号链接重复相同的规则,因此您必须在两个地方禁用它。

然而,这里的意图似乎是更喜欢 _1 链接而不是常规链接,因为这些链接......呃......命名空间安全? ;-)

我不确定这种方法,使用稍微不同的规则,您可以保护常规符号链接......这个补丁只是添加了新的符号链接,而没有解决原始问题,这有点奇怪。但我不太使用命名空间,所以……

相关内容