LXC migrálása KVM-be

Mivel tegnap egy szájsebészet után még nekiálltam a témának, voltak melléfogások és figyelmetlenségek rendesen.
Mára tiszta fejjel nekiálltam és a tisztesség úgy kívánja, hogy ha már tegnap Titeket dolgoztattalak a bénázásom miatt, összeszedjem a folyamatot egy rendezett írásba, hátha jól jön még valakinek.

Kezdjük ott, hogy az LXC egy csudijó konténer. Ennek köszönhetően nem fogsz találni a /boot alatt se egy kernelt, se egy grubot, mivel a host kernelét alkalmazza. Ez némiképp bonyolítja a migrációt, mivel nem elég egy hatásos módon elkövetett rsync.

(a következőkben a gépek hostnevei beszédesen lesznek elnevezve, hogy tudjuk hol vagyunk épp, szóval lesz benne chroot hostnév is :P)

Csattogjunk be az LXC host gépre és tájékozódjunk egy kicsit:

root@lxc:~# du -sh /var/lib/lxc/server1/rootfs/
1.9G /var/lib/lxc/server1/rootfs/

root@lxc:~# ifconfig

Most már tudjuk, mennyi helyre lesz szükség, illetve tudjuk, hogy mi az IP-je a gépnek, mi a MAC-címe. Ezeket azért jegyezzük föl.
A példa kedvéért most feltételezem, hogy az LXC és a KVM ugyanabban a subnetben lakik. Ha nem ugyanott, akkor vagy a KVM-ben készítünk egy virbr-et neki a megfelelő paraméterekkel, vagy a chroot résznél majd átírjuk hálózati paramétereket is a vendég gépben.

Irány a KVM host, készítsük elő a terepet (tételezzük fel, hogy van LVM):

root@kvm:~# lvcreate -L 3G -n imgtemp vg0
root@kvm:~# mkfs.ext3 /dev/vg0/imgtemp
root@kvm:~# mount /dev/vg0/imgtemp /mnt

Fájlrendszert ízlés szerint. Előállt tehát egy ideiglenes LV (de lehet akár végleges is, a későbbiekben kiderül, most miért ideigleneset készítünk).

Húzzuk át a fájlokat (a konténer ne fusson mindeközben).
root@kvm:~# rsync -avzr lxcserver:/var/lib/lxc/server1/rootfs/* /mnt/
root@kvm:~# umount /mnt

Most jön a kiderülés: jelen esetben a KVM qcow2 qemu image-eket használ (használhatna akármit, de itt most ez volt a standard). Konvertáljuk át.

root@kvm:~# qemu-img convert -O qcow2 /dev/vg0/imgtemp /storage/servers/server1.qcow2

A továbbiakban szükségünk lesz egy live disztróra, hogy tudjunk faragni kernelt és grubot.
Wget segítségével húzzunk le egyet (a példában a /storage alatt fognak lakni az image-ek mappákra bontva, az iso-t a /storage alá helyezem el). Én a Debian standard live iso-t használtam, használhatsz bármi mást is.

Ha ez megvan, akkor készítsük el a virtuális gépet. Ehhez készítünk egy XML-t.


root@kvm:~# mcedit ./server1.xml

(sajnos itt nem tudom beszúrni a példakonfigot, mert a Drupál állandóan lenyeli az XML tageket).
A konfigban adjuk meg, hogy a boot eszköz a cdrom legyen, és tegyük bele az iso-ra mutató bejegyzést is.
(itt egy példa rá)

Készítsük el a gépet.
A behúzott gépet nyissuk meg szerkesztésre, ellenőrizzük le, majd mentsük el (mindenképpen menteni kell, különben a gép leállítása után elvesztjük a beállításokat -> vi lesz, itt írjuk át a MAC-címet, mert ha nem adtuk már meg a konfban, akkor adott neki valami randomot, :wq)!

root@kvm:~# virsh create ./server1.xml
root@kvm:~# virsh edit server1
root@kvm:~# rm ./server1.xml

Meg is tarthatjuk az ideiglenes XML-t, ha további gépeket kell még migrálni, templatenek jó lesz.


root@kvm:~# virsh start server1

A következő lépéshez szükséges például a Virtual Machine Manager, hogy konzolt kapjunk.
Nyissuk meg a beindult live rendszert a fenti eszközzel, majd váltsunk root-ra (sudo su) és jöhet chroot mókázás.

root@live:~# mount /dev/sda /mnt
root@live:~# mount -o bind /dev /mnt/dev
root@live:~# mount -o bind /proc /mnt/proc
root@live:~# cp /etc/resolv.conf /mnt/etc/
root@live:~# chroot /mnt

Jelen esetben egy Debian volt hostolva az LXC-ben, így apt-get jön (nyílván egy CentOS esetén most yum jön).
Frissítsük le a listát, telepítsük a kernelt és a grubot.

root@chroot:~# apt-get update
root@chroot:~# apt-get install linux-image-amd64
root@chroot:~# apt-get install grub2

Grub2 majd jól megkérdi, hova menjen önmaga, sok lehetőséget elvileg nem fog adni, tehát /dev/sda.

Ha kész, lépjünk ki a chroot-ból, csatoljuk le, amit felcsatoltunk és lőjük le a gépet.

root@chroot:~# exit

root@live:~# umount /mnt/proc
root@live:~# umount /mnt/dev
root@live:~# umount /mnt

root@live:~# shutdown -h now

Szerkesszük át a konfot, hogy most már a diskről bootoljon.

root@kvm:~# virsh edit server1

- dev='cdrom'
+ dev='hd'

Ha mindent jól csináltunk, akkor a gép el fog indulni.

root@kvm:~# virsh start server1

Ha minden oké, akkor az ideiglenes LV-t törölhetjük is (már ha tényleg ideiglenesnek csináltuk).

Utólag is köszönöm a segítségeket!

Hozzászólások

subs :)
(BTW, engem a fordítottja is érdekelne, sok esetben overkill a kvm, az lxc "kevesebbet fogyaszt".)

Amit megörököltem rendszert, azt migrálni kellett a régi szervereiről, mert azokat felmondták, a célhelyen meg KVM volt. Ezért a 4 alig terhelt virtuális gépért nem állítunk be egy új vasat, csak hogy LXC legyen rajta.

Én amúgy jobb szeretem a full virtualizációt, mint a konténeres hókabókát. Ahol közös a kernel, ott a ló .....sza is túrós. De ez csak az én berögződésem, mindenkinek vannak rigolyái.

Blog necromancert játszom, hátha belefut más is (pár hónapja a fentihez hasonló módszerrel migráltam lxc-ről kvm-re néhány gépet és most unatkoztam annyira, hogy megjavítsam, ami eddig zavart :) ): ha rengeteg minden nem működik, miután debillányt LXC-ből átviszel KVM-be (úgy is, mint: ACPI alapú leállítás [minek az], qemu-guest-agent [minek az] és hasonlók), a systemd-udevd unmaskolása segíthet...

Ill. a fenti rsync parancsot még érdemes lehet az rsync-nek még egy -X (xattr) és -A (aclek) paramétert is adni, ha pl. samba megosztás is van a migrált gépen (samba konfigtól függően ott tárolja az ACL-eket)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)