XenServer – export VM to file

Sometime you need to make quick and dirty image backup of VM running on XenServer and this post is about such case 馃檪

List machines:

~ # xl list
Name                    ID   Mem VCPUs    State    Time(s)
Domain-0                 0  4066     8     r-----  3526567.3
webfront1.example.com    1  4096     4     r-----  3186487.2
webfront2.example.com    2  2048     2     -b----  920408.2

Now you may export one:

~# xe vm-export vm=webfront1.example.com filename=/srv/backup/webfront.xva
Export succeeded

You may also use uuid for that – list machines with xe vm-list (best with less) and then:

xe vm-export uuid=1234a43d-c5af-f1ef-b3c1-12347f63d84c filename=/srv/backup/webfront.xva

That's all!

Kopiowanie wolumen贸w LVM z dd i netcat

Niedawno chcia艂em skopiowa膰 maszyn臋 wirtualn膮 z jednego hypervisora na innego. By艂y to 3 wolumeny LVM o rozmiarach od 50 do 100GB. Dawno temu zrobi艂em sobie skrypty do backupu – jeden kompresuje wolumeny LVM – a drugi pozwala odtworzy膰 z dekompresja na drugim serwerze. Tyle 偶e przy tak du偶ej maszynce b臋dzie to trwa艂o masakrycznie d艂ugo – fajnie by艂oby m贸c r贸wnocze艣nie kopiowa膰 i odtwarza膰 (live)…

I wtedy przypomnia艂o mi si臋 narz臋dzie netcat – zrobi艂em snapshoty wolumen贸w i mog艂em zaczyna膰. W najbardziej podstawowej wersji potrzebowa艂em tylko tyle:

  • na 藕r贸dle:
    dd if=/dev/vgsas/vm1-sys | pv --size 50G | nc -l -p 8888
  • na docelowym:
    nc 192.168.1.10 8888 | dd of=/dev/vgsas/vm1-sys

Lub wariacje z kompresj膮:

  • na 藕r贸dle:
    dd if=/dev/vgsas/vm1-sys | pv --size 50G | pigz -2 | nc -l -p 8888
  • na docelowym:
    nc 192.168.1.10 8888 | pigz -d | dd of=/dev/vgsas/vm1-sys

No dobra – pv nie jest najbardziej podstawowe… Ale umo偶liwia podgl膮d post臋pu wysy艂ania/obierania (zale偶y, z kt贸rej strony go wrzuci膰) co przy tak d艂ugim procesie jest niezmiernie przydatne.
Do kompresji zaleca艂bym pigz (czyli Parallel GZIP) z ratio dostosowanym do przepustowo艣ci sieci – po gigabicie si臋 nie op艂aca艂o nawet na o艣miordzeniowcu.

Montowanie partycji z obrazu dysku

Jedn膮 z rzeczy, kt贸re podobaj膮 mi si臋 w maszynach wirtualnych Xen jest mo偶liwo艣膰 zrobienia backupu ca艂ego obrazu i szybkie odzyskanie ju偶 w trakcie ci臋偶kiej awarii. Gdy dodatkowo korzysta si臋 z LVM’a to mo偶na na chwil臋 wy艂膮czy膰 DomU, utworzy膰 snapshot jego dysk贸w, uruchomi膰 DomU i w trakcie dzia艂ania robi膰 sp贸jny backup ze snapshot’a. Dzi臋ki takiemu mechanizmowi serwer jest niedost臋pny przez kilkana艣cie sekund, a backup sp贸jny jakby zosta艂 wykonany przy ca艂kowicie wy艂膮czonej maszynie. Taki backup sprowadza si臋 do kilku polece艅 kt贸re mo偶na oskryptowa膰 np.:

lvcreate -L1000M -s -n volumendomu-snap /dev/vg/volumendomu
dd if=/dev/vg/volumendomu | gzip -9 > backup.img.gz

Problem pojawia si臋 przy pr贸bie montowania takiego snapshot’a by uzyska膰 dost臋p do plik贸w gdy na volumenie LVM zostanie utworzona partycja i dopiero ona formatowana (domy艣lnie przy ext3/4). Czyli potrzebujemy zamontowa膰 partycj臋 z volumenu LVM ale ta nie jest wprost widoczna (nie ma urz膮dzenia np. /dev/vg/volumendomu1).

Ten sam problem pojawia si臋 przy dost臋pie do partycji “zaszytych” w obrazie zrzuconym narz臋dziem dd z ca艂ego dysku, np.:

dd if=/dev/sda of=/mnt/backups/somewhere.img

W obu przypadkach w obrazie/wolumenie jest zaszyta partycja i przy pr贸bie montowania dostaniemy tylko monit o nieznanym typie systemu plik贸w.

By wylistowa膰 partycje wewn膮trz obrazu lub wolumenu najwygodniej聽pos艂u偶ym膰 si臋 narz臋dziem parted :

