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.