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.
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.
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 ~]#
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 :)
Cóż. ilu kopiujących tyle sposobów ;) Osobiście używam dwóch:
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 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.
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
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. :)