sudo聽parted -s /mnt/backups/somewhere.img "unit B print"
Model: (file)
Dysk /mnt/backups/somewhere.img: 500105740288B
Rozmiar sektora (logiczny/fizyczny): 512B/512B
Tablica partycji: msdos

Numer Pocz膮tek Koniec Rozmiar Typ System plik贸w Flaga
 1 1048576B 500105740287B 500104691712B primary ntfs

Parted mo偶e dzia艂a膰 albo w trybie interaktywnym albo razem z parametrem -s聽podajemy na ko艅cu聽skrypt z poleceniami kt贸re maj膮 zosta膰 podane. Powy偶sze wywo艂anie zmienia jednostki z kilo/megabajt贸w na bajty (dok艂adnie tego potrzebujemy jako offset – nic nie b臋dziemy musieli przelicza膰).

Teraz mo偶emy pr贸bowa膰 zamontowa膰 dan膮 partycj臋 korzystaj膮c z parametru offset w mount, np. tak:

sudo mount -o loop,ro,offset=1048576 -t ntfs /mnt/backups/somewhere.img /mnt/test

Je艣li posiadamy stosunkowo aktualne wersje jajka i pakietu util-linux to powy偶sza sztuczka powinna si臋 uda膰. Je艣li takowych nie posiadamy to mo偶emy mie膰 problemy przy pr贸bie montowania kolejnych partycji. Wtedy mo偶e by膰 potrzebne rozpakowania pojedynczej partycji z obrazu poleceniem dd.

Xen – Podstawowe polecenia

Pisa艂em ju偶 HOWTO o konfiguracji Xen’a聽ale nie opisa艂em jak si臋 bawi膰 wirtualkami gdy Xen’a ju偶 mamy. To nadrabiam.

Tworzenie i usuwanie maszyn wirtualnych

Do tworzenia/niszczenia DomU wykorzystuj臋 pakiet xen-tools dostarczaj膮cy m.in. dwa narz臋dzia:

  • xen-create聽– dla kt贸rego przygotowa艂em do艣膰聽skomplikowan膮聽konfiguracj臋 przy okazji wcze艣niejszego posta: Instalacja i konfiguracja DomU. Przyk艂ad u偶ycia:
    xen-create --hostname example-domu --ip 10.0.0.77 \
    --gateway 10.0.0.1 --broadcast 10.0.0.255 --netmask 255.255.255.0 \
    --bridge br10 --vcpus 2 --memory=2G
  • xen-delete-image聽– narz臋dzie do kasowania wirtualnych maszyn. Maszyna musi by膰 wy艂膮czona aby mo偶na by艂o j膮 usun膮膰. Narz臋dzie to kasuje plik konfiguracyjny maszyny wirtualnej oraz przydzielone jej volumeny lvm.
    Przyk艂ad u偶ycia:

    xen-delete-image nazwamaszyny

Zarz膮dzanie maszynami wirtualnymi

Do uruchamiania, wy艂膮czanie, resetowania (i og贸lnie zarz膮dzania) maszynami wirtualnymi s艂u偶y tylko jedno polecenie:聽xm聽z r贸偶nymi parametrami:

  • xm list聽– listuje uruchomione w danej chwili wirtualne maszyny, wy艣wietlaj膮c przydzielon膮 im ilo艣膰 pami臋ci, procesor贸w, stan (uruchomiona, zawieszona), czas dzia艂ania (uptime). Dla obja艣nienia Domain-0 (zwane te偶 Dom-O) to hyperwisor czyli fizyczna maszyna na kt贸rej uruchomione s膮 wirtualki.
  • xm top聽– polecenie wy艣wietla dok艂adne dane chwilowego zu偶ycia zasob贸w dla r贸偶nych wirtualnych maszyn i Dom-0.
  • xm create nazwapliku.cfg聽– uruchamia maszyn臋 wirtualn膮 zgodnie z instrukcjami zawartymi w pliku konfiguracyjnym (przydzielone dyski, pami臋膰, etc).
  • xm shutdown nazwamaszyny聽– wysy艂a sygna艂 wy艂膮czenia maszyny wirtualnej i wraca do wiersza polece艅. Dok艂adnie to polecenie wysy艂a sygna艂 ACPI r贸wnowa偶ny przyci艣ni臋ciu przycisku Power na obudowie komputera – system operacyjny wykrywa to zdarzenie i zaczyna si臋 wy艂膮cza膰. Jest to zalecana instrukcja do wy艂膮czania wirtualek. Nale偶y pami臋ta膰, 偶e po wykonaniu tego polecenia jeszcze przez kilka/kilkana艣cie sekund maszyna dzia艂a – do puki nie sko艅czy si臋 wy艂膮cza膰.
  • xm shutdown -w nazwamaszyny聽– dzia艂a jak powy偶sze polecenie, ale dodatkowo czeka a偶 maszyna wirtualna zostanie wy艂膮czona a przydzielone jej zasoby zwolnione. Gdy to polecenie sko艅czy si臋 wykonywa膰 mamy pewno艣膰, 偶e maszyna jest ju偶 wy艂膮czona.
  • xm destroy nazwamaszyny聽– polecenie do twardego resetu maszyny wirtualnej. Najpierw odbierany jest czas procesora dla maszyny, potem zwalniana pami臋膰 i zarezerwowane uchwyty. Wykorzystuj膮c to polecenie mo偶e doj艣膰 do utraty danych lub uszkodzenia聽OS‘u na wirtualnej maszynie.
  • xm reboot nazwamaszyny聽– restartuje maszyn臋 wirtualn膮 w bezpieczny spos贸b (czyli wysy艂a sygna艂 ACPI do聽wy艂膮czenia聽i startuje DomU). Gdy zmodyfikujemy plik konfiguracyjny danego DomU nie wystarczy wywo艂a膰 xm reboot – przewa偶nie potrzeba po艂o偶y膰 maszyn臋 i ponownie j膮 uruchomi膰, np. tak:
    xm shutdown -w maszyna && xm create maszyna.cfg
  • xm pause nazwamaszyny聽– pauzuje wirtualn膮 maszyn臋, zamra偶aj膮c j膮 w obecnym stanie razem z pami臋ci膮 itd.
  • xm unpause nazwamaszyny聽– uruchamia zapauzowan膮 wcze艣niej maszyn臋 wirtualn膮. Dzia艂a odwrotnie do polecenia powy偶ej.
  • xm console nazwamaszyny – polecenie dzia艂a jak 鈥瀙odpi臋cie monitora鈥 do fizycznej maszyny, na pierwszy terminal. Bardzo przydatne zaraz po utworzeniu wirtualki jak r贸wnie偶 w r贸偶nych sytuacjach kryzysowych 馃槈

