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 DEVICE
necesita todos los dispositivos (como /dev/sdb1)
Sé lo que puedo hacer mdadm --detail /dev/md0
y 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 mdadm
comprueba 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 --detail
la salida, puede utilizar lsblk
. Por ejemplo, en una matriz de prueba creada mediante 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
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 mdzero
y 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-superblock
comando activo solo se ejecute cuando sea absolutamente previsto.
Respuesta3
Puedes utilizar blkid
para 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 blkid
para 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 -n
para evitar que las personas sean descuidadas al copiar y pegar!