Mamy komputer. W nim dwa dyski. I chcielibyśmy zainstalować system tak, by pad jednego dysku automatycznie nie powodował padu całego systemu.
Czyli w skrócie - musimy użyć RAID-a :)
W artykule postaram się zademonstrować jak prosto jest skonfigurować RAID1 pod PLD.
Potrzebujemy:
Całość montujemy i bootujemy z PLD RescueCD.
Zakładam na każdym z dysków partycję wielkości całego dysku i oznaczam ją jako RAID Autodetect.
[root@rescue ~]# fdisk /dev/hda Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-130, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-130, default 130): Using default value 130 Command (m for help): t Selected partition 1 Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux raid autodetect) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Analogicznie postępujemy dla drugiego dysku (i kolejnych w razie potrzeby) .
Na rescue jest używany udev, więc /dev/md0 się samo nie tworzy… utwórzmy je wobec tego “ręcznie”, załadujmy też moduł do obsługi raid1
[root@rescue ~]# mknod /dev/md0 b 9 0 [root@rescue ~]# modprobe raid1
[root@rescue ~]# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/hda1 /dev/hdb1 mdadm: array /dev/md0 started.
Od tego momentu wszystkie operacje wykonywane na /dev/md0 będą odnosić sie do dwóch fizycznych dysków - więc w razie padu jednego z nich - system postawiony na raidzie powinien wstać.
Status utworzonego raida możemy sprawdzić komendą -D:
[root@rescue ~]# mdadm -D /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Sun Apr 8 20:19:59 2007
Raid Level : raid1
Array Size : 1044096 (1019.80 MiB 1069.15 MB)
Device Size : 1044096 (1019.80 MiB 1069.15 MB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Sun Apr 8 20:20:34 2007
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
UUID : efc73de2:753157dc:5701a420:7e257cc3
Events : 0.2
Number Major Minor RaidDevice State
0 3 1 0 active sync /dev/hda1
1 3 65 1 active sync /dev/hdb1
Cóż.. nie będę się powtarzał - wg przepisu z PldWiki:InstalacjaZaPomoc%C4%85Chroota, z tym że jako urządzenie blokowe używamy /dev/md0 a nie /dev/hda1 ;)
Instalujemy również paczkę mdadm (poldek -vi mdadm)
Dopisujemy do pliku /etc/mdadm.conf urządzenia na których mamy raida(wszystkie urządzenia które system na przy starcie sprawdzać czy nie ma na nich uruchomionego raida), oraz “konfigurację” raid:
[root@rescue ~]# echo 'DEVICE /dev/hda1 /dev/hdb1' >> /etc/mdadm.conf [root@rescue ~]# mdadm --detail --scan >>/etc/mdadm.conf
Dopisz do coś takiego do pliku /etc/mdadm.conf:
DEVICE /dev/hda1 /dev/hdb1 ARRAY /dev/md0 level=raid1 num-devices=2 UUID=efc73de2:753157dc:5701a420:7e257cc3
Dopisujemy naszego raida w /etc/fstab:
/dev/md0 / xfs defaults 1 1
i.. generujemy initrd:
[root@rescue ~]# geninitrd -v -f /boot/initrd 2.6.16.45-1 Using /dev/md0 as device for rootfs Finding RAID details using mdadm for rootdev=/dev/md0 Finding IDE modules using ide_hostadapter Finding IDE modules using PCI ID database Finding IDE modules using ide_hostadapter Finding IDE modules using PCI ID database Using modules: kernel/drivers/md/md-mod.ko.gz kernel/drivers/md/raid1.ko.gz kernel/drivers/ide/ide-core.ko.gz kernel/drivers/ide/pci/piix.ko.gz kernel/drivers/ide/ide-disk.ko.gz kernel/fs/exportfs/exportfs.ko.gz kernel/fs/xfs/xfs.ko.gz /bin/initrd-busybox -> /tmp/initrd.VPeOs0/bin/initrd-busybox Loading module [md-mod] without options. Loading module [raid1] without options. Loading module [ide-core] without options. Loading module [piix] without options. Loading module [ide-disk] without options. Loading module [exportfs] without options. Loading module [xfs] without options. Setting up mdadm... /sbin/initrd-mdassemble -> /tmp/initrd.VPeOs0/bin/mdassemble echo Setting up array (/dev/md0 = /dev/hda1 /dev/hdb1) echo copying /dev/hda1 echo copying /dev/hdb1 echo copying /dev/md0 Adding rootfs finding based on root= option support.
Teraz pozostaje tylko instalacja bootloadera na obu dyskach:
[root@rescue ~]# grub Probing devices to guess BIOS drives. This may take a long time. GNU GRUB version 0.97 (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename.] grub> root (hd1,0) Filesystem type is xfs, partition type 0xfd grub> setup (hd1) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/xfs_stage1_5" exists... yes Running "embed /boot/grub/xfs_stage1_5 (hd1)"... 19 sectors are embedded. succeeded Running "install /boot/grub/stage1 d (hd1) (hd1)1+19 p (hd1,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded Done. grub> root (hd0,0) Filesystem type is xfs, partition type 0xfd grub> setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/xfs_stage1_5" exists... yes Running "embed /boot/grub/xfs_stage1_5 (hd0)"... 19 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+19 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded Done. grub>
dopisanie do /boot/grub/menu.lst bootowania z md0:
kernel /boot/vmlinuz root=/dev/md0
i.. reboot :)
System powinien wstać na dowolnym z dysków.
W pliku /etc/sysconfig/mdadm można ustawić e-mail administratora który będzie dostawać maila w przypadku awarii i “wyrzucenia” któregoś dysku z raida
Najprościej zajrzeć do pliku /proc/mdadm:
[root@pldmachine ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hdb1[1] hda1[0]
1044096 blocks [2/1] [U_]
[===>.................] recovery = 18.8% (196672/1044096) finish=0.5min speed=28096K/sec
unused devices: <none>
Widać tutaj informacje o stanie każdej macierzy, a także “stopień” jej przebudowywania
System automatycznie limituje prędkość odbudowy macierzy, by nadmiernie nie obciążać systemu. Informacje o tym można znaleźć w dmesgu:
md: syncing RAID array md0 md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc. md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for reconstruction. md: using 128k window, over a total of 1044096 blocks.
W sytuacji gdy system nie jest używany a macierz “odbudowuje się” zbyt wolno w stosunku do możliwości dysku, można zwiększyć minimalną prędkość odbudowy wpisując odpowiednią wartość do pliku /proc/sys/dev/raid/speed_limit_min, np minimalna prędkość 20MB:
[root@pldmachine ~]# echo 20000 > /proc/sys/dev/raid/speed_limit_min [root@pldmachine ~]#
(oczywiście nie pomoże to w sytuacji gdy dyski/kontroler fizycznie nie wyrobią z taką prędkością)
Analogicznie w sytuacji gdy szybkie odbudowanie macierzy nie jest potrzebne, a wręcz należy zmniejszyć obciążenie systemu/dysku, można zmniejszyć prędkość odbudowy wpisując odpowiednią wartość do pliku /proc/sys/dev/raid/speed_limit_max.
W sytuacji gdy jakiś dysk należy usunąć, należy go wpierw zaznaczyć jako uszkodzony:
[root@pldmachine ~]# mdadm -f /dev/md0 /dev/hda1 mdadm: set /dev/hda1 faulty in /dev/md0
a następnie usunąć z macierzy:
[root@pldmachine ~]# mdadm -r /dev/md0 /dev/hda1 mdadm: hot removed /dev/hda1
W sytuacji gdy wymieniliśmy uszkodzony dysk, lub też z jakiś powodów dysk przestał być w systemie widoczny, należy go ponownie do macierzy dodać za pomocą komendy:
[root@pldmachine ~]# mdadm -a /dev/md0 /dev/hda1 mdadm: re-added /dev/hda1
Polecam zapoznać się również z man mdadm gdzie zawartych jest wiele przydatnych informacji n/t używania raida pod linuksem ;)
W następnym odcinku - przejście na raid w systemie nie używającym raida.