Jest jeszcze kilka innych polece艅 np. dodaj膮cych na gor膮co urz膮dzenia blokowe ale ich dzia艂anie mocno zale偶y od wersji Xen’a i jajka.

Xen – Konfiguracja interfejsu sieciowego Dom0 jako brdige’a dla VLAN’贸w

VLAN’y s膮 prost膮 metod膮 na separacj臋 sieci. Gdy mamy wiele sieci mo偶e zaj艣膰 potrzeba by poszczeg贸lne DomU mia艂y dost臋p do r贸偶nych VLAN’贸w (czasem nawet wielu r贸wnocze艣nie). Je偶eli serwer z Dom0 posiada minimum聽giga-bitow膮聽kart臋 sieciow膮 (a najlepiej kilka) to powinni艣my by膰 w stanie z godziw膮 jako艣ci膮 udost臋pni膰 systemom DomU r贸偶ne VLAN’y z interfejs贸w gospodarza.

Zaprezentowane poni偶ej skrypty zapo偶yczy艂em z tej strony:聽http://renial.net/weblog/2007/02/27/xen-vlan

Na pocz膮tek musimy zainstalowa膰 pakiet vlan:

apt-get install vlan

P贸藕niej w pliku /etc/xen/xend-config.sxp ustawiamy taka skrypt dla konfiguracji sieci:

(network-script network-multi-vlan)

Tworzymy plik /etc/xen/scripts/network-multi-vlan i wpisujemy w nim (no dobra – komentarze mo偶na pomin膮膰):

#!/bin/sh
#===================================================================
# Xen vlan bridge start/stop script.
# Xend calls a network script when it starts.
# The script name to use is defined in /etc/xen/xend-config.sxp
# in the network-script field.
#
# This script creates multiple bridges to segregate individual
# domUs to separate VLANs. Customize to fit your needs.
#
# Usage:
#
# network-multi-vlan (start|stop|status)
#
#===================================================================

dir=$(dirname "$0")

# Poni偶sza linijka pozwala udost臋pni膰 dany interfejs sieciowy
# w ca艂o艣ci jako domy艣lny bridge - je艣li chcemy si臋 ograniczy膰
# wy艂膮cznie do bridge'y na VLAN'ach to mo偶emy t膮 linijk臋
# zakomentowa膰 (jak ja)
"$dir/network-bridge" "$@" vifnum=0 netdev=eth0

# No i teraz odpalamy kolejne VLAN'y na poszczeg贸lnych interfejsach.
# Brak parametru netdev jest r贸wnoznaczny wybraniu netdev=eth0
# Parametr VLAN jest... hm... samoopisuj膮cy
"$dir/network-bridge-vlan" "$@" vlan=10 netdev=eth1
"$dir/network-bridge-vlan" "$@" vlan=11
"$dir/network-bridge-vlan" "$@" vlan=23 netdev=eth2

Pobieramy skrypt聽network-bridge-vlan聽do lokalizacji:聽/etc/xen/scripts/network-bridge-vlan.

cd /tmp
wget https://gagor.pl/wp-content/uploads/2012/06/network-bridge-vlan.gz
gunzip network-bridge-vlan.gz
mv network-bridge-vlan聽/etc/xen/scripts/network-bridge-vlan

殴r贸d艂a: