Mdadm

使用 GPT 分區的 mdadm RAID 實現

  • June 21, 2020

我目前的想法是創建一個軟體陣列,RAID-6 類,有 4 個成員驅動器,使用mdadm.

具體來說,驅動器將是小型伺服器戴爾 T20 中 SATA 上的 1 TB 硬碟驅動器。

作業系統為GNU/Linux Debian 8.6(後升級:JessieStretchBuster

在我的情況下,這將產生 2 TB 的磁碟空間和 2 TB 的奇偶校驗。


我還想將它與 GPT 分區表一起使用,為了讓它工作,我不確定如何具體進行,假設我更願意純粹在終端上執行此操作。

由於我從未創建過 RAID 陣列,您能否指導我應該如何進行?


筆記:

  • 該數組將僅用於唯一數據。沒有啟動或作業系統。
  • 由於這個陣列的目的,我選擇了 RAID-6。陣列必須能夠承受兩個驅動器故障。由於我被硬體限制為 4 個驅動器,因此我所知道的 RAID-6 沒有替代品。(不管 RAID-6 的減速看起來多麼醜陋,在這個陣列中都沒有關係。)

在這個答案中,明確表示所有陣列成員(驅動器)上的所有數據都將被銷毀,因此請先備份它!


打開終端變成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 EnterLinux 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命令,因為在大數組的情況下會花費大量時間,因此名稱為“ lazyinit ”,因此我推薦你為了避免這個:

mkfs.ext4 /dev/md0

相反,您應該強制進行完整的即時初始化(保留 0%,root因為它是一個數據數組):

mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 /dev/md0

通過指定這些選項,inode 和日誌將在創建期間立即初始化,這對於更大的數組很有用。

如果您選擇走捷徑並ext4使用“更好地避免命令”創建文件系統,請注意ext4lazyinit初始化所有 inode 將花費大量時間,您可以觀察它直到完成,例如使用iotopor nmon

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


我們現在為這個 RAID6 陣列創建一些目錄:

mkdir -p /mnt/raid6

只需安裝它:

mount /dev/md0 /mnt/raid6

由於我們基本上完成了,我們可以再次使用 GParted 來快速檢查它是否顯示linux-raid文件系統,以及raid所有驅動器上的標誌。

如果是這樣,我們正確地創建了帶有 GPT 分區的 RAID6 陣列,現在可以在其上複製文件。

查看md文件系統的 UUID:

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

引用自:https://unix.stackexchange.com/questions/318098