Slack na mirrorze (SoftRAID)
wersja 0.7
 

Spis treści

1. Był sobie dysk...
2. Wymagania

3. Plik konfiguracyjny
4. Instalacja nowego systemu
5. Przesiadka na mirror
6. Diagnostyka
7. Spokojnie, to tylko awaria

Posłowie


1. Był sobie dysk...

    Jest to jeden z najgorszych możliwych scenariuszy. Dostajesz telefon, że
coś jest nie tak. Co tym razem - zastanawiasz się - i nawet przez chwilę nie przychodzi
Tobie do głowy awaria twardziela. Myślisz o łączu od TPsa, które po raz dziesiąty w tym
miesiącu siadło, myślisz o braku prądu, włamie, ostatniej imrezie z kolegami (z której
i tak niewiele pamiętasz). Może niepotrzebnie dałeś hasło do roota żulowi na
dworcu PKP zakładając że nie wie o co chodzi ?
  No i zaczyna się - pożyczanie kasy na nowy dysk, szukanie ostatniej kopii zapasowej,
która i tak okazuje się uszkodzona, odbieranie telefonów od userów, szefa, wierzycieli...

Najbardziej awaryjnym elementem peceta (zaraz po zasilaczu w obudowach ATX) jest dysk
twardy. Jeśli system jest nowy, żałujemy sprzętu. Jeśli nasz serwerek chodzi już jakiś
czas, idą w cholerę dokumenty, poczta, konfigi i inne rzeczy które nie są backupowane :)
Tak czy siak czeka nas kupa roboty. Najlepszym wyjściem w tej sytuacji jest uruchomienie
naszego systemu na mirrorze (znanym jako "RAID-1"). Wszystkie dane są na bieżąco
zapisywane na dwóch (w naszym przypadku) dyskach. Awaria jednego z nich nie wpływa
na pracę całego systemu. Co więcej, możemy zdefiniować dodatkowy "wolny" (ang. spare)
dysk, który w momencie awarii jednego z pozostałych, przejmuje jego rolę.

O ile stworzenie mirrora dla poszczególnych partycji (np. /home) zostało dość
ładnie opisane w Software RAID Howto, zajmiemy się tutaj lustrzanką całego systemu.
Wszystko winno być skonfigurowane tak, że system bootuje się i pracuje normalnie
po fizycznej awarii twardziela. Dodam jeszcze, że za zarządzanie RAIDem w naszym
systemie odpowiadało będzie jajko (dlatego "soft"), nie potrzebujemy żadnego
dodatkowego sprzętu (a ja nie mam do takowego dostępu).

Całość opisywanych tutaj rzeczy testuje na Slackware 9.1 chodzącym na P200 z
64 MB RAM. Czysta moc :) Dyski, które zebrałem to zbieranina trzech jednoGigowych
dysków różnych producentów w różnych stanach technicznych. Oczywiście zaleca się
identyczne dyski i tak dalej.

Dokument możemy podzielić na dwie części: pierwsza opisuje instalację Slacka
na "nowym", czystym komputerze - chcemy system od razu instalować na mirrorze.
Cześć druga opisuje przejście z chodzącego, zainstalowanego już Linucha na
mirror (jest to część bardziej uniwersalna, powinna działać na innych dystrybucjach).


2. Wymagania

No cóż, potrzebne są dobre chęci, trochę czasu i paczka fajek.
Dodatkowo: pewne pojęcie o dyskach i kernelu. RAID nie jest dobrym
miejscem żeby zaczynać swoją przygodę z Linuxem, są to raczej
zaawansowane sprawy.

Narzędzia:
* kernel 2.4
Bez jajka ani rusz. Domyślne jajko Slacka 9.1 (wcześniejszych pewnie też)
posiada wkompilowane opcje obsługi RAID (dotyczy pierwszego przypadku),
nie ma problemu. W drugim przypadku należy je włączyć. Tak czy siak, osoby
które poważnie traktują swoje systemy mają jaja oraz odpowiednio
przystosowane jajko.

Jeśli chcesz się upewnić, że wszystko jest cacy, sprawdź czy istnieje plik
/proc/mdstat. Przypominam, że nie powinieneś mieć ładowanych modułów
jądra odpowiedzialnych za RAID, tylko statycznie wkomilowane (gwiazdka zamiast M :)
Polecenie dmesg powinno coś na temat RAID chociaż wspomnieć.

Oprócz jajka, potrzebny będzie pakiet raidtools.

OK. Jeśli instalujesz system na nowym sprzęcie, jesteś gotowy.
Jeśli chcesz przeskoczyć na RAID, przekompiluj jądro oraz zainstaluj
potrzebny soft.

Jeszcze o samym hardłer. Robimy mirror - dwa dyski pracują równolegle
i przechowują te same dane. Opcjonalnie trzymamy w pogotowiu trzeci dysk,
który w momencie awarii jednego z mirrorujących, przejmie jego rolę.
Tak więc dwa nasze główne, mirrorujące dyski podłączamy jako mastery
do dwóch różnych kanałów (IDE1 i IDE2). Jest to rozwiązanie zalecane
ze względu na szybkość (wydajność) oraz możliwość awarii jednego
z kontrolerów. Opcjonalny trzeci dysk podłączamy jako slave
gdziekolwiek, może być to IDE1 lub IDE2.


