我发现没有办法用一个命令从服务器中删除 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
以防止人们在复制/粘贴时粗心大意!