Každý, kdo potřeboval někdy v životě přenést OpenVZ kontejner na server s plnohodnotnou virtualizací KVM, se setkal s určitými problémy:
- Většina informací je bohužel zastaralá a byla relevantní pro již dávno minulý EOL cyklus operačního systému
- Různé operační systémy vždy poskytují různé informace a nikdy nezohledňují možné chyby při migraci
- Někdy se musíme vypořádat s konfiguracemi, které po migraci prostě nefungují
Když přesouváte 1 server, vždy je možné něco na místě opravit, ale co když přesouváte celý cluster?
V tomto článku se pokusím popsat, jak správně migrovat OpenVZ kontejner na KVM s minimálním výpadkem a rychlým vyřešením všech problémů.
Malý kurz: co je to OpenVZ a co je to KVM?
Nebudeme se prohlubovat v terminologii, řekneme to zhruba:
OpenVZ — virtualizace na úrovni operačního systému, kterou lze rozběhnout dokonce i na mikrovlnce, protože není potřeba mít instrukce CPU a technologie virtualizace na hostitelském stroji.
KVM — plnohodnotná virtualizace, která využívá veškerou sílu CPU a dokáže virtualizovat cokoliv, jakýmkoliv způsobem, řezat napříč a podél.
Na rozdíl od běžného názoru, že v prostředí hostingových poskytovatelů OpenVZ se overselluje a KVM ne — máme to štěstí, že dnes se KVM overselluje aniž by ztratil svou reputaci.
Co budeme přenášet?
Jako pokusné subjekty pro přenos jsme museli použít celou plejádu operačních systémů dostupných na OpenVZ: CentOS (6 a 7 verze), Ubuntu (14, 16 a 18 LTS), Debian 7.
Předpokládalo se, že na většině kontejnerů OpenVZ běží nějaký LAMP, a někteří mají dokonce velmi specifický software. Nejčastěji to byly konfigurace s ovládacím panelem ISPmanager, VestaCP (a většinou, neaktualizované po mnoho let). Je nutné vzít v úvahu i jejich požadavky na migraci.
Migrace probíhá se zachováním IP adres přenášeného kontejneru, budeme považovat, že IP, která byla u kontejneru, se zachová na VM a bude fungovat bez problémů.
Před přenosem se ujistíme, že máme vše po ruce:
- Server OpenVZ, plný root přístup k hostitelskému stroji, možnost zastavovat/montovat/spouštět/mazat kontejnery
- Server KVM, plný root přístup k hostitelskému stroji, se všemi důsledky. Předpokládá se, že vše je již nastaveno a připraveno k práci.
Začínáme s přenosem
Než začneme s přenosem, vyjasněme si termíny, které nám pomohou se neztratit:
KVM_NODE — hostitelský stroj KVM
VZ_NODE — hostitelský stroj OpenVZ
CTID — kontejner OpenVZ
VM — virtuální server KVM
Příprava na přenos a vytvoření virtuálních strojů.
Krok 1
Jelikož potřebujeme někam přesunout kontejner, vytvoříme VM s podobnou konfigurací na KVM_NODE.
Důležité! VM musí být vytvořena přesně na tom operačním systému, který běží na CTID. Například, pokud je na CTID nainstalována Ubuntu 14, pak na VM musíme rovněž nainstalovat Ubuntu 14. Drobné verze nejsou důležité a jejich nesoulad není tak kritický, ale hlavní verze musí být shodné.
Po vytvoření VM provedeme aktualizaci balíčků na CTID a na VM (neplést s aktualizací OS — to neaktualizujeme, pouze balíčky a, pokud dojde, verzi OS v rámci hlavní verze).
Pro CentOS vypadá tento proces nevinně:
# yum clean all
# yum update -yA stejně nevinně pro Ubuntu, Debian:
# apt-get update
# apt-get upgradeKrok 2
Instalujeme na CTID, VZ_NODE a VM nástroj rsync:
CentOS:
# yum install rsync -yDebian, Ubuntu:
# apt-get install rsync -yNic jiného nenainstalujeme ani tam, ani tam.
Krok 3
Provádíme zastavení CTID na VZ_NODE příkazem
vzctl stop CTIDPřipojujeme obraz CTID:
vzctl mount CTIDPřejdeme do složky /vz/root/CTID a provedeme
mount --bind /dev dev && mount --bind /sys sys && mount --bind /proc proc && chroot .Pod chrootem vytvoříme soubor /root/exclude.txt — ten bude obsahovat seznam výjimek, které se nedostanou na nový server
/boot
/proc
/sys
/tmp
/dev
/var/lock
/etc/fstab
/etc/mtab
/etc/resolv.conf
/etc/conf.d/net
/etc/network/interfaces
/etc/networks
/etc/sysconfig/network*
/etc/sysconfig/hwconf
/etc/sysconfig/ip6tables-config
/etc/sysconfig/kernel
/etc/hostname
/etc/HOSTNAME
/etc/hosts
/etc/modprobe*
/etc/modules
/net
/lib/modules
/etc/rc.conf
/usr/share/nova-agent*
/usr/sbin/nova-agent*
/etc/init.d/nova-agent*
/etc/ips
/etc/ipaddrpool
/etc/ips.dnsmaster
/etc/resolv.conf
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-ens3Připojíme se k KVM_NODE a spustíme náš VM, aby byl aktivní a přístupný přes síť.
Nyní je vše připraveno k přesunu. Jdeme na to!
Krok 4
Pořád pod chrootem provedeme
rsync --exclude-from="/root/exclude.txt" --numeric-ids -avpogtStlHz --progress -e "ssh -T -o Compression=no -x" / root@KVM_NODE:/Příkaz rsync provede přenos, doufáme, že klíče jsou jasné — přenos se provádí s zachováním symbolických odkazů, oprávnění, vlastníků a skupin a šifrování je vypnuto pro vyšší rychlost (bylo by možné použít nějaký rychlejší cipher, ale to v rámci této úlohy není tak zásadní), stejně jako je také vypnuto komprese.
Po dokončení rsync vystoupíme z chrootu (stisknutím ctrl+d) a provedeme
umount dev && umount proc && umount sys && cd .. && vzctl umount CTIDKrok 5
Provedeme několik akcí, které nám pomohou při spuštění VM po přenosu z OpenVZ.
Na serverech s Systemd provádíme příkaz, který nám pomůže se přihlásit do běžné konzole, například přes VNC obrazovku serveru
mv /etc/systemd/system/getty.target.wants/getty@tty2.service /etc/systemd/system/getty.target.wants/getty@tty1.serviceNa serverech CentOS 6 a CentOS 7 určitě nainstalujeme čerstvé jádro:
yum install kernel-$(uname -r)Server může být z něj bootován, ale po migraci může přestat fungovat nebo být odstraněn.
Na serveru CentOS 7 je třeba aplikovat malou opravu pro PolkitD, jinak server spadne do nekonečného bootu:
getent group polkitd >/dev/null && echo -e "e[1;32mpolkitd group already exists e[0m" || { groupadd -r polkitd && echo -e "e[1;33mAdded missing polkitd group e[0m" || echo -e "e[1;31mAdding polkitd group FAILED e[0m"; }
getent passwd polkitd >/dev/null
&& echo -e "e[1;32mpolkitd user already exists e[0m" || { useradd -r -g polkitd -d / -s /sbin/nologin -c "User for polkitd" polkitd && echo -e "e[1;33mAdded missing polkitd user e[0m" || echo -e "e[1;31mAdding polkitd user FAILED e[0m"; }
rpm -Va polkit* && echo -e "e[1;32mpolkit* rpm verification passed e[0m" || { echo -e "e[1;33mResetting polkit* rpm user/group ownership & perms e[0m"; rpm --setugids polkit polkit-pkla-compat; rpm --setperms polkit polkit-pkla-compat; }Na všech serverech, pokud byl nainstalován mod_fcgid pro Apache, provedeme malou opravu práv, jinak budou weby využívající mod_fcgid padat s chybou 500:
chmod +s `which suexec` && apachectl restartA nakonec, to bude užitečné pro Ubuntu a Debian distribuce. Tato OS může spadnout do nekonečného bootu s chybou
looping too fast. throttling execution a little
nepříjemné, ale snadno se opraví, v závislosti na verzi OS.
Na Debian 9 oprava vypadá takto:
provádíme
dbus-uuidgenpokud dostaneme chybu
/usr/local/lib/libdbus-1.so.3: version `LIBDBUS_PRIVATE_1.10.8′ not found
ověřujeme existenci LIBDBUS
ls -la /lib/x86_64-linux-gnu | grep dbus
libdbus-1.so.3 -> libdbus-1.so.3.14.15
libdbus-1.so.3.14.15 <-- potřebujeme tento
libdbus-1.so.3.14.16pokud je vše v pořádku, provedeme
cd /lib/x86_64-linux-gnu
rm -rf libdbus-1.so.3
ln -s libdbus-1.so.3.14.15 libdbus-1.so.3Pokud to nepomůže — zkoušíme druhou variantu.
Druhá varianta řešení problému s throttling execution a little vyhovuje prakticky všem Ubuntu a Debian distribucím.
Provádíme
bash -x /var/lib/dpkg/info/dbus.postinst configureA pro Ubuntu 14, Debian 7 navíc provedeme:
adduser --system --home /nonexistent --no-create-home --disabled-password --group messagebus
rm -rf /etc/init.d/modules_dep.sh Co jsme udělali? Obnovili jsme messagebus, který chyběl pro spuštění Debian/Ubuntu a odstranili jsme modules_dep, který přišel od OpenVZ a bránil bootování mnoha jádrových modulů.
Krok 6
Restartujeme VM, zkontrolujeme v VNC, jak probíhá bootování, a ideálně — vše se načte bez problémů. I když se po migraci mohou objevit některé specifické problémy — ale ty přesahují rámec tohoto článku a opravují se podle potřeby.
Doufám, že tyto informace budou užitečné! 🙂
Zdroj: habr.com