3. Plik konfiguracyjny

Dlaczego w tym miejscu o konfigu ? Ano przerabiamy dwa przypadki,
i opisywanie tych samych rzeczy w dwóch miejscach nie bardzo nam
odpowiada (tak, tak, Tobie też). Później umieszcze tylko przykłady,
teraz opis poszczególnych opcji.

Po podłączeniu dysków musisz wyczaić, jakie mają oznaczenia. W
klasycznym przypadku będą to /dev/hda (IDE1, master),
/dev/hdc (IDE2, master), /dev/hdd (IDE2, slave).
Jak widzisz, opiszemy przypadek dwóch mirrorów + jeden dysk
"awaryjny" będący w pogotowiu. Ten trzeci jest opcjonalny.
Do wyczajenia dysków możesz użyć polecenia dmesg.

Po utworzeniu mirrora operujemy w systemie na urządzeniach
MetaDevice: - sprzęt, który fizycznie nie istnieje.
Czyli jeśli połączymy /dev/hda2 z /dev/hdc2 w
mirrorze, otrzymamy np. /dev/md2 i na nim będzie chodził
nasz system.

Troche o partycjach. Ze względu na małą pojemność dysku, w
naszym przypadku podzielimy go tak:

/ (hda2, hdc2): 600MB
/home (hda3, hdc3): 200MB
Swap znajdował się będzie na /dev/hda1, /dev/hdc1, /dev/hdd1 niezależnie.
Mirrorowanie swapa nie ma sensu a przy odpowiedniej konfiguracji wydajność
trochę na tym zyska.

Czas na plik konfiguracyjny. Prawdę mówiąc jest to prosta sprawa...
Mowa o /etc/raidtab, zdefiniowane są w nim dyski, ich
partycje biorące udział w mirrorze oraz nasze MetaDevice.
Oto przykład /etc/raidtab dla naszego przypadku:

raiddev /dev/md0
    raid-level 1
    nr-raid-disks 2
    nr-spare-disks 1
    chunk-size 4
    persistent-superblock 1
     device /dev/hda2
     raid-disk 0
     device /dev/hdc2
     raid-disk 1
     device /dev/hdd2
     spare-disk 0

raiddev /dev/md1
    raid-level 1
    nr-raid-disks 2
    nr-spare-disks 1
    chunk-size 4
    persistent-superblock 1
     device /dev/hda3
     raid-disk 0
     device /dev/hdc3
     raid-disk 1
     device /dev/hdd3
     spare-disk 0

Zgodnie z założeniami konfig definiuje nam
root: /dev/md0 oraz /home: /dev/md1.
Te urządzenia trafią docelowo do /etc/fstab.
Te "meta-urządzenia" definiowane są w identyczny sposób, różnią się
jedynie cyferkami określającymi odpowiednie partycje. Przeróbmy
dla przykładu /dev/md1:

* raiddev /dev/md1
   Definiujemy urządzenie RAID o nazwie md1.
* raid-level 1
   Urządzenie to pracuje w mirrorze = RAID 1.
* nr-raid-disks 2
   Biorą w nim udział dwa dyski.
* nr-spare-disks 1
   I jeden "zapasowy". Opcjonalne.
   Jeśli nie masz trzeciego, wpisz 0 zamiast 1.
* chunk-size 4
   W przypadku RAID-1 wielkość "czanka" nie ma znaczenia.
   Wartość musi jednak być niezerowa, inaczej się wykrzaczy. Wpisz 4 i
   zapomnij o sprawie ("czank" to wielkość fragmentu rozkładana po różnych
   dyskach w innych typach RAID). W każdej chwili możesz czanka wyrzucić w ogóle.
* persistent-superblock 1
   Jeśli chcemy bootować z mirrora, na każdym dysku umieszczany
   jest zapis jego konfiguracji. Wpisz i zapomnij.
* device ...
   Urządzenie (dysk) ...
* raid-disk / spare-disk
   jest albo "głównym" urządzeniem RAID albo "zapasowym", używanym w
   przypadku awarii głównego. Numeracja zaczyna się od zera. Gdy nie masz
   zapasowego, pomijasz dwie ostatnie linijki.

I tyle na temat konfiga. Prosta sprawa. Prawdziwe wyzwanie to uruchomienie
tego w "pełnym" mirrorze - wszystkie partycje i bootowanie. Dobra, zaczynamy.


4. Instalacja nowego systemu

