我正在尝试使用 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