Konwertuj katalog na obraz dysku wirtualnego QEMU / KVM


10

Mam katalog wypełniony danymi, w /var/backups/disk1którym chcę przekonwertować na obraz dysku wirtualnego, który następnie będę mógł uruchomić za pomocą QEMU lub KVM (katalog zawiera system plików maszyny wirtualnej, skopiowany przez rsync).

Chociaż istnieje wiele instrukcji konwertowania całego dysku fizycznego na dysk wirtualny, pakowanie tylko zawartości pojedynczego katalogu w obraz dysku wirtualnego okazuje się znacznie trudniejsze niż się spodziewałem. Jakieś pomysły?

Nawiasem mówiąc, wiem, że mogę qemu-imgprzekonwertować urządzenie blokowe na dysk wirtualny (np. qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2), Więc jeśli tylko mógłbym sprawić, aby katalog /var/backups/disk1wyglądał na urządzenie blokowe, to teoretycznie powinienem być w stanie osiągnąć cel, używając qemu-img. Zastanawiałem się jednak nad kreatywnymi sposobami ujawnienia katalogu jako urządzenia blokowego za pomocą NBD lub urządzenia pętli zwrotnej i nie odniosłem sukcesu.

Odpowiedzi:


17

Najpierw utwórz surowy obraz o wymaganym rozmiarze. Zakładam, że 10G wystarczy. Użycie wyszukiwania tworzy rzadki plik , który oszczędza miejsce.

dd if=/dev/null of=example.img bs=1M seek=10240

Następnie utwórz na nim system plików.

mkfs.ext4 -F example.img

(Pamiętaj, że potrzebujesz -Fopcji mkfs.ext4działania na pliku, a nie na partycji dysku)

Następnie zamontuj.

mkdir /mnt/example
mount -t ext4 -o loop example.img /mnt/example

Teraz możesz skopiować swoje pliki do / mnt / example. Gdy to zrobisz, odmontuj go i możesz użyć example.img jako napędu na maszynie wirtualnej. Jeśli chcesz, możesz przekonwertować go z surowego obrazu do innego formatu, takiego jak qcow2e, używając qemu-img, ale nie jest to wymagane.


1
qemu-imgi fallocatesą nieco wygodniejsze niż dd.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功



4

virt-make-fsz qcow2przykładu libguestfs

Wspomniał o tym https://serverfault.com/a/332114/163884 , ale oto pełny przykład:

sudo apt-get install libguestfs-tools

# Workarounds for Ubuntu 18.04 bugs. See section below.
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*

mkdir sysroot
# Just a test file.
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=qcow2 --type=ext2 sysroot sysroot.ext2.qcow2 

Zwróć uwagę, że sudonie jest to wymagane, z wyjątkiem obejścia instalacji i błędów Ubuntu.

Następnie zweryfikowałem, że QEMU może to odczytać za pomocą:

qemu-system-x86_64 -drive file=sysroot.ext2.qcow2,format=qcow2,if=virtio,snapshot ...

Jestem wtedy w stanie zamontować obraz w QEMU Linux i odczytać plik.

virt-make-fs ext przykład

To niesamowite narzędzie może również tworzyć surowe systemy plików ext, np .:

virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
virt-make-fs --format=raw --type=ext4 sysroot sysroot.ext4

które możemy zweryfikować bezpośrednio na hoście za pomocą:

mkdir -p mnt
dev="$(sudo losetup --show -f -P sysroot.ext4)"
sudo mount -o loop "$dev" mnt
cmp sysroot/myfile mnt/myfile

Minimalizacja rozmiaru obrazu

Naprawdę dobrą cechą virt-make-fsjest to, że automatycznie próbuje zminimalizować rozmiar obrazu, jeśli tego właśnie chcemy:

Domyślnie Virt-make-fs minimalizuje dodatkowe miejsce, ale możesz użyć flagi --size, aby zostawić miejsce w systemie plików, jeśli chcesz.

więc:

df -h

mówi mi, że obraz jest wypełniony w 82%:

/dev/loop17    1.5M  1.1M  244K  82% /home/ciro/test/guestfs/mnt

Możemy łatwo dodać dodatkowe miejsce ponad minimum dzięki --size-=+:

virt-make-fs --format=raw --size=+8M --type=ext2 sysroot sysroot.ext2

obciążenie dziennika ext4

Podręcznik wspomina również, że:

Należy pamiętać, że systemy plików ext3 zawierają dziennik, zwykle o wielkości 1-32 MB. Jeśli nie zamierzasz używać systemu plików w sposób, który wymaga dziennika, to jest to po prostu zmarnowane obciążenie.

i warto to sprawdzić za pomocą:

du -bs *

który produkuje:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

więc widzimy, że ext4 wyszedł znacznie większy.

błędy libuntestfs Ubuntu

Teraz na minus: wydaje się, że obecnie nie ma opiekuna Ubuntu, a biblioteka jest ogólnie wadliwa na Ubuntu.

sudonie jest teoretycznie wymagany, ale jest wymagany z powodu błędu opakowania Ubuntu, chyba że obejdziemy obejście: /ubuntu/1046828/how-to-run-libguestfs-tools-tools-such-as- virt-make-fs-without-sudo / 1046829 # 1046829

libguestfs: error: /usr/bin/supermin exited with error status 1.
To see full error messages you may need to enable debugging.
Do:
  export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
and run the command again.  For further information, read:
  http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
You can also run 'libguestfs-test-tool' and post the *complete* output
into a bug report or message to the libguestfs mailing list.
    libguestfs: error: /usr/bin/supermin exited with error status 1.

Następnie, bez naszych obejść, 18.04 (ale nie 16.04) kończy się niepowodzeniem: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

libguestfs: error: tar_in: write error on directory: /: 

z powodu błędu, który został już naprawiony w górę.

Testowany w Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3, QEMU 1: 2.11 + dfsg-1ubuntu7.3.


1

Używanie strategii Michaels w Fedorze 23:

# dnf install -y libguestfs-tools-c
# virt-make-fs --format=raw --label mylabel the_directory myfs.raw

Spowoduje to utworzenie systemu plików ext2, który można podłączyć do jakiegoś katalogu:

# mount file.fs /mnt 

Teraz / mnt zawiera wszystkie twoje pliki


Jeśli file.fsplik jest, czy mountpolecenie nie powinno być mount -o loop file.fs /mnt:?
kasperd

0

Co z dostępem do katalogu jako udziału sieciowego z maszyny wirtualnej, która jest również zamontowana na docelowym obrazie dysku wirtualnego? Zamiast wykonać zwykłą kopię z udziału na obrazie zamontowanego dysku.


To powinno działać i jest podobne do mojej obecnej strategii, która polega na zbudowaniu maszyny wirtualnej i zsynchronizowaniu danych. Byłoby wspaniale, gdyby istniało szybsze i czystsze rozwiązanie. Kopiowanie danych na nową maszynę staje się dość nieuporządkowane, ponieważ musisz się martwić o wykluczenie niektórych plików, których nie należy kopiować, takich jak fstab i większość rzeczy w / boot
Chris

„wyklucz niektóre pliki, które nie powinny być kopiowane, takie jak fstab i większość rzeczy w / boot” - może nie stanowić większego problemu, gdy celem maszyny wirtualnej jest dodatkowy wolumin.
user48838,

0

Wolę (i używam) odpowiedź Ciro Santilli, ale oto coś, co działa z guestfishpowłoką:

# assumes extant directory "rootfs"
tar -cf rootfs.tar -C rootfs .
guestfish <<EOF
disk-create rootfs.qcow2 qcow2 "$((2 * $(stat -c%s rootfs.tar)))"
add-drive rootfs.qcow2
run
part-disk /dev/sda gpt
mkfs ext4 /dev/sda
mount /dev/sda /
tar-in rootfs.tar /
umount-all
exit
EOF
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.