Rozważmy przypadek pierwszy, bardziej prosty: instalujemy nowy system.
Chcemy żeby chodził na pełnym RAID-1. Dodatkowo opisuje instalke z
trzecim, zapasowym dyskiem. Poniższe odnosi się do Slackware 9.1, w innych
może być podobnie (konfigurator Mandrake umożliwia wyklikanie myszką
mirrora :)).
Zakładam, że sprzęt jest już podłączony i BIOS wykrywa go należycie.
Umieszczasz płytke w napędzie, bootujesz z CDROMu, logujesz się jako
root. Jedziemy...
  • Każdy z dysków (także zapasowy) biorący udział w mirrorze należy
    podzielić na partycje mniej więcej tej samej wielkości (jeśli dyski są
    identyczne, możemy pokusić się o identyczne partycje). Tak więc
    (c)fdisk w obroty. Ważna uwaga: jako typ każdej partycji (nie dotyczy swap)
    wybieramy fd (Linux raid autodetect). Zapisujemy
    zmiany i wychodzimy, nie tworzymy jednak systemu plików.
    Rebootujemy system.

  • Dla przykładu podaje zrzut fdiska dla mojego hdc będącym
    docelowo drugim dyskiem mirrora. Pozostałe dwa są bardzo podobne:

    Disk /dev/hdc:
    /dev/hdc1 1 96 .... 82 Linux swap
    /dev/hdc2 * 97 388 .... fd Linux raid autodetect
    /dev/hdc3 389 486 .... fd Linux raid autodetect

    Jak widać pierwsza partycja przeznaczona jest na swap,
    druga, będąca bootowalną - na /, trzecia natomiast na /home.

  • Tworzymy plik /etc/raidtab zgodnie ze wskazówkami podanymi
    wyżej. Definiujemy więc nasz mirror. Nie pomyl partycji!

  • Tworzymy nasz RAID: wykorzystujemy polecenie mkraid
    W naszym przypadku:
       mkraid /dev/md0, mkraid /dev/md1
    Teraz fajna rzecz:
       od czasu do czasu wydaj polecenie cat /proc/mdstat

  • Teoretycznie nie musisz czekać na zakończenie synchronizacji mirrora.
    To chyba jednak nie zaszkodzi...

  • Plik /proc/mdstat cały czas zawiera informacje nt. naszego mirrora.
    Zaglądaj tam od czasu do czasu, w trakcie codziennej pracy.

  • Uruchamiasz setup. Instalka jak instalka (nie zapomnij pakietu raidtools).
    Swap zostanie uruchomiony na trzech dyskach równolegle (odpowiedz twierdząco na pytanie).
    Jako partycje docelowe (na root, /home itp.) wybierasz /dev/md...
    Slack 9.1 potrafi je z poziomu setup wykryc i odpowiednio zamontować.

    Czas na lilo.
    Po pierwsze, primo, lilo instalujesz w MBR. Po drugie, primo, partycja root
    powinna znajdować się na odpowiednim /dev/md... Po trzecie, primo, boot record
    powinien także wskazywać meta-device a więc /dev/md... U mnie wygląda
    to tak:
    .....
    boot = /dev/md0
    ....
    root = /dev/md0
    ....


    Pozostało dopisać do lilo.conf dodatkową opcję, która spowoduje,
    że lilo zostanie zapisane na jednym i drugim dysku biorącym udział
    w mirrorze. Umożliwi to poprawne uruchomienie naszego systemu nawet wówczas,
    gdy padnie primary master. Zakończ instalację, nie rebootuj kompa.

    Należy teraz wyedytować plik /mnt/etc/lilo.conf, dopisać do niego
    dodatkową opcję raid-extra-boot. W naszym przypadku będzie to:
    raid-extra-boot=/dev/hda,/dev/hdc
    Następnie wykonaj lilo -r /mnt -C /etc/lilo.conf. Powinno być dobrze.
    Powinieneś zobaczyć, jak lilo uaktualnia (w tym przypadku) hda, hdd, md.

    Jeszcze jedna uwaga na koniec - ostatni krok możesz pominąć, zapomnieć o nim, cokolwiek.
    W każdej chwili możesz dopisać ten ekstra parametr do lilo.conf oraz przeładować
    lilo.

  • Na zakończenie skopiuj /etc/raidtab na /mnt/etc/raidtab
    ponieważ ten pierwszy znajduje się na RAM-dysku. No to co, reebocik ? Tia!

To by było tyle. System powinien się podnieść.
W opisywanym przypadku wystartował bez problemów, chodził na md0 i md1,
swapował natomiast po hda1, hdc1, hdd1.

Słów kilka na temat swap.
Swap pracuje najwydajniej na kilku dyskach równolegle.
A ponieważ mamy do dyspozycji kilka dysków, dlaczego nie wykorzystać tego faktu ?
Przy instalacji systemu, różne dyski biorące udział w słapowaniu mają różne
priorytety. Aby to zobaczyć, w czasie normalnej pracy systemu (po reboocie, po instalacji)
wydaj polecenie swapon -s. Aby zmienić priorytety wystarczy do pliku /etc/fstab
(po wyjściu z instalatora Slacka w czasie instalacji /mnt/etc/fstab) dodać wpis
w sekcjach dotyczących swapa. Zwykły wpis, np.
/dev/hda1     swap     swap     defaults     0 0
wystarczy zastąpić takim:
/dev/hda1     swap     swap     defaults,pri=1     0 0

Czyli przy każdej partycji typu swap wystarczy dopisać pri=1. Po następnym
reboocie (lub np. wydaniu polecen swapoff -a oraz swapon -a) wynik polecenia
swapon -s powinien pokazać takie same priorytety dla swapowanych dysków.

Przejrzyj komunikaty startowe systemu, naciesz się widokiem chodzącego RAIDa,
ponieważ od tej chwili Twój system jest prawie dwa razy bardziej niezniszczalny :)


5. Przesiadka na mirror

Mamy dany serwerek z systemem pracującym na jednym dysku. Celem jest przesiadka na mirror.
Taki z dwoma dyskami, jak podpiąć ew. "wolny" dysk opisałem gdzieś niżej.
Nasz Linux chodzi na /dev/hda, który wygląda tak (fragment /etc/fstab):

/dev/hda1       swap       swap       ...
/dev/hda2       /       reiserfs       ...
/dev/hda3       /home       reiserfs       ...

Do maszyny został podpięty /dev/hdd: secondary slave (miał być master ale
popieprzyłem zworki, nieważne). Ważne, że secondary.

Dobra, mamy system chodzący na jednym dysku, chcemy na dwóch. Drugi dysk został podpięty.
Nowy, czysty dysk należy teraz podzilić na partycje w podobny sposób, w jaki podzilony
jest pierwszy, ten z chodzącym systemem. Informacje te wyświetli nam fdisk -l /dev/hda.
Uruchamiamy fdisk (lub inny program) i dzielimy nasz nowy dysk pamiętając o tym,
by wszystkie partycje oprócz swap były typu Linux raid autodetect.
Po wykonaniu partycjonowania, fdisk -l /dev/hdd wygląda tak:

/dev/hdd1       .........     82       Linux swap
/dev/hdd2   *   .......     fd       Linux raid autodetect
/dev/hdd3       ......       fd       Linux raid autodetect

Czyli dwa nasze dyski mają podobny układ partycji.
Kolejnym krokiem jest stworzenie pliku /etc/raidtab. Jednyną rzeczą wartą uwagi jest
to, że partycje na których chodzi nasz system oznaczone były jako failed-disk a
nie raid-disk. W ten sposób nie zostanie na nim namieszane, jajco potraktuje go
jak uszkodzony dysk, i dobrze - nie chcemy stracić naszego systemu. Powolutku.
Tak wygląda nasz gotowy /etc/raidtab:

raiddev /dev/md0
    raid-level 1
    nr-raid-disks 2
    nr-spare-disks 0
    chunk-size 4
    persistent-superblock 1
     device /dev/hda2
     failed-disk 0
    
device /dev/hdd2
     raid-disk 1
    
raiddev /dev/md1
    raid-level 1
    nr-raid-disks 2
    nr-spare-disks 0
    chunk-size 4
    persistent-superblock 1
     device /dev/hda3
     failed-disk 0
    
device /dev/hdd3
     raid-disk 1
    
Następnie tworzymy meta-urządzenia /dev/md.. oraz zakładamy na nich system
plików. Ponieważ nasz systemowy dysk jest failed, nie stracimy danych.

mkraid /dev/md0
mkraid /dev/md1

W tej chwili /proc/mdstat powinien pokazać "uszkodzoną" macierz.

mkreiserfs /dev/md0
mkreiserfs /dev/md1

Podsumujmy: mamy "mirror" z jednym działającym dyskiem, należy na niego przerzucić
dane z drugiego dysku, będącego systemowym i zarazem częścią mirrora. Nieźle :)

Kolejnym krokiem jest przeniesienie struktury katalogów z obecnego dysku na nowy,
przyszły mirror. Znaczy się, należy skopiować pliki i katalogi i takie tam inne
dziwne rzeczy. Zatrzymaj w tej chwili jak najwięcej usług chodzących w Twoim
systemie (serwer plików, www, poczty, bla bla bla). Tak będzie lepiej.
Dobra, przpominam, że miejscem docelowym jest macierz (jeszcze nie jest w pełni
sprawna ale o tym za chwilę). Teraz na naszej macierzy próbujemy odtworzyć
przyszły system plików. Powinieneś czaić o co chodzi:

mkdir /mnt/mirror
mount -t reiserfs /dev/md0 /mnt/mirror
mkdir /mnt/mirror/home
mount -t reiserfs /dev/md1 /mnt/mirror/home

Utworzyliśmy sobie katalog /mnt/mirror, który od tej pory traktujemy jako
root naszego nowego systemu. Jest on zainstalowany na /dev/md0 czyli
na RAIDzie. Na /home przeznaczyliśmy osobną partycję, /dev/md1, dlatego
jest ona podmontowana w tymże miejscu. Jeśli planujesz więcej partycji, robisz
analogicznie.

Należy teraz przerzucić pliki z /dev/hda na macierz. Hir łi goł:

cd /
find . -xdev | cpio -pm /mnt/mirror

Dane trafiły na mirror. Ponieważ dysk źródłowy widziany jest przez jajko jako uszkodzony,
nie jest na nim nic zapisywane. Za chwilę to odkręcimy. Najpierw musimy jednak
skonfigurować system tak, aby od następnego reboota pracował na macierzy. Wystarczą zmiany
w pliku - uwaga - /mnt/mirror/etc/fstab. Oto jak wygląda ten plik po zmianach (przed
nimi - kilka linijek wyżej):

/dev/hda1       swap       swap       ...
/dev/hdd1       swap       swap       ...
/dev/md0       /       reiserfs       ...
/dev/md1       /home       reiserfs       ...

Od razu zajmijmy się lilo, bez tego mogą być później problemy. W skrócie -
zamiana hda na md dla root i boot w pliku - uwaga -
/mnt/mirror/etc/lilo.conf:

boot=/dev/md0
.............
root=/dev/md0
.............
raid-extra-boot=/dev/hda,/dev/hdd

Zapisz zmiany.
Uruchom lilo -r /mnt/mirror U mnie były trzy ostrzeżenia, nie przejmuj się. Czas
na reboot - pamiętaj, aby ustawić w biosie boot z dysku będącego częścią
chodzącego obecnie mirrora (tu: /dev/hdd). Jeśli system wystartował a
polecenie mount pokazuje, że pracujemy na mirrorze, jedziemy dalej.

Pozostało obecnie załączyć do mirrora "uszkodzony" dysk - ten, na którym do tej pory
był stary system a o którym jajko myśli, że jest uszkodzony (tu: /dev/hda).
Najpierw fdiskiem (lub czymś podobnym) zmieniamy typ partycji dysku /dev/hda
na Linux raid autodetect (fd) i zapisujemy zmiany. Reboot kompa. Następnie
wystarczy w /etc/raidtab zamienić failed-disk na raid-disk (zrób
to teraz, zapisz zmiany w pliku) oraz wydać polecenia:

raidhotadd /dev/md0 /dev/hda2
raidhotadd /dev/md1 /dev/hda3


Spowodują one, że do naszego mirrora dodane zostaną "uszkodzone" dyski, rozpocznie się
ich synchronizacja i po chwili /proc/mdstat pokaże w pełni działający mirror :)


6. Diagnostyka

Od czasu do czasu warto sprawdzić w jakim stanie znajduje się nasz mirror.
Z pomocą przychodzi nam polecenie lsraid. Rzućmy okiem na stan naszego
pierwszego mirrora:
   lsraid -a /dev/md0

W omawianym przypadku wynik może wyglądać tak:
[dev ...] /dev/md0 .............. online
[dev ...] /dev/hda2 .............. good
[dev ...] /dev/hdc2 .............. good
[dev ...] /dev/hdd2 .............. spare
Tak więc widzimy, że pierwszy RAID (/dev/md0) pracuje (online).
W jego skład wchodzą dwa dyski (hda, hdc), które pracują poprawnie (good).
Trzecim, zapasowym dyskiem będącym w pogotowiu jest hdd.
Wygląda na to, że wszystko jest w porządku.

Jeśli natomiast chcemy sprawdzić, do której macierzy należy partycja hdc3,
wykonujemy polecenie:
   lsraid -d /dev/hdc3

Chcesz wiedzieć, w jakiej konfiguracji pracują macierze w Twoim kompie ?
   lsraid -R -p

Tyle sensownych opcji lsraid. Po inne udaj się do manuala.
Powróćmy teraz do /proc/mdstat. Wypisanie zawartości tego pliku
(cat /proc/mdstat) pokaże z grubsza to samo. W naszym przypadku
fragment dotyczący /dev/md0 wygląda następująco:

md0: active raid1 hdd2[2] hdc2[1] hda2[0]
586560 blocks [2/2][UU]

Widzimy, że md0 jest mirrorem (raid1).
Następnie wymienione są partycje biorące w nim udział, każdej z nich
przyporządkowany jest numer (w nawiasie kwadratowym, za chwile wrócimy do
tych numerków). Kolejną rzeczą jest wielkość urządzenia md0 podana w bajtach.
A teraz to, co tygrysy lubią najbardziej. Pierwszy nawias kwadratowy to [2/2].
Mówi on tyle: w macierzy pracują dwa dyski (pierwsza cyfra). Dwa z nich pracują
prawidłowo (druga cyfra). Co w tym fajnego ? Ano np. zapis [2/1] oznacza, że
masz problem (patrz następny punkt). A taki: [2/0] mówi: "szukaj nowej pracy".

To jeszcze nie wszystko. Pamiętasz numerki przy każdej partycji biorącej udział w RAID ?
Weźmy jeszcze raz pierwszą z dwóch cyfr w [2/2]. Jest to 2 (słownie: dwa).
Numerki naszych partycji to 0,1 i 2. Możemy wywnioskować stąd, że partycja (i dysk)
numer 2 jest "zapasowa", załączająca się w momencie awarii jednego z pozostałych
dysków. Bierze się to stąd, że zapasową jest każda partycja, której numer jest
większy lub równy od pierwszej cyfry w nawiasie kwadratowym [2/2].
Czyli gdybyśmy mieli więcej "zapasowych" partycji, miałyby one numery większe od
dwójki (bo mamy już zapasową dwójkę). Gdybyśmy w nawiasie kwadratowym mieli
[3/3] zapasowe partycje miałyby przyporządkowane numery większe lub równe
od trzech. Dobra, pieprzyć zapasowe, można je przecież odczytać przez lsraid.

I jeszcze ostatnia rzecz, graficzna reprezentacja naszego [2/2] to [UU].
Pierwsze U to partycja o numerku 0 (zero), drugie U to kolejna partycja,
u nas o numerku 1 (jeden). Jeśli padnie partycja (dysk) numer 0, wówczas będzie tak:
[_U], jeśli padnie ta o numerku jeden, będzie [U_]. Czyli: kolejne U
to kolejne partycje. Po co ta szopka ? Żeby można było np. napisać skrypt, który
"grepuje" podkreślniki i wyczaja, że coś jest nie tak.

Tak między nami: lsraid w zupełności wystarczy. Omówienie /proc/mdstat
to taka sobie ciekawostka. Chyba, że zdarzy się, że siądziesz do kompa w którym
ktoś wykasował lsraid i będziesz mógł przycynić :)

Warto na koniec tego punktu wspomnieć o jeszcze jednym narzędziu: mdadm.
Umożliwia ono... wszystko. Zmiany w macierzy, dodawanie i usuwanie dysków,
monitoring, itd. Jeśli odczuję taką potrzebę (lub Ty ją czujesz - napisz do mnie)
napiszę na temat tego narzędzia (BTW: jest ono dobrze udokumentowane w Sieci).


7. Spokojnie, to tylko awaria

"I stało się to, co miało się stać,
patrzę sobie do mirrora: nosz k... mać!"

To może jakiś praktyczny przykład. A właściwie przykłady.
Jeden: z "wolnym" dyskiem, drugi bez niego. Zacznę od
awarii jednego z dysków mirrorujących. Będzie to secondary
master
: /dev/hdc. Zrobie to kulturalnie: odłącze zasilanie
od dysku przy wyłączonym komputerze i spróbuje uruchomić
system. W przykładzie drugim spróbuję udowodnić, że niektóre dyski
dyski IDE są hotpluggowe - odłącze pałera w czasie pracy
twardziela. Kolejność jest zrozumiała :)

Przykład 1
Uruchomienie systemu z "uszkodzonym" secondary master na
macierzy z "zapasowym" dyskiem.

Włączam komputer. Startuje normalnie, komunikaty systemu przelatują
tak szybko, że nie idzie wyczaić padu twardego. Rzut oka do pliku
/proc/mdstat:

md0: active raid1 hdd2[2] hda2[0]
     ...... blocks [2/1] [U_]
[==>................] recovery = 12.5% (.....) finish=2.6min speed...

Co widzimy w tym okrojonym wyniku ? W mirrorze biorą udział dwa dyski, nie trzy.
Ostał się hdd oraz hda. Fakt, że coś jest nie tak potwierdza zapis
[2/1]. Jednego brakuje. Czytamy dalej: [U_] mówi nam, że padł
drugi dysk (unit ?). Wszystko jasne. Jednocześnie widzimy na dole, że
rozpoczęła się (automatycznie) rekonstrukcja macierzy z udziałem dysku wolnego,
zapasowego :) Za dwie i pół minuty będziemy mieli znowu system na dwóch dyskach.

Dla pewności robimy: lsraid -a /dev/md1
(padły wszystkie meta-dyski w których brał udział hdc, więc i md0 i md1).

[...] /dev/md1 ................. online
[...] /dev/hda3 ................. good
[...] (unknown) ................. missing
[...] /dev/hdd3 ................. spare

Tutaj nie trzeba nic wyjaśniać.

Minęły trzy minuty. Zapasowy dysk zastąpił uszkodzony, /proc/mdstat
wygląda tak, jakby nigdy nie było dysku zapasowego. lsraid zachowuje
się identycznie. Mamy zwykły mirror, bez dysku zapasowego. Wszystko stało się
samo. W ciągu trzech minut system naprawił się sam :)

Na spokojnie oglądamy komunikaty dmesg. Jak to wyglądało ?
Oto ciekawsze fragmenty:

md: Autodetecting RAID arrays.
md1: former device hdc3 is unavailable, removing from array!
raid1: spare disk hdd3
raid1: md1, not all disks are operational - trying to recover array
raid1: raid set md1 active with 1 out of 2 mirrors
md: updating md1 RAID superblock on device
md: recovery thread got woken up ...
md1: resyncing spare disk hdd3 to replace failed disk


Należy jeszcze uakualnić plik konfiguracyjny mirrora:
albo ręcznie edytujemy /etc/raidtab albo też robimy taki myk:
lsraid -R -p > /etc/raidtab
Od tej chwili plik raidtab zawiera właściwe dane.

Następnie uaktualnij plik /etc/lilo.conf, chodzi o
parametr raid-extra-boot. Zamień uszkodzony dysk (tutaj hdc)
tym zapasowym, który przejął jego rolę (tutaj hdd). Jeszcze przeładuj
lilo i szafa gra.

Możemy położyć komputer i wyjąć z niego uszkodzony dysk.
Od tej pory mamy zwykły mirror bez dysku zapasowego.
O tym jak załączyć nowy zapasowy dowiesz się z trzeciego przykładu.

Przykład 2
Teraz coś dla hardkorowców: odłączenie pałera w czasie pracy macierzy (2 dyski,
bez zapasowego). Szczęśliwym wybrańcem został... primary master. Przykład
ten ma pokazać, że na dobrze skonfigurowanym mirrorze system potrafi wstać z
jednego dysku (typu slave) oraz czynności jakie należy wykonać po
podłączeniu nowego dysku. No to jedziemy: system sobie chodzi a ja odłączam od
twardego zasialnie... System chodzi dalej. Jest troche ciszej, bo płyta i dyski leżą rozłożone na stole :)
Co widzimy w /proc/mdstat ?

md0: active raid1 hdd2[1] hda2[0](F)
     ..... blocks [2/1] [_/U]


