O mnie Projekty Wspomnienia Galeria Blog Ostatnie zmiany Kontakt 2007-04-10 2007-04-09 2007-04-08

2007-04-09 Instalacja linuksa na raid1

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.

Etap 0 - przygotowanie

Potrzebujemy:

Całość montujemy i bootujemy z PLD RescueCD.

Etap 1 - zakładanie partycji

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) .

Etap 2: Zakładanie i uruchamianie raid1

Tworzymy /dev/md0

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

Tworzenie raida

[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

Instalacja PLD

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)

Konfiguracja raida w PLD

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.

Przydatne drobiazgi

Powiadamianie o awariach

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

Informacje o stanie macierzy

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

Prędkość odbudowy

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.

Usuwanie dysku z macierzy

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

Dodawanie dysku do macierzy

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.