Bociek PLD - Pisarz
I. Informacje podstawowe
II. Instalacja
III. Podręcznik użytkownika
IV. Podręcznik administratora
Pamięci masowe
RAID programowy
V. Tworzenie PLD - Praktyczny poradnik
VI. O podręczniku
O tej książce
Spis treści
Inne wersje tego dokumentu
HTML (jeden plik)
Odnośniki
Tworzymy dokumentację PLD
Strona PLD
Listy dyskusyjne PLD

RAID programowy

<- ->
 

W systemie Linux istnieje możliwość tworzenia na dyskach programowych macierzy RAID poziomów 0, 1, 4, 5, 6, 10, 01. Służy do tego celu usługa mdadm. W przeciwieństwie do macierzy RAID sprzętowych które wymagają specjalnego kontrolera dysków (dość drogiego), macierze RAID programowe zakłada się na dyskach podłączonych do zwykłego kontrolera IDE, SATA lub SCSI i całą obsługę przekazuje do odpowiedniego oprogramowania (np: mdadm).

Macierze możemy zakładać zarówno na całych dyskach, jak i na odpowiednio przygotowanych partycjach, przy czym zakładanie na partycjach daje więcej możliwości konfiguracji. Zarówno korzystając z całych dysków jak i partycji należy pamiętać o tym że najmniejsza partycja lub dysk decyduje o wielkości zakładanej macierzy (miejsce ponad jest tracone), dlatego też należy raczej korzystać z takich samych rozmiarów dysków lub partycji.

Poniżej zamieszczono listę i opis dostępnych rodzajów macierzy dla mdadm, w nawiasach podano nazwy parametrów programu:

  • RAID 0 (raid0, 0, stripe) - striping czyli połączenie dwóch dysków (partycji) z przeplotem danych, zwiększa się wydajność w porównaniu z pojedynczym dyskiem, obniża odporność na awarie dysków - awaria jednego dysku to utrata wszystkich danych.

  • RAID 1 (raid1, 1, mirror) - kopie lustrzane, dyski są w dwóch jednakowych kopiach, w przypadku awarii jednego drugi przejmuje role pierwszego. Wydajność tak jak pojedynczy dysk, duże bezpieczeństwo, wadą jest duża strata pojemności (n/2 - n-liczba dysków w macierzy)

  • RAID 4 (raid4, 4) - dane są rozpraszane na kolejnych dyskach a na ostatnim zapisywane są dane parzystości, zwiększone bezpieczeństwo danych przy zachowaniu dużej pojemności (n-1). Wymaga przynajmniej trzech dysków, wydajność ograniczona przez dysk parzystości

  • RAID 5 (raid5, 5) - rozpraszane są zarówno dane jak i informacje o parzystości na wszystkich dyskach, dzięki czemu wydajność jest wyższa niż w RAID 4; pojemność n-1, wymaga przynajmniej trzech dysków.

  • RAID 6 (raid6, 6) - jest to rzadko stosowana, rozbudowana macierz typu 5. Jedyną różnicą jest dwukrotne zapisanie sum kontrolnych. Dzięki temu macierz może bez utraty danych przetrwać awarię dwóch dysków. Wymaga minimum czterech dysków, jej pojemność to n-2.

  • Tryb liniowy (linear) - czyli połączenie dwóch dysków w jeden w ten sposób że koniec pierwszego jest początkiem drugiego, nie zapewnia absolutnie żadnego bezpieczeństwa a wręcz obniża odporność na awarie dysków.

Najczęściej stosuje się macierze RAID1 i RAID5, do specyficznych zastosowań używa się RAID0, pozostałe są rzadziej spotykane.

Instalacja

Instalujemy następujące pakiety:

# poldek -i mdadm

A jeśli zaplanowaliśmy umieszczenie głównego systemu plików (/) na macierzy, musimy dodatkowo zainstalować pakiet mdadm-initrd:

# poldek -i mdadm-initrd

oraz możemy opcjonalnie dla dysków ATA przy korzystaniu z device-mapera zainstalować dodatkowo:

# poldek -i dmraid

Planowanie macierzy

Dosyć popularnym rozwiązaniem jest utworzenie identycznego zestawu partycji na każdym z dysków, a następnie spięcie odpowiednich partycji w macierze. Aby ułatwić sobie zadanie możemy najpierw podzielić jeden z dysków, a na następne urządzenia skopiować układ tablicy partycji np.:

# sfdisk -d /dev/sdc | sfdisk /dev/sdd

jak się łatwo domyśleć w powyższym przykładzie kopiujemy z dysku /dev/sdc na /dev/sdd.