Po pierwsze: oznaczenie (F) czyli failed, czyli któryś dysk rozsypał
się na dobre. Po drugie: [_/U] czyli pierwszy dysk, czyli ten z mniejszą
cyferką przy opisie czyli /dev/hda2, czyli /dev/hda, czyli primary
master
. A nie mówiłem ? Okej. Teraz wynik polecenia lsraid -a /dev/md0:

[dev ....] /dev/md0 ............... online
[dev ....] /dev/hda2 ............... failed
[dev ....] /dev/hdd2 ............... good

Nie chce mi się tego komentować :) Nasz dysk nadaje się do wymiany. Jako stary
użytkownik systemów Windows postanawiam zrebootować kompa. Może naprawi się samo.
Dobra, chodzi o lilo, zobaczymy czy ta padlina się podniesie.
Jego zamykaniu towarzyszą ostrzeżenia o uszkodzonym dysku (podobne pojawiły się w
logach). A za chwilę co widzimy ? He ? Tak jest, lilo oraz ładujący się
system. Jest git, nasz system chodzi jak należy. Tyle, że z macierzą jednodyskową :)

Uaktualniamy nasz /etc/raidtab w taki sposób:

lsraid -R -p > /etc/raidtab

albo ręcznie. Dobra, zamykamy system, wymieniamy dysk i wracamy do tego miejsca.

Pożyczyliśmy kasę, mamy nowy dysk, jest już podłączony. Dzielimy go fdiskiem
podobnie jak w przykładzie 1 (podobne wielkośći, typ partycji fd itp.).
Uaktualniamy /etc/raidtab dopisując dodatkowe partycje do odpowiednich
meta-device. Oto fragment dla md0 przed wymianą dysku:

raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
persistent-superblock 1
chunk-size 4
device /dev/hdd2
raid-disk 1
device /dev/null
failed-disk 0


oraz po naszej interwencji:

raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
persistent-superblock 1
chunk-size 4
device /dev/hdd2
raid-disk 1
device /dev/hda2
raid-disk 0


Tia. Pozostało jeszcze wydać polecenie(a) analogiczne do tych:

raidhotadd /dev/md0 /dev/hda2
raidhotadd /dev/md1 /dev/hda3


Rozpoczynają one synchronizację nowych dysków i po paru minutach nasze
meta-urządzenia są jak nowe. Od tej pory używasz prawdziwego mirrora.
Ale to nie wszystko. Sprawdź plik /etc/fstab i skoryguj, popraw lub
upewnij się, że są w porządku dane dotyczące swapa. Jeśli szafa gra,
wydaj polecenie załączające swapowanie na odpowiedniej partycji (z odpowiednim
priorytetem), np. swapon -p 1 /dev/hda1. Do kontroli użyj swapon -s
To też jeszcze nie wszystko. Nie zapomnij o lilo, nie rób siary!
Sprawdź, ew. popraw /etc/lilo.conf i wydaj polecenie lilo.
Gratuluje, zasłużyłeś na piwo. Na kilka piw. Szkoda, że Twój szef o tym nie wie
(i jeszcze jebie cie za konieczność zakupu nowego dysku). Przyzwyczaj się.

Przykład 3
Sytuacja wygląda tak: mamy system chodzący na mirrorze. Chcemy dodać dysk zapasowy,
albo żeby zastąpić uszkodzony albo żeby czuć się bezpieczniej ;) Powód nie ma znaczenia,
procedury są takie same. Podstawowa sprawa to podłączyć dysk do kompa i wyczaić
jak jest widziany przez system. W tym przykładzie padł dam dysk /dev/hdc. Można
podejść do tego także w taki sposób, że chcemy aby zapasowy dysk znajdował się na
/dev/hdc. Ustawiamy zworkę na master i podłączamy do drugiego IDE. Włączamy
komputer.

Należy teraz wyczaić jak podzielone są dyski biorące udział w obecnym mirrorze. W naszym
przypadku są to /dev/hda oraz /dev/hdd. Wydajemy polecenie np. fdisk -l /dev/hda
i widzimy już, jak z grubsza podzielić nasz "wolny" dysk. Bierzemy fdisk w obroty i
dzilimy nasz nowy dysk w bardzo podobny sposób (pamiętaj, że typem wszystkich partycji prócz
swap jest fd). Zapisujemy zmiany.

Należy teraz dodać odpowiednie wpisy do pliku /etc/raidtab. Ponieważ chcemy
dołożyć po "wolnym" dysku, zwiększamy wartość parametru nr-spare-disks oraz dopisujemy
do każdego urządzenia /dev/md.. sekcję device oraz spare-disk.
W omawianym przypadku /dev/md1 wygląda mniej więcej tak:

raiddev /dev/md1
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
persistent-superblock 1
chunk-size 4
device /dev/hda3
raid-disk 0
device /dev/hdd3
raid-disk 1


Po odpowiednim podzieleniu fdiskiem nowego, zapasowego dysku plik ten modyfikujemy tak:

raiddev /dev/md1
raid-level 1
nr-raid-disks 2
nr-spare-disks 1
persistent-superblock 1
chunk-size 4
device /dev/hda3
raid-disk 0
device /dev/hdd3
raid-disk 1

