Raid

mdadm 使用 512 字節塊建構遺留數組

  • September 3, 2021

我正在嘗試使用 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,但我希望避免這種情況。有任何想法嗎?

我有同樣的問題,我通過我寫的一個小 Linux FUSE 程序解決了它。它被命名為xraid,我把它放在Sourceforge 上

組裝 RAID:

  • 下載並編譯 xraid
  • 執行:

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

  • 您現在應該能夠訪問 mnt/xraid 下的 RAID。

今天我不得不從一個 2 磁碟機箱中“去 RAID-0”一個原始陣列。這是我用來從具有 1K (1024b) 條帶的 2x1TB 驅動器建構 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

引用自:https://serverfault.com/questions/290878