mdadm --zero-superblock 適用於 mdraid 的所有裝置?

mdadm --zero-superblock 適用於 mdraid 的所有裝置?

我發現無法使用一個命令從伺服器中刪除 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]

使用單一命令從多個裝置中刪除超級區塊。

請注意,mdadm在將任何內容歸零之前會檢查超級區塊,因此請sd*在上面的命令中指定應該只接觸組件磁碟,而不向其他磁碟寫入任何內容。但是,我強烈地建議不要這樣做:超級區塊檢測路由或使用中的任何問題--force都將覆蓋非組件磁碟上的良好資料(導致資料遺失)。來自手冊頁

如果裝置包含有效的 md 超級區塊,則該區塊將被零覆蓋。使用 --force 時,超級區塊所在的區塊將被覆蓋,即使它看起來無效。

由於上述原因,如果您不知道陣列組件設備,我建議透過以下方式列出它們

blkid -t TYPE="linux_raid_member" -o device

然後使用 將特定磁碟歸零mdadm --zero-superblock。這可以使用單行 bash 命令編寫腳本:

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

一如既往,對任何此類命令進行三次檢查以避免資料遺失。

編輯:要在不解析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

沒有一個指令 ( mdadm …) 可以從 mdraid 的所有裝置中刪除超級區塊。然而,編寫一個腳本然後變成一行是相當簡單的:

#!/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”來回應“停止並擦除?”問題 - 或命令正在以非互動方式運行 - 該工具將在此時退出。本質上,您已經進行了 20 多行健全性檢查,以確保mdadm --zero-superblock僅在絕對需要的情況下執行活動命令

答案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以防止人們粗心地複製/貼上!

相關內容