device /dev/hdc3
spare-disk 0


W razie awarii któregoś z dysków mirrorujących, jego rolę przejmie /dev/hdc.
W naszym przypadku, w macierzy /dev/md1, rolę uszkodzonej partycji /dev/hda3
lub /dev/hdd3 przejmie partycja /dev/hdc3. Zapisujemy zmiany.

To jeszcze nie wszystko, żebym zapasowy dysk zaskoczył (wystarczy rzut oka na wynik polecenia
lsraid -R -p). Pozosta ło jeszcze dla każdego mirrora /dev/md.. posłużyć
się poleceniem raidhotadd. W naszym przypadku będą to:

raidhotadd /dev/md0 /dev/hdc2
raidhotadd /dev/md1 /dev/hdc3

Teraz lsraid -R -p zwróci wynik, na który czekaliśmy. To samo widzimy po wydaniu
polecenia cat /proc/mdstat.

A skoro nowy jest już częścią mirrora, może zostać także częścią swapa. Wystarczy
edycja /etc/fstab i dopisanie linijki analogicznej do innych swapów.

Przykład 4
Na szybkiego, w tym miejscu powinieneś już wiedzieć jak się obchodzić z mirrorem.
Założenie: system z mirrorem plus dysk zapasowy.
Nagle odczuwasz silną wewnętrzną potrzebę posiadania dysku (np. okazało się, że
kumpel ma wuchtę filmów i chcesz je mieć u siebie. Albo za skrzynkę piwa pożyczasz
dysk znajomemu). Dla zrobienia wrażenia możesz rzucić tekst: poczekaj, wyjmę dysk
z serwera, i tak mam mirrora
:). Tak czy siak chcesz na jakiś czas wyjąć zapasowy.

Załóżmy, że zapasowy to /dev/hdb (tak, literki "b" chyba jeszcze nie przerabialiśmy).
Najpierw palisz głupa przed kernelem, że zepsuł się zapasowy dysk mirrora:

raidsetfaulty /dev/hdb

Teraz zachowujesz się tak, jak gdyby uszkodzeniu uległ wspomniany dysk i
uaktualniasz konfig:

raidhotremove /dev/md... /dev/hdb
lsraid -R -p > /etc/raidtab

Hmm... Możesz wyłączyć kompa i triumfalnym gestem wręczyć kumplowi twardego :)
Jeśli przyszłoby Tobie do głowy pożyczać jednego z głównych mirrorujących, wykonaj
powyższe a następnie wykasuj zawartość twardziela :). To by było na tyle,
polecenie raidsetfaulty sprawia, że system zaczyna traktować dysk jak
normalnie uszkodzony. Użyj go, jeśli chcesz odłączyć od macierzy jakikolwiek sprawny
dysk. Inne przykłady omawiają jak podłączyć z powrotem i zapasowy i główny mirrorujący.
Dobrej zabawy.

Podsumowanie
Nie lubie podsumowań. Przeważnie oznaczają koniec.

Najlepszym rozwiązaniem jest mirror(2 dyski) plus zapasowy(1 lub więcej dysków).
W przypadku awarii system sam wykonuje odpowiednie czynności i gdy połapiesz się, że
coś jest nie tak, wystarczy dodać dysk zapasowy - jest to najprostsza czynność.
Nie ryzykujesz wtedy w takim stopniu utraty danych i generalnie trudno coś spaprać.
Gdy nie masz zapasowego i dojdzie do awarii dysku, nie dość, że trudniej jest
przywrócić system do normalnego stanu, to wszystko chodzi na jednym twardzielu.
Na chłopski rozum: szybciej spieprzą się dwa dyski niż trzy. Wystarczy.

Przeglądaj plik /proc/mdstat. Najlepiej gdy cron zrobi to za Ciebie
ze dwa razy dziennie i w przypadku wyłapania "podkreślnika" w kwadratowym
nawiasie podeśle Tobie mejla.

Po chamsku napisz markerem na dyskach w serwerku, który jest który (hda, hdb, ...).
Nigdy nie wiadomo jak zareagujesz na awarię na produkcyjnej maszynie. Uwierz,
naprawdę dziwne rzeczy dzieją się wtedy :)

Jeśli masz okazję na byle jakim sprzęcie bawić się mirrorem, rób to.
Im więcej będziesz się bawił na doświadczalnej maszynie tym lepiej.
Na serwerku błędy mogą wiele kosztować. Mało optymistyczny akcent na koniec :)


Posłowie

Jest to pierwsza wersja tego dokumentu i zawiera pewnie
jakieś błędy/niedoróbki/potknięcia itp. Będę bardzo wdzięczny
za wszelkie uwagi, komentarze, poprawki, wyrazy wdzięczności.
Z góry przepraszam za powyższe i mam nadzieję, że będziecie mnie
informować w których miejscach coś nie gra.
Jako (częściowe) wytłumaczenie przedstawiam fakt, że większość tej
pracy powstawała w późnych godzinach nocnych.

Ostatnia wersja tego dokumentu znajduje się pod niżej wymienionym adresem.
Kontakt ze mną: linio@terramail.pl
Wesprzyj finansowo autora - kliknij tutaj



 
===============================
Henryk Liniowski, Poznań 2004
http://linio.terramail.pl
===============================