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进行少许操作即可完成此操作。

首先,获取您关心的突袭阵列。

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以防止人们在复制/粘贴时粗心大意!

相关内容