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
コピー/貼り付けを不注意に行うことを防ぐために を追加しました。