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.