O mnie Projekty Wspomnienia Galeria Blog Ostatnie zmiany Kontakt 2007-04-12 2007-04-11 2007-04-10

2007-04-11 Migracja serwera na RAID1

Znana i powszechna sytuacja. Jest sobie serwerek, zainstalowany na jakimś dysku, wpierw instalowany “oszczędnie” i tanio, bo przecież nic istotnego na nim nie było, a z czasem przybywało na nim usług… I okazuje się że dane na dysku stają się na tyle cenne że warto byłoby trzymać je na dwóch dyskach by zminimalizować ryzyko uszkodzenia naszego dysku i danych na nim.

Tak więc.. znajdują się środki by zakupić drugi dysk… i co dalej? Instalacja od nowa na raid1? Po co!

W artykule postaram się opisać jak zmigrować istniejący na jednym dysku system na 2 dyski, z RAID1, przy minimalnym “downtime” usług na nim.

Co mamy

No więc.. mamy instalację linuksa. Dla uproszczenia, wygląda ona tak:

[root@pldmachine ~]# fdisk -l /dev/hda

Disk /dev/hda: 1073 MB, 1073741824 bytes
16 heads, 63 sectors/track, 2080 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1         512      258016+  83  Linux
/dev/hda2             513         600       44352   82  Linux swap / Solaris

gdzie /dev/hda1 to oczywiście / na xfsie z PLD na pokładzie (ale może to być dowolna inna dystrybucja). Do tego dołożony pusty drugi dysk /dev/hdb:

[root@pldmachine ~]# fdisk -l /dev/hdb 

Disk /dev/hdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/hdb doesn't contain a valid partition table

Potrzebny będzie też program do zarządzania macierzą mdadm.

Założenie partycji

Musimy na drugim dysku założyć partycję raida. Albo też.. przekopiować ją z /dev/hda ;)

[root@pldmachine ~]# dd if=/dev/hda of=/dev/hdb bs=512 count=1
1+0 records in
1+0 records out
[root@pldmachine ~]# fdisk -l /dev/hdb

Disk /dev/hdb: 1073 MB, 1073741824 bytes
16 heads, 63 sectors/track, 2080 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hdb1               1         512      258016+  83  Linux
/dev/hdb2             513         600       44352   82  Linux swap / Solaris

Plus zmienić id na fd (Linux Auto Raid) i odświeżyć kopię tablicy partycji w jądrze

[root@pldmachine ~]# sfdisk -c  /dev/hdb 1 fd 
Done

[root@pldmachine ~]# sfdisk -c  /dev/hdb 2 fd 
Done

[root@pldmachine ~]# sfdisk -R /dev/hdb       
[root@pldmachine ~]# 

Tworzenie raida

Mając miejsce pod raida zostaje tylko.. utworzyć nowego raida ;). Ale uwaga! - przecież na dysku /dev/hda są ciągle dane. Więc co możemy zrobić? Możemy zawsze stworzyć pseudo-raida który składa się tylko z jednego fizycznego dysku - /dev/hdb!

[root@pldmachine ~]# mdadm --create --level=raid1 /dev/md0 --raid-devices=2 /dev/hdb1 missing
mdadm: array /dev/md0 started.

Teraz wystarczy go tylko sformatować, zamontować…

[root@pldmachine ~]# mkfs.xfs /dev/md0                                                            
meta-data=/dev/md0               isize=256    agcount=8, agsize=8060 blks
         =                       sectsz=512   attr=0
data     =                       bsize=4096   blocks=64480, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096  
log      =internal log           bsize=4096   blocks=1200, version=1
         =                       sectsz=512   sunit=0 blks
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@pldmachine ~]# mount /dev/md0 /mnt/                                                         
[root@pldmachine ~]# 

I skopiować dane :)

Kopiowanie danych

Cóż. ilu kopiujących tyle sposobów ;) Osobiście używam dwóch:

tar

Korzystając z tara (i czasami wrzucając po drodze jeszcze cpipe):

[root@pldmachine ~]# tar cf - --one-file-system / |cpipe -vt |tar xf - -C /mnt/ 
tar: Removing leading `/' from member names
thru:  55.641ms at    2.2MB/s (   2.2MB/s avg)  128.0kB
thru:  18.021ms at    6.9MB/s (   3.3MB/s avg)  256.0kB
thru:  17.160ms at    7.3MB/s (   4.1MB/s avg)  384.0kB
thru:  12.129ms at   10.3MB/s (   4.7MB/s avg)  512.0kB
thru:  12.589ms at    9.9MB/s (   5.2MB/s avg)  640.0kB

Ładnie pokazuje aktualny transfer --one-file-system zapewnia że nic spoza głównego systemu plików nie zostanie skopiowane.. etc. Można jeszcze dorzucić opcję v do któregoś z tarów, wtedy będzie widać jaki plik jest aktualnie kopiowany.

rsync

rsync jest o tyle wygodniejszy, że kopiuje tylko pliki które się zmieniły, pozwala również oszacować ile jeszcze plików zostało etc, ot:

[root@pldmachine ~]# rsync --progress --delete -axtrDHl / /mnt/
building file list ...
20107 files to consider
chroot-i686.tar.bz2
    13063546 100%    6.59MB/s    0:00:01 (xfer#1, to-check=20105/20107)
bin/
bin/arch
        2880 100%    3.10kB/s    0:00:00 (xfer#2, to-check=20103/20107)

Osobiście zazwyczaj używam tara do pierwszego skopiowania plików, a następnie po zastopowaniu wszystkich usług rsynca by ponownie skopiować zmienione pliki.

Rekonfiguracja

Po skopiowaniu plików trzeba nieco pozmieniać konfigi:

[root@pldmachine ~]# chroot /mnt/ su -                                                            
[root@pldmachine ~]# 
[root@pldmachine ~]# mount /proc
[root@pldmachine ~]# 
[root@pldmachine ~]# echo 'DEVICE /dev/hda1 /dev/hdb1' >> /etc/mdadm.conf
[root@pldmachine ~]# mdadm --detail --scan >>/etc/mdadm.conf
[root@pldmachine ~]# 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
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.rRIYH9/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.rRIYH9/bin/mdassemble
echo Setting up array (/dev/md0 = /dev/hdb1)
echo copying /dev/hdb1
echo copying /dev/md0
echo copying /dev/hda1
Adding rootfs finding based on root= option support.

Jak widać - nowy initrd zawiera już obsługę raid1, a także ma informacje o /dev/hda1 i /dev/hdb1 z których będzie się składał nasz raid

# For booting Linux
title  Linux raid
root (hd1,0)
kernel (hd1,0)/boot/vmlinuz root=/dev/md0
initrd (hd1,0)/boot/initrd

można też po prostu skopiować ten pliki initrd do /boot w starym loaderze i skonfigurować go jako np initrd=/boot/initrd.raid

Pracujemy na raid1

Po reboocie system powinien się podnieść z dotychczasowymi ustawieniami, ale już korzystając z /dev/md0. Wystarczy więc teraz:

[root@pldmachine ~]# /sbin/mdadm -a /dev/md0 /dev/hda1 
mdadm: added /dev/hda1

Podsumowując - to nie jest takie trudne ani czasochłonne ;) Jak masz jakieś uwagi, komentarze, poprawki - zapraszam do 8 skomentowania. :)