Não encontrei nenhuma maneira de remover um mdraid de um servidor com um comando.
Eu posso pará-lo atravésmdadm --stop /dev/md0
Mas o superbloco ainda está nos aparelhos.
mdadm --zero-superblock DEVICE
precisa de todos os dispositivos (como /dev/sdb1)
Eu sei que posso fazer mdadm --detail /dev/md0
e então vejo os dispositivos.
Eu poderia escrever um script frágil para buscar as strings /dev/sd... da saída de mdadm --detail /dev/md0
, mas gostaria de evitar isso.
Existe uma linha única para remover o superbloco de todos os dispositivos de um mdraid?
Gostaria de evitar analisar a saída de mdadm --detail
, pois parece frágil.
Responder1
Se você conhece os dispositivos componentes da matriz, pode simplesmente emitir algo como
mdadm --zero-superblock /dev/sd[abcd]
para remover o superbloco de vários dispositivos com um único comando.
Observe que mdadm
verifica o superbloco antes de zerar qualquer coisa, especificando sd*
no comando acimadevetoque apenas nos discos componentes, sem escrever nada nos outros. No entanto, eufortementesugiro não fazer isso: quaisquer problemas no roteamento de detecção de superbloco, ou no uso --force
, substituirão dados válidos em discos não componentes (causando perda de dados). Depágina de manual:
Se o dispositivo contiver um superbloco md válido, o bloco será substituído por zeros. Com --force o bloco onde o superbloco estaria é sobrescrito mesmo que não pareça válido.
Pelo motivo acima, se você não conhece os dispositivos componentes do array, sugiro listá-los via
blkid -t TYPE="linux_raid_member" -o device
e depois zerar os discos específicos com mdadm --zero-superblock
. Isso pode ser programado com um comando bash de linha única:
for dev in `blkid -t TYPE="linux_raid_member" -o device`; do echo "zeroing $dev"; mdadm --zero-superblock $dev; done
Como sempre,verifique três vezes esses comandos para evitar perda de dados.
EDITAR:para descobrir os dispositivos componentes da matriz sem recorrer à análise da mdadm --detail
saída, você pode usar lsblk
. Por exemplo, em uma matriz de teste criada por meio de loop
dispositivos:
# lsblk -l -n -s /dev/md127
md127 9:127 0 255M 0 raid1
loop5 7:5 0 256M 0 loop
loop6 7:6 0 256M 0 loop
Responder2
Não existe um único comando ( mdadm …
) que irá remover o superbloco de todos os dispositivos de um mdraid. No entanto, é bastante simples escrever um script que se torne uma linha única:
#!/bin/bash
md=$1
[ ! -b "$md" ] && { echo "ERROR: Not a block device: $md" >&2; exit 1; }
# Collect the slices
slices=($(mdadm --detail "$md" 2>/dev/null | awk '/active/{print $NF}'))
[ ${#slices} -eq 0 ] && { echo "ERROR: No slices found for $md" >&2; exit 1; }
# Sanity check
if [ -t 2 ]
then
echo "Active MD RAID $md has slices: ${slices[*]}" >&2
if [ -t 0 ]
then
read -p 'Stop and erase (Y/n)? ' yn
[ ! "$yn" = 'Y' ] && exit 1
fi
fi
# Stop the array
echo "Stopping: $md" >&2
if ! mdadm --stop "$md"
then
echo "ERROR: Cannot stop: $md" >&2
exit 1
fi
# Erase the slices
for slice in "${slices[@]}"
do
echo "Zero: $slice" >&2
mdadm --zero-superblock "$slice"
done
# All done
exit 0
Exemplo de uso, assumindo que o script é chamado mdzero
e está no PATH, etc. e o dispositivo RAID indesejado é /dev/md1
:
mdzero /dev/md1
Active MD RAID /dev/md1 has slices: /dev/dm-2 /dev/dm-3 /dev/dm-4
Stop and erase (Y/n)? Y
Stopping: /dev/md1
mdadm: stopped /dev/md1
Zero: /dev/dm-2
Zero: /dev/dm-3
Zero: /dev/dm-4
A menos que você insira um "Y" (maiúsculo) em resposta à pergunta "Parar e apagar?" pergunta - ou o comando está sendo executado de forma não interativa - a ferramenta será encerrada nesse ponto. Essencialmente, você tem mais de 20 linhas de verificação de integridade para garantir que o mdadm --zero-superblock
comando ativo só seja executado se e onde for absolutamente pretendido
Responder3
Você pode usar blkid
para fazer isso com um pouco de manipulação.
Primeiro, obtenha o array de ataque que você deseja.
mdadm --detail /dev/md0
...
UUID : 8c9c9aa9:0c574535:e9080607:7ac4c6d8
Converta o UUID em um formato UUID adequado e você poderá usá-lo blkid
para extrair todos os membros do disco.
blkid -t UUID=8c9c9aa9-0c57-4535-e908-06077ac4c6d8 --output device
/dev/nvme1n1p3
/dev/nvme0n1p3
Se você deseja apenas destruir todos os arrays de ataque mdadm, não precisa coletar nenhum outro identificador:
blkid -t TYPE="linux_raid_member" --output device
/dev/nvme1n1p2
/dev/nvme1n1p3
/dev/nvme0n1p2
/dev/nvme0n1p3
Para explodir tudo usando esse método você pode até usar wipefs
. Isso poderia ser algo como ..
blkid -t TYPE="linux_raid_member" --output device | xargs wipefs -n
Obviamente, isso zerará todos os arrays raid de todos os discos, sem se preocupar com o array raid específico em questão. Eu adicionei um -n
para evitar que as pessoas sejam descuidadas ao copiar/colar!