mdadm --zero-superblock para todos los dispositivos de un mdraid?

mdadm --zero-superblock para todos los dispositivos de un mdraid?

No encontré ninguna manera de eliminar un mdraid de un servidor con un solo comando.

Puedo detenerlo a través demdadm --stop /dev/md0

Pero el superbloque todavía está en los dispositivos.

mdadm --zero-superblock DEVICEnecesita todos los dispositivos (como /dev/sdb1)

Sé lo que puedo hacer mdadm --detail /dev/md0y luego veo los dispositivos.

Podría escribir un script frágil para recuperar las cadenas /dev/sd... de la salida de mdadm --detail /dev/md0, pero me gustaría evitar esto.

¿Existe una frase única para eliminar el superbloque de todos los dispositivos de un mdraid?

Me gustaría evitar analizar el resultado de mdadm --detail, ya que parece frágil.

Respuesta1

Si conoce los dispositivos que componen la matriz, simplemente puede emitir algo como

mdadm --zero-superblock /dev/sd[abcd]

para eliminar el superbloque de múltiples dispositivos con un solo comando.

Tenga en cuenta que mdadmcomprueba el superbloque antes de poner a cero cualquier cosa, por lo que especificarsd* en el comando anteriordeberíasólo toque los discos componentes, sin escribir nada en los demás. Sin embargo, yofuertementeSugerir no hacer eso: cualquier problema en el enrutamiento de detección de superbloques o el uso--force , sobrescribirá los datos buenos en discos que no son componentes (provocando pérdida de datos). Desde elpágina de manual:

Si el dispositivo contiene un superbloque md válido, el bloque se sobrescribe con ceros. Con --force el bloque donde estaría el superbloque se sobrescribe incluso si no parece ser válido.

Por el motivo anterior, si no conoce los dispositivos que componen el conjunto, le sugiero enumerarlos a través de

blkid -t TYPE="linux_raid_member" -o device

y luego poner a cero los discos específicos con mdadm --zero-superblock. Esto se puede programar con un comando bash de una sola línea:

for dev in `blkid -t TYPE="linux_raid_member" -o device`; do echo "zeroing $dev"; mdadm --zero-superblock $dev; done

Como siempre,Verifique tres veces dichos comandos para evitar la pérdida de datos.

EDITAR:Para descubrir los dispositivos que componen la matriz sin recurrir al análisis de mdadm --detailla salida, puede utilizar lsblk. Por ejemplo, en una matriz de prueba creada mediante 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

Respuesta2

No existe un solo comando ( mdadm …) que elimine el superbloque de todos los dispositivos de un mdraid. Sin embargo, es bastante sencillo escribir un guión que luego se convierta en una sola línea:

#!/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

Ejemplo de uso, asumiendo que se llama al script mdzeroy está en la RUTA, etc. y el dispositivo RAID no deseado es /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 ingrese una "Y" (mayúscula) en respuesta a la pregunta "¿Detener y borrar?" pregunta, o el comando se está ejecutando de forma no interactiva, la herramienta se cerrará en ese momento. Esencialmente, tiene más de 20 líneas de verificación de cordura para garantizar que el mdadm --zero-superblockcomando activo solo se ejecute cuando sea absolutamente previsto.

Respuesta3

Puedes utilizar blkidpara hacer esto con un poco de manipulación.

Primero, consigue el conjunto de incursiones que te interesa.

mdadm --detail /dev/md0
...
UUID : 8c9c9aa9:0c574535:e9080607:7ac4c6d8

Convierta el UUID a un formato UUID adecuado y podrá utilizarlo blkidpara extraer todos los miembros del disco.

blkid -t UUID=8c9c9aa9-0c57-4535-e908-06077ac4c6d8 --output device
/dev/nvme1n1p3
/dev/nvme0n1p3

Si solo desea destruir todas las matrices de raid mdadm, no necesita recopilar ningún otro identificador:

blkid -t TYPE="linux_raid_member" --output device
/dev/nvme1n1p2
/dev/nvme1n1p3
/dev/nvme0n1p2
/dev/nvme0n1p3

Para destruir todo usando este método, incluso puedes usar wipefs. Eso podría parecerse a...

blkid -t TYPE="linux_raid_member" --output device | xargs wipefs -n

Por supuesto, esto pondrá a cero todas las matrices de raid de todos los discos sin importar la matriz de raid en particular en cuestión. ¡Agregué un -npara evitar que las personas sean descuidadas al copiar y pegar!

información relacionada