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 „podpię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: