mdadm 使用 512 字节块构建遗留数组

mdadm 使用 512 字节块构建遗留数组

我正在尝试使用 mdadm 构建一个数组。该数组具有 512 字节(不是千字节)大小的条带。由于 mdadm 接受以千字节为单位(而不是以字节为单位)的块参数,因此我无法正确构建此数组。

mdadm --build -n2 -c512 -lraid0 /dev/md0 /dev/sdb /dev/sdc

构建块大小为 512 KiB 的数组。

mdadm --build -n2 -c.5 -lraid0 /dev/md0 /dev/sdb /dev/sdc

返回错误。

有什么想法吗?我通常只是手动重建 RAID。但这个是 4TB 大。我可以将其重建为 LVM,但我希望避免这种情况。有什么想法吗?

答案1

我遇到了同样的问题,我通过我编写的一个小 Linux FUSE 程序解决了它。它的名字是突袭我戴上它Sourceforge

组装 RAID:

  • 下载并编译xraid
  • 运行:

    mkdir mnt ./xraid mnt 512 /dev/sdb /dev/sdc

  • 您现在应该能够在 mnt/xraid 下访问您的 RAID。

答案2

今天,我不得不从 2 个磁盘机箱中“取消 RAID-0”原始阵列。这是我用来从 2x1TB 驱动器(具有 1K(1024b)条带)构建 2TB 磁盘映像文件的脚本。根据需要进行修改。如果您有超过 2 个 RAID-0 磁盘,则需要复制并修改每添加一个磁盘将输出推进 1 个块的行;该行中已经包含额外的计数器。

格式化(如果愿意,可以使用 ksh 而不是 Bash):

#!/bin/bash

A=0; C=0; S=0; ERR=0
STRIPE=1024  # Stripe size in bytes (not KiB)
FN=raid_recovery.bin  # Output file name

while [ $ERR -eq 0 ]
  do

  # Copy from first device
  dd if=/dev/sdc of=$FN bs=$STRIPE seek=$C skip=$A count=1 conv=notrunc 2>/dev/null || ERR=1

  # Advance output by 1 block; copy from second device
  # For 3+ disks, copy-paste this line for every added disk and modify 'if=' for each
  [ $ERR -eq 0 ] && C=$((C + 1)) && dd if=/dev/sdk of=$FN bs=$STRIPE seek=$C skip=$A count=1 conv=notrunc 2>/dev/null || ERR=1

  # Update source, dest, and status delay counters
  A=$((A + 1)); C=$((C + 1)); S=$((S + 1))

  # Display current output position periodically
  [ $S -ge 256 ] && S=0 && echo -n $'\r'"$C blocks done"

done

单行版本:

A=0; C=0; S=0; ERR=0; STRIPE=1024; FN=raid_recovery.bin; while [ $ERR -eq 0 ]; do dd if=/dev/sdc of=$FN bs=$STRIPE seek=$C s
kip=$A count=1 conv=notrunc 2>/dev/null || ERR=1; [ $ERR -eq 0 ] && C=$((C + 1)) && dd if=/dev/sdk of=$FN bs=$STRIPE seek=$C skip=$A count=1 conv=notr
unc 2>/dev/null || ERR=1; A=$((A + 1)); C=$((C + 1)); S=$((S + 1)); [ $S -ge 256 ] && S=0 && echo -n $'\r'"$C blocks done"; done

相关内容