Garść porad:

  • Kernel może być ładowany wyłącznie z macierzy RAID 1, jeśli więc będziemy chcieli używać np. RAID5 na głównym systemie plików to musimy umieścić gałąź /boot na osobnej, niewielkiej macierzy RAID1. Opis konfiguracji bootloadera do obsługi macierzy znajduje się w dalszej części artykułu.

  • Należy oprzeć się pokusie umieszczenia obszaru wymiany (swap) na RAID0, gdyż awaria jednego z dysków może doprowadzić do załamania systemu.

  • Urządzenia, z których składamy macierz powinny być równej wielkości, w przeciwnym razie wielkość macierzy będzie wyznaczana przez najmniejszą partycję.

Więcej informacji o podziale na partycje i planowaniu miejsca na dysku zdobędziemy w tym dokumencie.

Tworzenie macierzy RAID

Przystępujemy do zakładania macierzy na partycjach za pomocą polecenia mdadm:

mdadm -C {$dev_RAID} --level={$rodzaj} --raid-devices={$ilość_urzadzen} {$urzadzenia}

  • -C, --create - utwórz nową macierz.

  • -l, --level - ustaw poziom RAID np: linear, raid0, 0, stripe, raid1, 1, mirror, raid4, 4, raid5, 5, raid6, 6; Jak możemy zauważyć niektóre opcje są synonimami. Przy opcji Building pierwsze mogą być użyte: raid0, raid1, raid4, raid5.

  • -n, --raid-devices - liczba aktywnych urządzeń (dysków) w macierzy

  • -x, --spare-devices - liczba zapasowych (eXtra) urządzeń w tworzonej macierzy. Zapasowe dyski można dodawać i usuwać także później.

  • -v --verbose - tryb "gadatliwy"

  • --auto=yes - automatyczne tworzenie urządzeń w /dev/ przez mdadm (stosowane zwykle przy użyciu UDEVa), więcej w Poradach na końcu rozdziału.

Przykłady tworzenia macierzy różnego typu:

  • RAID0 na dwóch partycjach - /dev/sda1 i /dev/sdb1 jako /dev/md0

    # mdadm -C -v /dev/md0 --level=0 -n 2 /dev/sda1 /dev/sdb1

  • RAID1 na dwóch partycjach - /dev/sdc1 i /dev/sdd1 jako /dev/md1

    # mdadm -C -v /dev/md1 --level=1 -n 2 /dev/sdc1 /dev/sdd1

  • RAID5 na 4 partycjach w tym jedna jako zapasowa (hot spare), jeśli nie podasz ile ma być zapasowych partycji domyślnie 1 zostanie zarezerwowana na zapasową

    # mdadm -C -v /dev/md2 --level=5 -n 4 --spare-devices=1 \
    /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3

Konfiguracja

Po utworzeniu macierzy postępujemy z nią dalej jak z partycją, czyli zakładamy system plików i odwołujemy się do niej np: jako /dev/md0 np.:

# mkfs.xfs /dev/md0

Teraz możemy dokonać odpowiednich wpisów w pliku /etc/fstab.

Aby macierz była automatycznie składana przy starcie systemu musimy dodać odpowiednie wpisy do pliku /etc/mdadm.conf. Na początek dodajemy wiersz, w którym wymieniamy listę urządzeń z których budowane są macierze (można używać wyrażeń regularnych):

DEVICE /dev/sd[abcd][123]

Następnie dodajemy definicje macierzy, możemy to zrobić automatem:

# mdadm --detail --scan >> /etc/mdadm.conf:

lub samodzielnie, poprzez dodanie następujących wierszy:

ARRAY /dev/md0 devices=/dev/sda1,/dev/sdb1
ARRAY /dev/md1 devices=/dev/sdc1,/dev/sdd1
ARRAY /dev/md2 devices=/dev/sda3,/dev/sdb3,/dev/sdc3,/dev/sdd3

Macierze (inne niż rootfs) są składane przez rc-skrypt /etc/rc.d/rc.sysinit, na podstawie powyższych wpisów konfiguracyjnych, zatem po restarcie maszyny będziemy już z nich korzystać. Jeśli mamy macierz z głównym systemem plików, to musimy jeszcze przygotować initrd i bootloader (poniżej).

Przy ręcznym składaniu macierzy przydane może być polecenie skanujące urządzenia blokowe w poszukiwaniu istniejących macierzy:

# mdadm --examine --scan -v

Initrd

Jeśli główny system plików ma być na macierzy to musimy wygenerować obraz initrd z modułami, które pozwolą na złożenie macierzy. Na początek musimy mieć zainstalowany pakiet mdadm-initrd. Generowanie takiego initrd przebiega dokładnie tak samo jak dla zwykłego urządzenia blokowego, musimy się tylko upewnić, że do obrazu trafiły dodatkowo moduły: md-mod, odpowiednio raid0, raid1... i ewentualnie xor. Generowanie obrazu initrd szczegółowo zostało opisane w tym dokumencie.

Bootloader

