내 배포판은 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
이는 블록 장치 자체와 두 개의 심볼릭 링크입니다.
이것이 올바른 행동입니다!
일부 다른 서버(동일 배포)에서는 동작이 다릅니다. 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
그것이 문제이다! 링크는 두 개의 예상 링크를 연결한 것입니다. 왜 연결되어 있는지 모르겠습니다.
이 링크는 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"