udevが2つのシンボリックリンクをリンクするのはなぜですか?

udevが2つのシンボリックリンクをリンクするのはなぜですか?

私のディストリビューションはSLES 12 SP 2です。

現在、DRBD(Distributed Replicated Block Device)を使用しています。以下はdrbdリソースの構成例です。

resource HA1dat {
  device /dev/drbd1;
  disk /dev/mqdat/HA1;
  meta-disk internal;
  on srv0 {
    address 192.168.174.10:7000;
    node-id 0;
  }
  on srv1 {
    address 192.168.174.11:7000;
    node-id 1;
  }
  on srv9 {
    address 192.168.174.19:7000;
    node-id 2;
  }
  connection-mesh {
    hosts srv0 srv1 srv9;
  }
}

このリソースが drbd デバイスとしてアクティブになると、通常、次のオブジェクトが作成されます。

brw-rw---- 1 root disk 147, 1 Feb 13 19:41 /dev/drbd1
lrwxrwxrwx 1 root root 14 Feb 13 19:41 /dev/drbd/by-res/HA1dat/0 -> ../../../drbd1
lrwxrwxrwx 1 root root 14 Feb 13 19:41 /dev/drbd/by-disk/mqdat/HA1 -> ../../../drbd1

これは、ブロックデバイス自体と2つのシンボリックリンクです。

これが正しい行動です!

一部の他のサーバー(同じ展開)では動作が異なります。 drbd リソースは非常に似て構成されます。

resource LN0N001Edat {
  device /dev/drbd1;
  disk /dev/data1vg/LN0N001E_lv;
  meta-disk internal;
  on sedcmmwd0030 {
    address xxx.yyy.zzz.83:7000;
    node-id 0;
  }
  on sedcmmwd0040 {
    address xxx.yyy.zzz.99:7000;
    node-id 1;
  }
  on sedcmmwd0050 {
    address xxx.yyy.zzz.100:7000;
    node-id 2;
  }
  connection-mesh {
    hosts sedcmmwd0030 sedcmmwd0040 sedcmmwd0050;
  }
}

リソースを有効にすると、ブロックデバイスとリンクのみが生成されます。

brw-rw---- 1 root disk 147, 1 Mar 2 09:49 /dev/drbd1
lrwxrwxrwx 1 root root 23 Mar 2 09:49 /dev/drbd/by-res/LN0N001Edat/0_drbd/by-disk/data1vg/LN0N001E_lv -> ../../../../../../drbd1

それが問題だ!リンクは、2つの予想されるリンクのリンクです。なぜ接続されているのかわかりません。

このリンクはudevによって作成されました。次の出力は、これらのノードでudevが実行する操作の違いを示しています。

正しく動作するサーバー

juser@srv0:~> udevadm info /dev/drbd1
P: /devices/virtual/block/drbd1
N: drbd1
S: drbd/by-disk/mqdat/HA1
S: drbd/by-res/HA1dat/0
E: DEVICE=drbd1
E: DEVLINKS=/dev/drbd/by-res/HA1dat/0 /dev/drbd/by-disk/mqdat/HA1
E: DEVNAME=/dev/drbd1
E: DEVPATH=/devices/virtual/block/drbd1
E: DEVTYPE=disk
E: MAJOR=147
E: MINOR=1
E: SUBSYSTEM=block
E: SYMLINK=drbd/by-res/HA1dat/0 drbd/by-disk/mqdat/HA1
E: TAGS=:systemd:
E: USEC_INITIALIZED=12263844870

サーバーに問題があります

root@sedcmmwd0030:/root : udevadm info /dev/drbd1
P: /devices/virtual/block/drbd1
N: drbd1
S: drbd/by-res/LN0N001Edat/0_drbd/by-disk/data1vg/LN0N001E_lv
E: DEVICE=drbd1
E: DEVLINKS=/dev/drbd/by-res/LN0N001Edat/0_drbd/by-disk/data1vg/LN0N001E_lv
E: DEVNAME=/dev/drbd1
E: DEVPATH=/devices/virtual/block/drbd1
E: DEVTYPE=disk
E: MAJOR=147
E: MINOR=1
E: SUBSYSTEM=block
E: SYMLINK=drbd/by-res/LN0N001Edat/0 drbd/by-disk/data1vg/LN0N001E_lv
E: TAGS=:systemd:
E: USEC_INITIALIZED=1212108486973

SYMLINKラインはまだ正確です。違いはDEVLINKSラインから始まります。

drbdのルールはどちらの場合も同じです。 cat /usr/lib/udev/rules.d/65-drbd.rules # このファイルには、名前付き DRBD デバイスを作成するためのルールが含まれています。

SUBSYSTEM!="block", GOTO="drbd_end"
KERNEL!="drbd*", GOTO="drbd_end"

IMPORT{program}="/sbin/drbdadm sh-udev minor-%m"

# Use symlink from the environment if available
ENV{SYMLINK}!="", SYMLINK="$env{SYMLINK}", GOTO="have_symlink"

# Legacy rules for older DRBD 8.3 & 8.4 when drbdadm sh-udev did not yet export SYMLINK
ENV{DISK}!="", SYMLINK+="drbd/by-disk/$env{DISK}"
ENV{RESOURCE}!="", SYMLINK+="drbd/by-res/$env{RESOURCE}"

LABEL="have_symlink"

ENV{DEVICE}=="drbd_?*", SYMLINK+="$env{DEVICE}"

LABEL="drbd_end"

間違ったリンクを生成する説明がある人はいますか?

答え1

DRBDのudevルールはdrbd-utilsから来ます。どのバージョンのDRBDユーティリティをインストールしましたか?

最新バージョン9.2.2には、問題を解決できると思われる追加のルールと開発者のコ​​メントが含まれています。

# This file contains the rules to create named DRBD devices.

SUBSYSTEM!="block", GOTO="drbd_end"
KERNEL!="drbd*", GOTO="drbd_end"

IMPORT{program}="@sbindir@/drbdadm sh-udev minor-%m"

# Use symlink from the environment if available
# some udev version thought it was a good idea to change a long established
# default of string_escape=none to string_escape=replace :-/
# therefore, recent enough drbdadm will no longer export space separated lists.
ENV{SYMLINK_BY_DISK}!="", SYMLINK+="$env{SYMLINK_BY_DISK}"
ENV{SYMLINK_BY_RES}!="", SYMLINK+="$env{SYMLINK_BY_RES}", GOTO="have_symlink"
ENV{SYMLINK}!="", OPTIONS+="string_escape=none", SYMLINK="$env{SYMLINK}", GOTO="have_symlink"

# Legacy rules for older DRBD 8.3 & 8.4 when drbdadm sh-udev did not yet export SYMLINK
ENV{DISK}!="", SYMLINK+="drbd/by-disk/$env{DISK}"
ENV{RESOURCE}!="", SYMLINK+="drbd/by-res/$env{RESOURCE}"

LABEL="have_symlink"

ENV{DEVICE}=="drbd_?*", SYMLINK+="$env{DEVICE}"

LABEL="drbd_end"

関連情報