mdadm --zero-superblock für alle Geräte eines Mdraid?

mdadm --zero-superblock für alle Geräte eines Mdraid?

Ich habe keine Möglichkeit gefunden, einen MDraid mit einem Befehl von einem Server zu entfernen.

Ich kann es stoppen übermdadm --stop /dev/md0

Der Superblock befindet sich aber noch immer in den Geräten.

mdadm --zero-superblock DEVICEbenötigt jedes Gerät (wie /dev/sdb1)

Ich weiß, was ich kann, mdadm --detail /dev/md0und dann sehe ich die Geräte.

Ich könnte ein fragiles Skript schreiben, um die /dev/sd...-Strings aus der Ausgabe von abzurufen mdadm --detail /dev/md0, aber ich möchte dies vermeiden.

Gibt es eine Einzeiler-Anleitung zum Entfernen des Superblocks von allen Geräten eines Mdraid?

Ich möchte es vermeiden, die Ausgabe von zu analysieren mdadm --detail, da diese instabil erscheint.

Antwort1

Wenn Sie die Array-Komponentengeräte kennen, können Sie einfach etwas ausgeben als

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

um den Superblock mit einem einzigen Befehl von mehreren Geräten zu entfernen.

Bitte beachten Sie, dass mdadmvor dem Nullsetzen geprüft wird, ob ein Superblock vorhanden ist. Geben Sie daher sd*im obigen Befehl ansollennur Komponentendisketten berühren, ohne etwas auf die anderen zu schreiben. Ichstarkraten davon ab, dies zu tun: alle Probleme bei der Superblock-Erkennung oder bei der Verwendung von --forcewerden gute Daten auf Nicht-Komponenten-Festplatten überschreiben (was zu Datenverlust führt). Von dermanpage:

Wenn das Gerät einen gültigen MD-Superblock enthält, wird der Block mit Nullen überschrieben. Mit --force wird der Block, in dem der Superblock wäre, überschrieben, auch wenn er nicht gültig zu sein scheint.

Aus dem oben genannten Grund schlage ich vor, wenn Sie die Array-Komponentengeräte nicht kennen, diese über aufzulisten

blkid -t TYPE="linux_raid_member" -o device

und dann die spezifischen Festplatten mit auf Null setzen mdadm --zero-superblock. Dies kann mit einem einzeiligen Bash-Befehl geskriptet werden:

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

Wie immer,Überprüfen Sie solche Befehle dreimal, um Datenverlust zu vermeiden.

BEARBEITEN:Um die Array-Komponentengeräte zu ermitteln, ohne die mdadm --detailAusgabe analysieren zu müssen, können Sie verwenden lsblk. Beispielsweise in einem über loopGeräte erstellten Test-Array:

# 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

Antwort2

Es gibt keinen einzigen Befehl ( mdadm …), der den Superblock von allen Geräten eines mdraid entfernt. Es ist jedoch ziemlich einfach, ein Skript zu schreiben, das dann zu einem Einzeiler wird:

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

Beispielverwendung, vorausgesetzt, das Skript wird aufgerufen mdzeround befindet sich im PATH usw. und das unerwünschte RAID-Gerät ist /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

Sofern Sie bei der Frage „Stoppen und löschen?“ nicht ein (großes) „J“ eingeben – oder der Befehl nicht interaktiv ausgeführt wird – wird das Tool an dieser Stelle beendet. Im Wesentlichen haben Sie über 20 Zeilen Plausibilitätsprüfung, um sicherzustellen, dass der aktive mdadm --zero-superblockBefehl nur ausgeführt wird, wenn und wo dies unbedingt beabsichtigt ist.

Antwort3

blkidMit ein wenig Fingerspitzengefühl können Sie dies erreichen .

Besorgen Sie sich zunächst das gewünschte RAID-Array.

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

Konvertieren Sie die UUID in ein geeignetes UUID-Format, und Sie können damit blkidalle Datenträgermitglieder herausziehen.

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

Wenn Sie einfach alle MDADM-RAID-Arrays sprengen möchten, müssen Sie keine weiteren Kennungen erfassen:

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

Um mit dieser Methode alles zu sprengen, können Sie sogar verwenden wipefs. Das könnte ungefähr so ​​aussehen...

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

Natürlich werden dadurch alle RAID-Arrays aller Festplatten auf Null gesetzt, ohne das jeweilige RAID-Array zu berücksichtigen. Ich habe ein hinzugefügt, -num zu verhindern, dass Benutzer beim Kopieren/Einfügen unvorsichtig werden!

verwandte Informationen