Tworzenie macierzy dyskowych
Ostatnia zmiana: 2024-05-07 18:52
Dane cyfrowe mają co raz większe znaczenie w naszym życiu. Czy to będą fotografie rodzinne czy wspomnienia z naszych przygód, czy to będzie kolekcja filmów lub projekty nad którymi pracujemy, wszystkie te rzeczy wymagają przestrzeni gdzie mogą być składowane. Wiele elementów można umieścić w internecie w tzw.
chmurze, ale często potrzebujemy te dane mieć pod ręką lub są na tyle prywatne że nie chcemy ich przetwarzać w internecie.
Do przechowywania danych często używane jest urządzenia typu
NAS. Jednakże zapewne mamy już OpenWrt, więc możemy wykorzystać router do stworzenia własnej przestrzeni na dane. Najprościej jest podłączyć jeden nośnik (dysk, pendrive, kartę SD) do routera - bezpośrednio jak jest taka możliwość lub przez dedykowane adaptery np. na USB. Jednakże z czasem przychodzi potrzeba dodanie dodatkowej przestrzeni dyskowej lub zapewnienia większego bezpieczeństwa tych danych i w tym momencie wchodzi mechanizm tzw
RAID - połączenie nośników w jedną całość na kilka możliwych sposobów.
Co to jest RAID, jakie są jego typy i na czym to polega doskonale opisane jest w
Wikipedii. Jedną z cech RAID jest jego typ (poziom, ang
level). Najczęściej wykorzystywane są typy:
- RAID 0: jako połączenie przestrzeni dające dużą szybkość transferu i pojemność kosztem niezawodności
- RAID 1: jako kopia danych zabezpieczająca przez awarią jednego z nośników (należy pamiętać że TO NIE JEST BACKUP danych)
- RAID 5 lub 6: zwykle jako zalecane rozwiązane przechowywania danych
Oczywiście stosuje się także inne typy w zależności od potrzeb, zastosowania, ilości używanych dysków itp.
W systemach linuksowych macierze RAID realizuje się na drodze programowej, co umożliwia bezproblemowe przeniesienie dysków do innego systemu linuksowego i ponowne uruchomienie macierzy w przypadku awarii sprzętowej. RAID można złożyć z dowolnych nośników - dysków SATA, NVME czy nośników USB, choć oczywiście zaleca się żeby był to nośnik jak najbardziej odporny na uszkodzenia (więc nie karta SD, choć nic nie stoi na przeszkodzie żeby zrobić RAIDa z kart SD).
Opis przygotowany na OpenWrt 23.05.
Instalacja
Obsługą macierzy RAID zajmuje się program
mdadm.
# opkg update
# opkg install mdadm blkid
Domyślnie zainstalują się moduły związane z RAID 0, 1 oraz 10. Jeżeli chcemy używać innych typów należy także zainstalować odpowiednie moduły kernela np.
# opkg install kmod-md-raid456
Dodatkowo należy zainstalować pakiety odpowiedzialne za obsługę nośników i systemu plików, np. dla nośników podłączonych przez usb i systemu plików ext4:
# opkg install kmod-usb-storage kmod-fs-ext4 e2fsprogs
Pakiety należy dobrać stosowanie do używanego sprzętu.
Tworzenie macierzy
Upewniamy się że system widzi dyski które chcemy używać do stworzenia RAID'a. W przykładzie zostały wykorzystane cztery nośniki (pendrive) o pojemności 4GB każdy, podłączone do huba USB. Miały już partycje i widoczne były w systemie następująco:
# blkid
/dev/sdb1: UUID="C176-9772" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="5434b33c-01"
/dev/sdc1: UUID="C01D-1FA7" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="daf71ff5-01"
/dev/sdd1: UUID="C08E-92BE" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="7b0e744f-01"
/dev/sde1: UUID="C103-F38C" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="bbfe697f-01"
Dyski mogą ale nie muszą mieć partycji, ale nie mogą mieć danych - zostaną one zniszczone przy formatowaniu macierzy.
Jeżeli widzimy wszystkie nośniki to można przystąpić do tworzenia macierzy. Oczywiście typ należy wybrać stosowanie do własnych wymagać, tu zostaną zaprezentowane najpopularniejsze typy.
RAID 0
# mdadm --create --level=0 --raid-devices=4 /dev/md0 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: partition table exists on /dev/sdb
mdadm: partition table exists on /dev/sdb but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sdc
mdadm: partition table exists on /dev/sdc but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sdd
mdadm: partition table exists on /dev/sdd but will be lost or
meaningless after creating array
mdadm: partition table exists on /dev/sde
mdadm: partition table exists on /dev/sde but will be lost or
meaningless after creating array
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
Opcja
level określa typ macierzy, opcją
raid-devices - ilość nośników biorących udział w jej tworzeniu. Pojawiły się początkowe komunikaty ponieważ dyski miały już partycje.
Sprawdźmy czy macierz została utworzona
/dev/md0:
Version : 1.2
Creation Time : Sun May 5 13:31:00 2024
Raid Level : raid0
Array Size : 15144960 (14.44 GiB 15.51 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Sun May 5 13:31:00 2024
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : -unknown-
Chunk Size : 512K
Consistency Policy : none
Name : OpenWrt:0 (local to host OpenWrt)
UUID : aa105926:98869e27:6abc0fb3:5bffa589
Events : 0
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
lub
# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10]
md0 : active raid0 sde[3] sdd[2] sdc[1] sdb[0]
15144960 blocks super 1.2 512k chunks
unused devices: <none>
RAID 1
# mdadm --create --level=1 --raid-devices=2 /dev/md0 /dev/sdb /dev/sdc
mdadm: /dev/sdb appears to be part of a raid array:
level=raid1 devices=4 ctime=Sun May 5 13:35:23 2024
mdadm: partition table exists on /dev/sdb but will be lost or
meaningless after creating array
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
mdadm: /dev/sdc appears to be part of a raid array:
level=raid1 devices=4 ctime=Sun May 5 13:35:23 2024
mdadm: partition table exists on /dev/sdc but will be lost or
meaningless after creating array
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
Status macierzy:
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun May 5 13:37:51 2024
Raid Level : raid1
Array Size : 3786432 (3.61 GiB 3.88 GB)
Used Dev Size : 3786432 (3.61 GiB 3.88 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sun May 5 13:54:21 2024
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : OpenWrt:0 (local to host OpenWrt)
UUID : f296b631:56e38572:6a394e71:e3f527cb
Events : 17
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
lub
# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md0 : active raid1 sdc[1] sdb[0]
3786432 blocks super 1.2 [2/2] [UU]
unused devices: <none>
W tym przypadku po utworzeniu macierz potrzebuje trochę czasu żeby się zsynchronizować (nawet kilkanaście godzin w przypadku dysków o dużych pojemnościach!).
Automatyczne składanie macierzy
Po starcie systemu należy ponownie macierz "złożyć w całość" - czyli wskazać które dyski mają tworzyć jakąś macierz. Można to zrobić stosownymi argumentami programu
mdadm, ale w OpenWrt istnieje już odpowiedni mechanizm do tego, konfigurowany przez plik
/etc/config/mdadm.
Robimy:
# mdadm --detail /dev/md0 | grep UUID
powinien ukazać się jakiś UUID
# uci set mdadm.@array[0].uuid='tutaj UUID który wyszedł w pierwszym poleceniu'
# uci set mdadm.@array[0].device=/dev/md0
# uci commit mdadm
# /etc/init.d/mdadm restart
Macierz powinna się samodzielnie uruchomić po ostatnim poleceniu lub po restarcie systemu.
Montowanie nośnika
Mając już utworzoną macierz należy ja normalnie sformatować, np.
# mkfs.ext4 -m 0 /dev/md0
Można ją także automatycznie zamontować:
# block detect > /etc/config/fstab
Następnie należy znaleźć w pliku
/etc/config/fstab odpowiednią sekcję w urządzeniem /dev/md0 i zmienić opcję
enabled na 1.
Zatrzymanie działania macierzy
Jeżeli z jakiegoś powodu chcemy zatrzymać działanie macierzy należy ją odmontować i wydać stosowne polecenie:
# umount /dev/md0
# mdadm --stop /dev/md0
Oczywiście nie wyczerpuje to możliwości
mdadm - mamy możliwość zwiększania macierzy o kolejne dyski, wymiany uszkodzonego dysku i tego typu podobne operacje.