AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1143555
Accepted
guettli
guettli
Asked: 2023-09-12 23:30:06 +0800 CST2023-09-12 23:30:06 +0800 CST 2023-09-12 23:30:06 +0800 CST

mdadm --zero-superblock 适用于 mdraid 的所有设备?

  • 772

我发现无法使用一个命令从服务器中删除 mdraid。

我可以通过以下方式阻止它mdadm --stop /dev/md0

但超级块仍然在设备中。

mdadm --zero-superblock DEVICE需要每个设备(例如 /dev/sdb1)

我知道我能做到mdadm --detail /dev/md0,然后我就看到了这些设备。

我可以编写一个脆弱的脚本来从 的输出中获取 /dev/sd... 字符串mdadm --detail /dev/md0,但我想避免这种情况。

是否有一个单行程序可以从 mdraid 的所有设备中删除超级块?

我想避免解析 的输出mdadm --detail,因为这感觉很脆弱。

software-raid
  • 3 3 个回答
  • 98 Views

3 个回答

  • Voted
  1. Best Answer
    shodanshok
    2023-09-19T20:38:29+08:002023-09-19T20:38:29+08:00

    如果您知道阵列组件设备,您可以简单地发出以下命令

    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
    
    • 3
  2. roaima
    2023-09-13T17:21:24+08:002023-09-13T17:21:24+08:00

    没有一个命令 ( 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仅在绝对需要的情况下运行活动命令

    • 1
  3. Matthew Ife
    2023-09-19T16:35:20+08:002023-09-19T16:35:20+08:00

    您可以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以防止人们粗心地复制/粘贴!

    • 0

相关问题

  • 具有不同磁盘的 Linux RAID 5

  • USB 驱动器 RAID 阵列

  • windows 2003 软件 raid - 在没有 FT 软盘的情况下启动辅助磁盘

  • RAID - 软件与硬件

  • 用于 Windows 和 Linux 的 ICH9R 上的 RAID 配置和 3xHDD

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve