使用 GPT 分割區的 mdadm RAID 實施

使用 GPT 分割區的 mdadm RAID 實施

我目前的想法是創建一個軟體陣列,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

在此答案中,請明確所有陣列成員(驅動器)上的所有資料都將被銷毀,因此請先備份!


打開終端機並成為rootsu);如果你有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初始化所有索引節點將花費大量時間,您可以觀察它直到完成,例如使用iotopnmon

無論選擇哪種方式進行檔案系統初始化,都應該在完成初始化後掛載它。


我們現在為此 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 文件中找不到的過程細節,沒有什麼可說的。

相關內容