Conectei um antigo RAID ARRAY a um novo sistema e recebo esse erro em tudo que tento fazer com ele mdadm
.
# mdadm --detail --scan
ARRAY /dev/md/arch1:2021 metadata=1.2 UUID=c4c7cbde:5f6913a9:eb1c82ff:8fe6cd45
# mdadm --detail
mdadm: Value "arch1:2021" cannot be set as devname. Reason: Not POSIX compatible. Value ignored.
mdadm: No devices given.
Tudo ainda funciona bem. Eu posso montar e usar o Array. E o nome "não compatível" aparece como um arquivo de dispositivo perfeitamente
# ls -la /dev/md/
total 0
drwxr-xr-x 2 root root 60 2024-08-09 03:16 .
drwxr-xr-x 20 root root 4580 2024-08-09 03:16 ..
lrwxrwxrwx 1 root root 8 2024-08-09 03:16 arch1:2021 -> ../md127
arquivo de dispositivo que eu posso usar
# mdadm --detail /dev/md/arch1\:2021
/dev/md/arch1:2021:
Version : 1.2
Creation Time : Wed Jul 7 06:29:08 2021
Raid Level : raid1
Qual é a melhor maneira de atualizar o nome da forma mais segura possível?
Este dois pontos separa o nome do host proprietário do nome do array :
<hostname>:<name>
. Ele é armazenado comoset_name
campo no superbloco MD 1.x (também suportado pelo formato de metadados externos DDF). É o superbloco a única fonte de verdade sobre o nome do array, nãomdadm.conf
. As entradas no último devem concordar com o que estiver armazenado no superbloco para que o sistema ative o array. A maneira mais fácil de gerar entradas corretas é usar a saída demdadm --examine --scan
. Ou simplesmente omita esse parâmetro de nome nas entradas, useARRAY /dev/mdN UUID=...
em vez disso e confie apenas em UUIDs do sistema de arquivos ou LVM ou quaisquer estruturas de nível superior que estejam em seus arrays.Ao criar, você fornece apenas a última parte, "nome", enquanto o nome do host é escolhido automaticamente, mas você também pode forçá-lo:
irá armazenar
arch1:2021
.Durante a ativação, se o nome de host do sistema atual for o mesmo que o armazenado, os links simbólicos em
/dev/md/
omitem o nome de host (parecendo exatamente como/dev/md/<name>
), e o incluem de outra forma, como é no seu caso. Você pode definirHOMEHOST hostname
emmdadm.conf
, para usar esse nome de host para remover dos nomes armazenados no superbloco, em vez do nome de host do sistema atual.Veja também esta resposta maravilhosa
Essa mensagem de erro foi introduzida no mdadm v4.3. Embora o desenvolvedor tenha admitido que é uma regressão em alguns casos, eles também deixaram claro que não vai desaparecer, então — apenas lide com isso, eu acho.
Além de caracteres especiais em nomes, o mdadm v4.3 também se ofende com números >127 . Isso foi generosamente estendido para 1024 em um patch recente — no entanto, antes do mdadm v4.3, você podia usar até 1048575 (o limite do kernel).
No seu caso, if
arch1:2021
não era para significar/dev/md2021
, mas usar 2021 como um nome, infelizmente é o caso que mdadm não distingue nome de host, número (de preferência menor) ou nomes em seus metadados link1 link2 . Tudo vai para uma única e mesma string de 32 bytes e fica sujeito à interpretação.Então, se você deseja usar nomes mdadm, o nome deve evitar todos os caracteres especiais, e também evitar ser numérico. Então, se possível, use exclusivamente az. Se você precisa usar dígitos, certifique-se de que não seja o primeiro caractere do nome (use
foo123
em vez de apenas123
).Os nomes mdadm (em metadados) só podem ser alterados em tempo de montagem. Se o array já estiver em execução, você terá que pará-lo primeiro, o que só pode ser feito se não estiver em uso, então realmente nunca, a menos que você inicialize um sistema de recuperação.
Então deveria ser assim, mas…:
Falha de segmentação??? Bem, obviamente isso não deveria acontecer ... esse bug (corrigido no git) só é acionado se você tiver
HOMEHOST <none>
definido em seu mdadm.conf, ou seu nome de host estiver vazio.Então, até que essa correção seja lançada, você está mais ou menos preso a
mdadm
incluir seu nome de host no nome do array. A menos quehostname:arrayname
seja maior que 32 bytes, já que os metadados não podem armazenar strings maiores.Então você pode trapacear passando um nome de host com 32 bytes de comprimento:
E vai sair assim:
Então, se você quisesse se livrar dele
arch1:
em seu nome, essa seria a única maneira de fazer isso por enquanto.Altere seu
/etc/mdadm.conf
para usar/dev/md0
(estilo numérico com números no intervalo,0-127
já que números maiores são rejeitados sem motivo). Ou use o estilo (symlink-)named/dev/md/name
com um nome não numérico.Ao montar arrays nomeados,
mdadm
escolherá um número por conta própria. Para cada número, o mdadm analisa/proc/mdstat
para verificar se ele já está em uso, até encontrar um livre — isso é bom para montar 3 arrays, menos bom para montar 300 arrays, já que o mdstat é analisado milhares de vezes então./dev/md/name
será então um symlink para/dev/md127
(ou outros números). O array nomeado também será mostrado como/dev/md127
abaixo/proc/mdstat
e esses números podem mudar, então leve isso em consideração ao gerenciar múltiplos arrays.Há também um terceiro estilo de nomenclatura:
Isso coloca o nome diretamente no nome do dispositivo como
/dev/md_name
. Isso é muito incomum, pois nenhum outro driver de dispositivo faz isso. Este também é o único estilo em que um nome é mostrado em/proc/mdstat
vez do número.No entanto, esse estilo é totalmente não documentado em
man 4 md
. Eman 5 mdadm.conf
desencoraja seu uso, pois outras ferramentas podem não esperar esse estilo. Portanto, ele deve ser evitado.No geral,
mdadm
ele tem um suporte terrivelmente ruim para nomes. Você não pode defini-los, não pode alterá-los sem muito esforço, omdadm
utilitário não os usa nem os mostra. Na verdade, ele não mostra nada, você deveria olhar em/proc/mdstat
vez disso, porquemdadm
ele mesmo não consegue nem mostrar uma lista bem impressa de arrays e seus estados.Isso está muito longe de como outros utilitários realmente ajudam você a gerenciar coisas e exibir nomes ao fazer isso, a ponto de ninguém se importar com números.