mdadm --zero-superblock para todos os dispositivos de um mdraid?

mdadm --zero-superblock para todos os dispositivos de um mdraid?

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 DEVICEprecisa de todos os dispositivos (como /dev/sdb1)

Eu sei que posso fazer mdadm --detail /dev/md0e 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 mdadmverifica 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 --detailsaída, você pode usar lsblk. Por exemplo, em uma matriz de teste criada por meio de loopdispositivos:

# 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 mdzeroe 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-superblockcomando ativo só seja executado se e onde for absolutamente pretendido

Responder3

Você pode usar blkidpara 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 blkidpara 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 -npara evitar que as pessoas sejam descuidadas ao copiar/colar!

informação relacionada