Kako pripremiti identičnu kopiju Linux poslužitelja
Iako su serveri kvalitetniji od običnih, korisničkih računala, i oni se mogu pokvariti. Sistemci koji su navikli svoje korisnike na 24/7 uslugu razmišljaju unaprijed, pa se nastoje pripremiti za situaciju kad server zbog hardverskog kvara ispadne iz produkcije. Ovdje ćemo predstaviti jedno jeftino i praktično rješenje. Naime, moguće je napraviti identičnu kopiju softvera i podataka sa produkcijskog Linux servera kako bi bila spremna za prijenos na zamjensko računalo.
Ideja je da na drugi Linux sistem ili na sam produkcijski poslužitelj spojimo, npr. preko USB sučelja, disk koji se sinkronizira sa sistemskim diskom poslužitelja i spreman je da ga, u slučaju potrebe, ugradimo u rezervni poslužitelj. Na taj ćemo način u kratkom roku podići funkcionalan zamjenski poslužitelj, u stanju posljednje sinkronizacije.
Predpostavimo da je na izvoru sistemski disk /dev/sda, a ciljni (sistemski) disk budućeg rezervnog poslužitelja /dev/sdc. U tekstu ćemo se držati ove konvencije, a vi ćete, naravno, sve prilagoditi stanju na vašem sustavu. Važno je samo da smo uvijek svjesni koje naredbe izvršavamo na izvornom, a koje na ciljnom računalu!
Ciljni disk u pravilu treba biti jednakog ili većeg kapaciteta od izvornog.
Prvo treba pripremiti ciljni disk da odgovara izvornom, tj. prekopirati master boot record i partcijsku tabelu te formatirati particije.
Stvaranje mbr datoteke na izvornom računalu.
dd if=/dev/sda of=sda.mbr bs=512 count=1
Zatim spremimo particijsku tabelu kao tekstualnu datoteku:
sfdisk -d /dev/sda > sda.pt
Provjera (naredbe koje utipkavate su istaknute podebljanim slovima):
file sda.mbr
sda.mbr: x86 boot sector, LInux i386 boot LOader; partition 1: ID=0x82, starthead 1, startsector 63, 2104452 sectors; partition 2: ID=0x83, active, starthead 0, startsector 2104515, 771120 sectors; partition 3: ID=0x83, starthead 0, startsector 2875635, 16787925 sectors; partition 4: ID=0xf, starthead 254, startsector 19663560, 121885155 sectorsf
file sda.pt
sda.pt: ASCII textcat sda.pt
# partition table of /dev/sda
unit: sectors
/dev/sda1 : start= 63, size= 2104452, Id=83
/dev/sda2 : start= 2104515, size= 771120, Id=83, bootable
/dev/sda3 : start= 2875635, size= 16787925, Id=83
/dev/sda4 : start= 19663560, size=121885155, Id= f
/dev/sda5 : start= 19663623, size= 10490382, Id=83
/dev/sda6 : start= 30154068, size= 2088387, Id=83
/dev/sda7 : start= 32242518, size=109306197, Id=83
df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 373343 270608 83457 77% /
tmpfs 1038068 0 1038068 0% /lib/init/rw
udev 10240 628 9612 7% /dev
tmpfs 1038068 4 1038064 1% /dev/shm
/dev/sda3 8262068 5834976 2007396 75% /var
/dev/sda5 5162796 1576628 3323912 33% /usr
/dev/sda6 1027768 16540 959020 2% /tmp
/dev/sda7 53795484 13393200 40402284 25% /home
Prekopiramo MBR datoteku na ciljni disk:
dd if=sda.mbr of=/dev/sdc bs=512 count=1
Na ciljni disk možemo prenijeti particijsku tabelu, u kojoj je moguće i ručno preinačiti po potrebi veličine particija:
sfdisk /dev/sdc < sda.pt
Možemo formatirati nove particije u grafičkom alatu gparted ili iz komandne linije:
mkswap /dev/sdc1
mkfs.ext3 /dev/sdc2
mkfs.ext3 /dev/sdc3
mkfs.ext3 /dev/sdc5
mkfs.ext3 /dev/sdc6
mkfs.ext3 /dev/sdc7
S alatom gparted mogu se eventualno proširiti pojedine particije ako je ciljni disk većeg kapaciteta od izvornog.
Time je priprema zamjenskog diska gotova. Preostaje izvršiti kopiranje sadržaja izvornog na ciljni disk, najbolje s programom rsync.
Ako je ciljni disk spojen lokalno na izvorno računalo, sinkronizacija se može izvršiti priloženom skriptom rsync_lokal.sh, koja sinkronizira sadržaj particija ciljnog diska /dev/sdc sa onima izvornog diska /dev/sda (koje diskove imate priključene na sustav, najbolje se vidi (uz root ovlasti !) naredbom:
fdisk -l
pa odgovarajuće prilagodite priložene skripte za lokalno odnosno udaljeno sinkroniziranje). *)
Ako ciljni disk nije spojen izravno na izvorno računalo, nego na neko drugo, onda treba napraviti pripremu, da se s računala na kojem je spojen ciljni disk može pristupiti izvornom računalu bez prijave s kor. imenom i lozinkom (ovo je pogotovo važno ako na izvorno računalo nije dopušteno spajati se kao root korisnik s nekog drugog računala).
Na izvornom i ciljnom računalu (na koji je spojen ciljni disk) korisnik treba imati isto korisničko ime i sudo ovlasti za pokretanje programa rsync, drugim riječima u /etc/sudoers na oba računala treba imati unos poput ovoga
korisn_ime ALL=(root) NOPASSWD:/usr/bin/rsync
Na ciljnom dodatno još i
korisn_ime ALL=(root) NOPASSWD:/bin/mount
korisn_ime ALL=(root) NOPASSWD:/bin/umount
Gornji unosi /usr/bin/rsync, /bin/mount, /bin/umount ovise o tome koju putanju imaju dotični programi, to treba pogledati naredbom 'which' i na izvornom i na ciljnom računalu, npr:
$ which rsync
/usr/bin/rsync
Prekontrolirajmo da li korisnik na oba računala ima bash ljusku kao podrazumijevanu, tj da na oba računala ima u /etc/passwd datoteki stavku poput ove:
korisn_ime:x:1004:1004::/home/rsync:/bin/bash
Korisnik na ciljnom računalu treba načiniti rsa ključ naredbom:
ssh-keygen
(u ovom primjeru je na sva pitanja kod izvršenja naredbe odgovarano s Enter)
Kopirati stvoreni ključ na izvorno računalo (tražit će se lozinka korisnika na tom (=izvornom) računalu):
ssh-copy-id -i ~/.ssh/id_rsa.pub host.ustanova.hr
(umjesto host.ustanova.hr unijeti pravo ime izvornog računala)
I sada korisnik sa sudo ovlastima može na ciljnom računalu pokrenuti skriptu rsync_remote.sh za sinkronizaciju ciljnog diska s izvornim:
./rsync_remote.sh
(Ukoliko pri izvršavanju skripte rsync_remote.sh sistem ipak traži ukucavanje lozinke, rješenje koje funkcionira je da se skriveni .ssh direktorij root korisnika na ciljnom računalu zamijeni tj. nadomjesti onim od korisnika koji izvršava skriptu na tom istom računalu, možda je dovoljno postaviti i softlink - ključne datoteke su known_hosts i id_rsa)
Ovaj način sinkronizacije čini mi se prilično sigurnim, jer je na izvornom računalu korisniku dovoljno da kao superkorisnik može pokrenuti samo naredbu rsync, a na ciljnom samo naredbe rsync, mount i umount.
Prva sinkronizacija traje nekoliko sati, ali sve kasnije u pravilu traju samo nekoliko minuta.**) Radi toga se skripta može pozivati iz crona npr. svaki sat, a može i samo svaki dan, što je stvar osobne procjene. Za pokretanje iz crona, kao korisnik na ciljnom računalu upišete:
crontab -e
i u vašem podrazumjevanom editoru otvorit će se cron datoteka u koju upišete nešo poput:
15 3 * * * ~/rsync_remote.sh &
za skrptu rsync_remote.sh, ako se nalazi u vašem matičnom direktoriju, pa će se sinkronizacija odvijati jednom dnevno noću u tri sata i petnaest minuta, pod uvjetom da su i izvorno i ciljno računalo uključeni i spojeni na mrežu.
Nakon prve sinkronizacije, potrebno je mountati root (/) particiju ciljnog diska ako nije već mountana npr:
mount /dev/sdc2 /mnt/sdc2
i napraviti na njoj dodatne nužno potrebne direktorije proc, sys, tmp, var, dev, usr, mnt, home ...
mkdir /mnt/sdc2/proc /mnt/sdc2/sys /mnt/sdc2/tmp /mnt/sdc2/var /mnt/sdc2/dev /mnt/sdc2/usr /mnt/sdc2/mnt /mnt/sdc2/home
tj sve direktorije koji se naredbom --exclude u rsync_skripti isključuju iz sinkronizacije.
Preostaje još učiniti ciljni disk 'bootabilnim'. To ovisi koja je verzija grub boot loader-a
Instalacija stare verziju grub-a, naredbe koje utipkavate istaknute su podebljanim slovima:
grub
grub> find /boot/grub/stage1
(hd0,0
(hd2,1)
grub> root (hd2,1)
grub> setup (hd2)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd2)"... 17 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd2) (hd2)1+17 p (hd2,1)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub> quit
Inače, što se tiče novije verzije (grub2) podešavanja, moguće ga je podesiti i iz 'chroot' okoliša, ako se sistem pokrene s nekog butabilnog CD-a.
Pokrene se terminalni prozor i otipkaju se primjerice ovakve naredbe:
sudo fdisk -l
ili
fdisk -l
(tj. bez 'sudo' uz 'root' ovlasti.) da se vidi koje su particije u igri, pa onda teba ući u "chroot" okoliš naredbama, npr:
sudo mount /dev/sda2 /mnt #ako je na ciljnom disku '/' (root) particija /dev/sda2 sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc
sudo chroot /mnt
Treba montirati sada /usr particiju na ciljnom disku u chroot okolištu da bi imali pristup izvršnim datotekama, kao što je grub-install na putanji /usr/sbin/grub-install. (ovisno što želite raditi, montirati trebate i druge particije u chroot okolištu, kao što su /var, /home ...), za instalaciju gruba /var particija je svakako nužna:
mount /dev/sda5 /usr
grub-install --recheck /dev/sda
grub-mkconfig
update-grub
Možete testirati da li je grub instaliran ako pokrenete slijedeću naredbu prije i poslije instalacije grub-a:
dd if=/dev/sda bs=512 count=1 | xxd
pa ako negdje u ispisu možete pročitati riječ "GRUB" nakon instalacije, valjda je grub instaliran. Može se testirati i s qemu emulatorom, naredbom:
qemu /dev/sda
tj podići linux s ciljnog diska kao virtualni OS, no to uradite bez utaknutog mrežnog kabla ili unutar lokalne mreže.
Nakon umountanja /usr i drugih particija koje ste montirali u chroot okolišu izlaz je:
exit
I to je sve. Ciljni disk ćemo sada, u slučaju havarije produkcijskog servera, ugraditi kao primarni disk u zamjenski poslužitelj. Za probu možemo pokušati podići zamjenski poslužitelj (ali bez mrežnog kabla!!!) i ako je hardverska konfiguracija zamjenskog poslužitelja slična konfiguraciji originalnog poslužitelja, odnosno ako se uspiju učitati kernel moduli za hardver zamjenskog poslužitelja, onda se ciljno računalo može upotrijebiti kao nadomjestak za originalni poslužitelj. Zamjenski sistem će biti u onom stanju u kojem je bio originalni sistem u vrijeme posljednje uspješne sinkronizacije.***)
Treba također obratiti pažnju na to da prilikom aktiviranja zamjenskog poslužitelja ključne servise u direktoriju /etc/init.d kao što su postfix, ldap, squirrelmail itd treba inicijalno onemogućiti PRIJE NEGO ŠTO SE UTAKNE MREŽNI KABEL, te ih JEDAN PO JEDAN uključivati u rad, te se preko logova i prikladnim testovima osvjedočiti da rade ispravno.
Update 16. 09. 2013:
Članku priložene tri pdf datoteke (engl. tekst) s uputama za migraciju linux sistema s računala na računalo.
___________
*) Priložene skripte neće pravilno raditi, ako u njima predhodno nistu prilagođene "točke montiranja" i na sistemskom disku načinjeni odgovarajući direktoriji (mkdir /mnt/sdc2 /mnt/sdc3 ... ili sl.) shodno ispisu particija, koji se za ciljni disk pokaže nakon izvršenja naredbe: sudo fdisk -l)
**) Trajanje sinkroniziranja log datoteka može se znatno skratiti, ako se podesi da završeci log datoteka nose datume umjesto brojeva (ključna riječ 'dateext'), isto tako sinkroniziranje je moguće raditi inkrementalno, tako da u arhivi ostaju valjane kopije stanja poslužitelja prema proizvoljno odabranim datumima (ključna riječ 'rsnapshot'). Ove teme su predmet možebitnih idućih članaka.
***) Članak pruža načelnu orijentaciju kako načiniti vjernu kopiju Linux sistema u produkciji i ne obrađuje situacije u kojima bi eventualno trebalo raditi dodatne prilagodbe, kao što su podešavanje raid sustava, ugrađivanje raznih modula za poneki hardver (ako ih prekopirani kernel ne uspije učitati na zamjenskom računalu), možebitno dodatno podešavanje mrežnih postavki (ključna riječ 'ifconfig') i sl.
Prilog | Veličina |
---|---|
rsync_lokal.sh_.txt | 1.65 KB |
rsync_remote.sh_.txt | 1.75 KB |
Linux_migration_preparing_server.pdf | 52.23 KB |
Linux_migration_running_sync.pdf | 65.34 KB |
Linux_migration_tips_and_tricks.pdf | 81.15 KB |
- Logirajte se za dodavanje komentara
- Inačica za ispis
- PDF version
Komentari
Hvale vrijedan članak
Zbilja svaka pohvala za ovaj članak.
...
Hvala Gorane!
Mislim da je prigodan, vrućine su i neke stvari se zbog toga, poput poslužitelja, mogu pokvariti :)
pridruzujem se ...
... pohvalama
...
Hvala Mirko!
Budući da se u članku govori o rsync programu, koristim priliku da
kolege uputim i na Tvoj članak, kojemu je tema taj program:
http://sistemac.carnet.hr/node/999
Možda još samo da spomenem, ako smo možda obojica propustili
spomenuti, a meni je, ukoliko se dobro sjećam, jednom pravilo
probleme to što rsync-inačica (verzija) na lokalnom računalu nije
bila kompatibilna s onom na udaljenom računalu. A moguće je i da
sam ja to tada sebi tako obrazložio :)
Uspješna praktična primjena upute
Još jednom pohavala Luki za uputu jer ja sam je "nenamjenski" koristio za jednu drugu namjenu.
Pokazalo se uspješno.Pošto sam htio stvoriti identičnu kopiju mašine na jednu drugu mašinu sličnog hardwarea
probao sam iskoristiti ovu uputu.Jer imao sam problem da na toj drugoj mašini natjeram na radi Adobe flash player
jer zbog prestare generacije procesora ne može raditi sa novim verzijama playera.
Na orginalnoj mašini kojoj je "stao razvoj" su bile starije verzije koje mogu pokretati flash.
Znači ciljano računalo sam "vraćao u prošlost" sa Lukinom uputom.
Znači radio sam rsync putem ssh kopiju računala na drugoj lokaciji sa malo različitim hardwareom.
Na ciljnom računalu sam imao kao i na orginalnom instaliran Debian Squeeze bez separiranih particija kao na serverima.
Išao sam sa čistim kopiranjem /var u /var,/home u /home itd.Za tu priliku mi je Luka "skrojio" naredbu.
Da kopira sve osim izuzetaka navedenih u naredbi i da zbriše sve što ne postoji na orginalu.
Ovdje trebalo izbjeći npr kopiranje /dev ali išao sam baciti na glavu pa što bude bez puno analize,imao sam rezervnu kopiju ciljnog računala:)
To je prošlo jako brzo,javio je nekoliko errora koji mi se nisu učinili bitni.Nakon reboota
se nakon Gruba javila slijedeća stvar:
"waiting for root file system... ALERT! /dev/disk/by-uuid/d2e63a79-5fcf-4261-933e-9b0539445949 does not exist" sort of error.
Ušao sam sa "e" u Grub edit mod i zamjenio
sa
i uspio podići mašinu.
Iz nekog razloga u /sbin/blkid fileu je ostao UUID od prethodne instalacije.
Da se ne bi bunio pri bootu trebalo je zamijeniti na ciljanom računalu UUID koji je prekopiarn sa rsync u datoteci
/boot/grub/grub.cfg .
Nakon toga se računalo uspješno bootalo i radila je sve kao na orginalnom računalu.
Inače u prvom pokušaju se nije startala mreža jer sa orginalnog računala prekopiran /etc/networking/interfaces
u kojem je eth1 a na odredišnom je eth0.Samo je trebalo zamijeniti eth1 sa eth0 i mreža je proradila.:)
...
Hvala Gorane na komentaru, uspješnoj implantaciji gornjih uputa i dodatnim informacijama.
Da u grub2 treba editirati grub.cfg za opcije, koje je grub imao u datoteci menu.lst
Naredba 'blkid' čita podatke iz direktorija /dev/disk, a direktoriji /dev kao i neki drugi
(/tmp /sys ...) se obično ne kopiraju nego se s '--exclude' unutar 'rsync' naredbe isključe
iz procesa kopiranja. Naredba 'man blkid' upućuje, da se UID atributi diskova
nalaze u vidu čitljivog teksta u datoteci /etc/blkid.tab
re
Da /dev definitivno treba zaobići sa "exclude" što ja zbog brzopletosti nisam napravio...ali eto bez obzira na to
je pacijent preživio:)
...
Ja sam kriv. U konfekcioniranoj naredbi koju sam Ti poslao omaškom sam ispustio
--exclude='/dev'.
Čak mi se ista greška podkrala i uz članak priloženim skriptama, što idem odmah popraviti.