RAID softwarowy

Podczas zjazdu w 2007 roku Marek Wodziński przedstawił interesująco temat tzw. raidu programowego. Ponownie rozmawialiśmy o tym w 2008 roku. Coraz większa liczba użytkowników jest zainteresowana takim rozwiązaniem. Po przetestowaniu – prezentację na ten temat – poprawioną i powtórnie omówioną na zjeździe w 2008 roku – postanowiliśmy udostępnić użytkownikom. Ponadto przedstawiamy opis wykonania programowego raidu na NND.

Uwagi wstępne
Każdy kto przystąpi do wykonania raidu, powinien najpierw zrobić backup danych i ustawień swojego serwera. Jeśli coś pójdzie nie tak, to zapewne pożegnamy się z działającym systemem, danymi, a dysk trzeba będzie całkowicie „zaorać”. Należy pamiętać, że w zależności od typu interfejsu i sposobu podłączenia dysku może on miec w systemie rozmaite oznaczenie (hda, sda… itd.). Dlatego nie należy przepisywać podanych poleceń systemowych automatycznie, bo wtedy dopiero mogą pojawić się prawdziwe problemy. Opis poniższy został przetestowany na NND z dwoma identycznymi dyskami o wielkości 20 GB na maszynie wirtualnej (Virtualbox). NND zostało zainstalowane z płyty, następnie zrobiono kompletny upgrade systemu do pakietów z *-current. Aby zacząć przygodę z raidem należy jeszcze zainstalować pakiety madm i rsync.
Krok pierwszy to przygotowanie drugiego dysku, na którym muszą byc takie same partycje (w naszym przypadku / i /home oraz swap). Generalnie w większości innych dystrybucji nie powinno byc z tym problemu, za pomocą sfdisk, fdisk czy cfdisk stworzymy bez problemu identyczne partycje, jak na dysku podstawowym. Instalator NND jest jednak przeznaczony często dla bardzo początkujących i posługując się wartościami w MB tworzy partycje tak, że potem trudno jest powtórzyć identyczną konfigurację. Ja posłużyłem się instalatorem NND ponownie tworząc nim dokładnie takie same partycje, jak wcześniej podczas instalacji. Po zapisaniu tablicy partycji wyszedłem z instalatora przez ctrl+c. Zapytałem autora prezentacji o inny sposób, bo może być tak, że ktoś instalował NND dużo wcześniej i nie pamięta już jak zrobił poprzednie partycje.Należy wówczas wykonać polecenie:
dd if=/dev/hda of=/dev/hdd bs=512 count=1
a następnie
cfdisk-a
i zapisać konfigurację (oczywiście literki dysków wpisać takie, jakie są w systemie).
Przygotowujemy raid
Zatem mamy już przygotowane dyski z takimi samymi partycjami. W moim przykładzie jest to hda (pierwszy, na którym jest zainstalowany system) i hdd, na którym zrobię raid.
Najpierw należy utworzyć raid dla partycji systemowej:
mdadm -C /dev/md0 -l1 -n2 /dev/hdd1 missing
następnie należy założyć system plików:
mke2fs -j /dev/md0
Nową partycję trzeba zamontować, w celu zsynchronizowania:
mount /dev/md0 /mnt/hd
Katalog /mnt/hd musiałem wcześniej ręcznie utworzyć.
Następnie trzeba uruchomić rsync, żeby przenieść strukturę katalogów i pliki:
rsync -va –progress –delete –exclude=/proc –exclude=/sys –exclude=/home –exclude=/mnt/hd / /mnt/hd
To chwilę potrwa i wtedy jeszcze tworzymy brakujące katalogi:
chroot /mnt/hd
mkdir /proc /sys /home /mnt/hd (ten ostatni jeszcze się może przydać)
Aby nasz system zaczął korzystać z niepełnego jeszcze raid, trzeba wykonać kilka czynności dodatkowo. Po pierwsze dodajemy wpis do pliku lilo.conf:
image=/boot/vmlinuz
root=/dev/md0
label=raid
append=”md=0,/dev/hdd1”
read-only

Uaktualniamy lilo.
W pliku fstab należy zmienić wpis hda1 na md0 i następnie wpisujemy:
lilo -R raid
reboot

