
我目前的想法是創建一個軟體陣列,RAID-6 類,具有 4 個成員驅動器,使用mdadm
.
具體來說,驅動器將是小型伺服器 Dell T20 中 SATA 上的 1 TB HDD。
作業系統是GNU/Linux Debian8.6(後來升級:傑西⟶拉緊⟶巴斯特)
在我的例子中,這將產生 2 TB 的磁碟空間和 2 TB 的奇偶校驗。
我還想將其與 GPT 分區表一起使用,為了使其工作,我不確定如何具體進行,假設我更願意純粹透過終端執行此操作。
由於我從未創建過 RAID 陣列,您能指導我如何進行嗎?
筆記:
此數組僅用於唯一的資料。其上沒有啟動或作業系統。
由於此陣列的用途,我選擇了 RAID-6。陣列必須能夠承受兩次驅動器故障。由於我的硬體限制為 4 個驅動器,據我所知,沒有 RAID-6 的替代方案。 (無論 RAID-6 的速度減慢看起來有多糟糕,在這個陣列中都無關緊要。)
答案1
在此答案中,請明確所有陣列成員(驅動器)上的所有資料都將被銷毀,因此請先備份!
打開終端機並成為root
(su
);如果你有sudo
啟用後,您還可以執行以下操作sudo -i
:看man sudo
對於所有選項):
sudo -i
首先,我們應該擦除驅動器,如果之前有任何資料和檔案系統的話。假設我們有 4 個成員:sdi
, sdj
, sdk
, sdl
。為了直觀地獲得此過程的回饋,pv
(管道觀察器)在這裡使用:
pv < /dev/zero > /dev/sdi
pv < /dev/zero > /dev/sdj
pv < /dev/zero > /dev/sdk
pv < /dev/zero > /dev/sdl
或者,要檢查是否沒有留下任何內容,您可以在所有驅動器上使用GParted 進行查看,如果有任何分區帶有或不帶有任何文件系統,則擦除它就足夠了,儘管我本人更喜歡上述將所有驅動器歸零的方法所涉及的驅動器,請記住在執行此操作之前卸載所有分區,可以類似於這些單行程式碼完成:
umount /dev/sdi?; wipefs --all --force /dev/sdi?; wipefs --all --force /dev/sdi
umount /dev/sdj?; wipefs --all --force /dev/sdj?; wipefs --all --force /dev/sdj
umount /dev/sdk?; wipefs --all --force /dev/sdk?; wipefs --all --force /dev/sdk
umount /dev/sdl?; wipefs --all --force /dev/sdl?; wipefs --all --force /dev/sdl
然後,我們使用 GUID 分區表 (GPT) 初始化所有驅動器,並且需要對所有驅動器進行分區,但不要使用 GParted 執行此操作,因為它會在此過程中創建一個我們不希望的檔案系統,使用gdisk
:
gdisk /dev/sdi
gdisk /dev/sdj
gdisk /dev/sdk
gdisk /dev/sdl
在所有情況下都使用以下內容:
o
Enter對於新的空 GUID 分割區表 (GPT),
y
Enter以確認您的決定
n
Enter對於新分割區
Enter對於第一個分割區的預設值
Enter對於第一個磁區的預設值
Enter對於最後一個磁區的預設值
fd00
Enter對於 Linux RAID 類型
w
Enter進行寫入更改
y
Enter以確認您的決定
現在您可以檢查驅動器:
mdadm --examine /dev/sdi /dev/sdj /dev/sdk /dev/sdl
應該說:
(type ee)
如果是,我們現在檢查分區:
mdadm --examine /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1
應該說:
No md superblock detected
如果是的話,我們可以建立 RAID6 陣列:
mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1
我們應該等到數組完全創建,這個過程我們可以輕鬆地watch
:
watch cat /proc/mdstat
創建數組後,我們應該查看它的詳細資訊:
mdadm --detail /dev/md0
應該說:
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
現在我們在陣列上建立一個檔案系統,如果您使用ext4
,則如下隱最好避免使用命令,因為ext4lazyinit
在大型數組的情況下會花費大量時間,因此得名“惰性初始化”,因此我建議您避免這種情況:
mkfs.ext4 /dev/md0
相反,您應該強制執行完整的即時初始化(保留 0%,root
因為它是資料數組):
mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 /dev/md0
透過指定這些選項,索引節點和日誌將在建立過程中立即初始化,這對於較大的陣列很有用。
如果您選擇採用快捷方式並ext4
使用「更好避免的命令」建立檔案系統,請注意,ext4lazyinit
初始化所有索引節點將花費大量時間,您可以觀察它直到完成,例如使用iotop
或nmon
。
無論選擇哪種方式進行檔案系統初始化,都應該在完成初始化後掛載它。
我們現在為此 RAID6 陣列建立一些目錄:
mkdir -p /mnt/raid6
並簡單地安裝它:
mount /dev/md0 /mnt/raid6
既然我們基本上已經完成了,我們可以再次使用 GParted 來快速檢查它是否顯示linux-raid
檔案系統以及raid
所有磁碟機上的標誌。
如果是這樣,我們就正確建立了具有 GPT 分割區的 RAID6 陣列,現在可以在其上複製檔案。
查看檔案系統的 UUID md
:
blkid /dev/md0
將 UUID 複製到剪貼簿。
現在我們需要用fstab
你最喜歡的文字編輯器進行編輯,我用過nano
, 儘管sudoedit
可能更好使用:
nano /etc/fstab
並新增一個條目:
UUID=<the UUID you have in the clipboard> /mnt/raid6 ext4 defaults 0 0
我自己不建議使用defaults
一組標誌,我只是希望該行不要太複雜。
以下是我在 UPS 備份資料 RAID 上使用的掛載標誌(而非defaults
): nofail,nosuid,nodev,noexec,nouser,noatime,auto,async,rw,data=journal,errors=remount-ro
儲存後可以檢查是否正確:
mount -av | grep raid6
應該說:
already mounted
如果是,我們儲存陣列配置;如果您還沒有md
建立任何設備,您可以簡單地執行以下操作:
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
如果數組已經存在,只需執行前面的命令而不重定向到設定檔:
mdadm --detail --scan
並手動將新數組新增至設定檔。
最後,不要忘記更新您的initramfs
,因為否則您的新數組將僅自動只讀彙編,可能如下/dev/md127
或類似:
update-initramfs -u -k all
檢查您是否按照計劃進行了所有操作,如果是,則可以重新啟動:
reboot
答案2
如果您在 4 個原始區塊裝置而不是 2 x 4 分割區上建立 RAID 陣列,則表示所有 RAID 復原作業可能必須在整個裝置上執行,反之亦然。
例如,如果您預期磁碟最終會在後半部開始出現 I/O 錯誤,且陣列位於分割區上,則表示只有一個陣列會注意到,而另一個陣列將繼續保持不變,至少直到傷害擴散到一半。這可能會為您提供一些臨時的靈活性,或者不會出現 I/O 減慢的情況。
另一方面,一旦您開始乾預,您就必須取出整個實體磁碟進行更換,因此您必須在某個時刻降低兩個陣列的效能。此外,對於 SSD,整個磁碟發生故障的情況顯然變得更加常見,因此兩個陣列無論如何都可能受到此類事件的影響。
對於在典型的分割區和 mdadm 文件中找不到的過程細節,沒有什麼可說的。