Minha distribuição é SLES 12 SP 2.
Eu trabalho com o DRBD (dispositivo de bloco replicado distribuído) agora. Aqui está um exemplo de uma configuração para um recurso do 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;
}
}
Após ativar este recurso como um dispositivo drbd, normalmente os seguintes objetos são criados.
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
Estes são o próprio dispositivo de bloco e dois links simbólicos para ele.
Este é o comportamento correto!
Em alguns outros servidores (mesma distribuição), o comportamento é diferente. A configuração do recurso drbd é muito semelhante.
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;
}
}
Após ativar este recurso, apenas o dispositivo de bloco e um link são criados.
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
Esse é o problema! Este link é uma concatenação dos dois links esperados. Eu não tenho ideia, porque eles são concatenados.
O link é criado pelo udev. A saída a seguir mostra as diferenças, o que o udev faz nesses nós.
Servidor com comportamento correto
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
Servidor com o problema
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
As linhas SYMLINK ainda estão corretas. As diferenças começam com as linhas DEVLINKS.
As regras para drbd são as mesmas em ambos os casos
cat /usr/lib/udev/rules.d/65-drbd.rules
# Este arquivo contém as regras para criar dispositivos DRBD nomeados.
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"
Alguém tem uma explicação para a criação do link errôneo?