Jeśli na raidzie ma się znaleźć główny system plików (bez /boot), to konfiguracja jest identyczna jak w przypadku klasycznych urządzeń blokowych.

Jeśli gałąź /boot ma się znaleźć na macierzy (wyłącznie RAID1) to powinniśmy zainstalować bootloader na każdym z dysków wchodzących w skład macierzy, dzięki czemu będziemy mogli uruchomić system mimo awarii jednego z dysków. RAID0 i RAID2-5 nie są obsługiwane przez LILO\GRUB

W LILO w pliku /etc/lilo.conf należy podać odpowiednie urządzenie dla opcji root i boot:

boot=/dev/md0
 raid-extra-boot=mbr-only
 
 image=/boot/vmlinuz
     label=pld
     root=/dev/md0
     initrd=/boot/initrd

Opcja w opcji raid-extra-boot wskazuje urządzenia na których ma zostać zainstalowany bootloader (urządzenia wchodzące w skład /dev/md0). Po zmodyfikowaniu konfiguracji musimy zaktualizować bootloader poleceniem lilo.

Jeśli używamy Grub-a wywołujemy z powłoki:

# grub
grub>

następnie szukamy gdzie znajdują sie pliki bootloadera,

grub>find /boot/grub/stage1

jeśli /boot jest oddzielną partycją to /grub/stage1 i otrzymujemy wynik, np:

(hd0,0)
(hd1,0)


Now you want to make sure that grub gets installed into the master boot
record of your additional raid drives so that if id0 is gone then the next
drive has a mbr loaded with grub ready to go.  Systems will automatically go
in drive order for both ide and scsi and use the first mbr and active
partitions it finds so you can have multiple drives that have mbr's as well
as active partitions and it won't affect your system booting at all.

So using what was shown with the find above and already knowing that hd0
already has grub in mbr, we then run:

Grub>device (hd0)/dev/sda (/dev/hda for ide)
Grub>root (hd0,0)
Grub>setup (hd0)

i to samo dla dysku drugiego czyli:

Grub>device (hd1) /dev/sdb (/dev/hdb for ide)
Grub>root (hd1,0)
Grub>setup (hd1)

Grub will then spit out all the commands it runs in the background of setup
and will end with a successful embed command and then install command and
end with .. succeeded on both of these commands and then Done returning to
the grub> prompt.

Notice that we made the second drive device 0.  Why is that you ask?
Because device 0 is going to be the one with mbr on the drive so passing
these commands to grub temporarily puts the 2nd mirror drive as 0 and will
put a bootable mbr on the drive and when you quit grub you still have the
original mbr on sda and will still boot to it till it is missing from the
system.

You have then just succeeded in installing grub to the mbr of your other
mirrored drive and marked the boot partition on it active as well.  This
will insure that if id0 fails that you can still boot to the os with id0
pulled and not have to have an emergency boot floppy.

Bootloadery szczegółowo opisaliśmy w tym dokumencie.

Diagnostyka

Skrócone informacje o macierzy:

# mdadm --query /dev/md0

Poniżej podałem przykłady dwóch poleceń, które pozwalają odczytać dokładne dane macierzy i jej stan:

# mdadm --detail /dev/md0

# cat /proc/mdstat

Porady

  • Mając dwie macierze RAID1 np: /dev/md0 i /dev/md1, możemy utworzyć macierz RAID10 (strip dwóch mirrorów) jako /dev/md2

    # mdadm -C -v /dev/md2 --level=1 -n 2 /dev/md0 /dev/md1

    analogicznie RAID01 tworzymy mając dwie macierze RAID0.

  • Aby samemu złożyć macierz (z np: PLD Live CD) wydajemy polecenie, które może wyglądać następująco:

    # mdadm -A /dev/md0 /dev/hda /dev/hdb

  • Jeśli macierz jest składana w trakcie startu systemu to automatycznie tworzony jest plik urządzenia /dev/mdX. W trakcie tworzenia macierzy, lub gdy macierz nie startuje wraz z systemem, możemy skorzystać z gotowych urządzeń w /dev (pakiet dev) lub samemu je utworzyć (pakiet udev). Udev nie tworzy urządzeń /dev/md0, więc musimy w tym celu użyć parametru --auto=yes w wywołaniach programu mdadm, lub utworzyć je poleceniem mknod. Urządzeniu nadajemy major o wartości 9 i kolejny, niepowtarzalny numer minor. Nie musimy się martwić o moduły, są on ładowane automatycznie przez mdadm lub initrd. Więcej o UDEV w tym dokumencie.

  • Wraz z pakietem mdadm dostarczany jest rc-skrypt uruchamiający mdadm w trybie monitorowania (jako demona). Więcej szczegółów w dokumentacji programu mdadm.

  • Migracja z pojedynczego dysku na RAID1

    Instalacja linuksa na raid1

    Naprawa zdegradowanej macierzy

Dodatki

Literatura:

 
<- ->