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

(シリアル番号は特別な理由なしにほとんどXXXXXXXXXに変更されます。)

また、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

この問題は、SATA または USB フラッシュ ドライブではなく NVME ドライブでのみ発生します。

/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。 2番目のルールはID_SERIALを設定し、汎用disk/by-id/nvme-ID_SERIALシンボリックリンクを作成します。 3番目のルールはID_NSIDをID_SERIALに追加し、「冗長」disk/by-id/nvme-ID_SERIAL_NSIDシンボリックリンクを作成します。

udevadm info /dev/nvme3番目のルールは2番目のルールセットをオーバーライドするため、ID_SERIALのNSIDバリアントのみが表示されます。

少し混乱しているようですが、期待どおりに動作しているようです。これを削除するには、上記の3番目のudevルールを無効にする必要があります。


これにc5ba7a2a@github/systemd コミットまた、個々のパーティションシンボリックリンクに対しても同じルールが繰り返されることがわかるため、両方の場所でそれらを無効にする必要があります。

しかし、ここでの意図は一般リンクより_1個のリンクを好むようです。これらのリンクは…ええ…名前空間安全だからです。 ;-)

このアプローチについてはよくわかりません。少し異なるルールを使用すると、一般的なシンボリックリンクを保護できます。このパッチは、元の問題を修正せずに新しいシンボリックリンクを追加するだけです。しかし、私は名前空間をあまり使わないので...

おすすめ記事