mdraid のすべてのデバイスに対して mdadm --zero-superblock を実行しますか?

mdraid のすべてのデバイスに対して mdadm --zero-superblock を実行しますか?

1 つのコマンドでサーバーから mdraid を削除する方法が見つかりませんでした。

私はそれを止めることができますmdadm --stop /dev/md0

しかし、スーパーブロックはまだデバイス内に残っています。

mdadm --zero-superblock DEVICEすべてのデバイスが必要(/dev/sdb1など)

できるとわかってmdadm --detail /dev/md0から、デバイスを見ます。

の出力から /dev/sd... 文字列を取得する脆弱なスクリプトを作成することもできますmdadm --detail /dev/md0が、これは避けたいと思います。

mdraid のすべてのデバイスからスーパーブロックを削除するワンライナーはありますか?

の出力を解析するのmdadm --detailは脆弱な感じがするので避けたいと思います。

答え1

アレイのコンポーネントデバイスがわかっている場合は、次のように発行するだけで済みます。

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

1 つのコマンドで複数のデバイスからスーパーブロックを削除します。

mdadmは何かをゼロにする前にスーパーブロックをチェックするので、sd*上記のコマンドで指定することに注意してください。すべきコンポーネントディスクのみにアクセスし、他のディスクには何も書き込まない。しかし、強くスーパーブロック検出ルーティングや の使用に関する問題により--force、コンポーネント以外のディスク上の正常なデータが上書きされ、データ損失が発生するため、これを行わないことをお勧めします。マニュアルページ:

デバイスに有効な md スーパーブロックが含まれている場合、そのブロックはゼロで上書きされます。--force を使用すると、スーパーブロックが存在するブロックは、有効でないように見えても上書きされます。

上記の理由から、アレイ構成デバイスがわからない場合は、次のようにリストすることをお勧めします。

blkid -t TYPE="linux_raid_member" -o device

次に、特定のディスクを でゼロクリアしますmdadm --zero-superblock。これは、1 行の bash コマンドでスクリプト化できます。

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

いつものように、データの損失を避けるために、このようなコマンドは必ず 3 回確認してください。

編集:出力の解析に頼らずに配列コンポーネントデバイスを検出するにはmdadm --detail、 を使用できますlsblk。たとえば、loopデバイス経由で作成されたテスト配列では、次のようになります。

# 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

答え2

mdraid のすべてのデバイスからスーパーブロックを削除する単一のコマンド ( ) はありませんmdadm …。ただし、1 行で記述できるスクリプトを作成するのはかなり簡単です。

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

使用例では、スクリプトが呼び出されmdzero、PATH などにあり、不要な RAID デバイスが次のとおりであると想定しています/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

「停止して消去しますか?」という質問に(大文字の)「Y」を入力しない限り、またはコマンドが非対話的に実行されない限り、ツールはその時点で終了します。基本的に、アクティブなmdadm --zero-superblockコマンドが絶対に意図された場合にのみ実行されるように、20行以上の妥当性チェックが必要です。

答え3

blkid少し操作するだけでこれを実行できます。

まず、必要な RAID アレイを取得します。

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

UUID を適切な UUID 形式に変換すると、blkidすべてのディスク メンバーを取り出すために使用できるようになります。

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

すべての mdadm raid アレイを破壊したいだけの場合は、他の識別子を収集する必要はありません。

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

この方法を使用してすべてを爆破するには、 を使用することもできますwipefs。次のようになります。

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

もちろん、これは、問題の特定の RAID アレイを気にすることなく、すべてのディスクのすべての RAID アレイをゼロにします。-nコピー/貼り付けを不注意に行うことを防ぐために を追加しました。

関連情報