Ta opcja zrestartuje system, który się uruchomi już z partycji raid. Po reboocie wpisujemy:
mdadm /dev/md0 -a /dev/hda1
i poleceniem cat /proc/mdstat można zobaczyć, że raid właśnie się tworzy. Dalsze czynności można podjąć gdy już pokaże się nam po wykonaniu tego polecenia następujący efekt:
md0 : active raid1 hda1[1] hdd1[0]
4194240 blocks [2/2] [UU]

Teraz trzeba dokończyć konfigurację. Do pliku lilo.conf na początku dopisujemy linie:
boot=/dev/md0 (to będzie zamiast istniejącego /dev/hda1)
raid-extra-boot=mbr
i dodajemy linię:
default=raid

żeby odtąd opcja z raidem uruchamiała się domyślnie.
Ponieważ nasz raid na md0 składa się już z dwóch partycji, więc musimy poprawić jeszcze jedną linię w lilo.conf
append=”md=0,/dev/hdd1,/dev/hda1” (wcześniej było tylko hdd1)
Ponownie wykonujemy lilo i możemy zrestartować system. Teraz mamy już pełny raid na partycji systemowej.
Dodatkowe partycje
Powtarzamy część czynności, aby dodać pozostałe partycje.
W moim przypadku zacząłem od partycji swap, co wg niektórych fachowców nie jest potrzebne.
mdadm -C /dev/md1 -l1 -n2 /dev/hdd2 missing
mkswap /dev/md0
mdadm /dev/md1 -a /dev/hda2

Podobnie dodałem partycję /home:
mdadm -C /dev/md2 -l1 -n2 /dev/hdd3 missing
mke2fs -j /dev/md2

Partycję zamontowałem w /mnt/hd i tym razem już ręcznie przerzuciłem zawartość /home, czyli de facto katalog użytkownika, bo mój system był świeżo zainstalowany (w zasadzie należało również użyć rsync).
Potem jeszcze odmontowałem partycję i wykonałem polecenie:
mdadm /dev/md2 -a /dev/hda3
Po kilku minutach polecenie cat /proc/mdstat pokazało cały zrobiony raid:
Personalities : [linear] [raid0] [raid1] [raid5]
read_ahead 1024 sectors
md2 : active raid1 hda3[1] hdd3[0]
16252864 blocks [2/2] [UU]

md1 : active raid1 hda2[1] hdd2[0]
524224 blocks [2/2] [UU]

md0 : active raid1 hda1[1] hdd1[0]
4194240 blocks [2/2] [UU]

Aby po restarcie, wszystko działało bezbłędnie należy jeszcze uzupełnić zmiany w pliku fstab:
/dev/md0        /       ext3    defaults        1       1
/dev/md1        swap    swap    defaults        0       0
/dev/md2        /home   ext3    defaults        1       2

i to jest ważny element, żeby nie tylko wcześniej wpisana partycja systemowa korzystała z raid, ale i pozostałe również. Trzeba także dodać pozostałe partycje w lilo.conf:
append=”md=0,/dev/hdd1,/dev/hda1 md=1,/dev/hdd2,/dev/hda2 md=2,/dev/hdd3,/dev/hda3″
a  na koniec po raz ostatni wykonać lilo i zrestartować system.
Jeśli po restarcie polecenie df pokaże nam:
System plików      bl.  1K B        użyte dostępne %uż. zamont. na
/dev/md0               4128384    237972   3680700   7% /
/dev/md2              15997840    170904  15014296   2% /home

– to znaczy, że wszystko zrobiliśmy poprawnie i nasz raid działa już na wszystkich partycjach.
Przed podjęciem opisanych czynności najpierw należy przeczytać prezentację Marka Wodzińskiego, ponieważ jest tam pełny i dokładny opis czynności oraz trochę wyjaśnień teoretycznych, które są niezbędne do zrozumienia tego – co i po co robimy. Elementarna wiedza jest bowiem niezbędna, aby w przypadku problemów umieć je zlokalizować. Ponadto powyższy opis dotyczy NND, zaś prezentacja pozwoli na przeprowadzenie operacji na dowolnym systemie linuksowym.

autor: W. Trąmpczyński (Maciek) na podstawie wykładu Marka Wodzińskiego


Dodaj komentarz