Dizini QEMU / KVM sanal disk görüntüsüne dönüştür


10

Ben daha /var/backups/disk1sonra QEMU veya KVM (dizin rsync ile kopyalanan bir sanal makine için dosya sistemi içerir) kullanarak önyükleme yapabileceğim bir sanal disk görüntüsüne dönüştürmek istiyorum veri dolu bir dizin var .

Tam bir fiziksel diski bir sanal diske dönüştürmek için çok sayıda talimat olsa da, sadece tek bir dizinin içeriğini sanal bir disk görüntüsüne paketlemek beklediğimden çok daha zor oluyor. Herhangi bir fikir?

Bu arada, qemu-imgbir blok cihazını bir sanal diske (örneğin, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2) dönüştürmek için kullanabileceğimi biliyorum , bu yüzden dizinin /var/backups/disk1bir blok cihaz gibi görünmesini sağlayabilseydim , teorik olarak hedefimi gerçekleştirebilmeliyim qemu-img. Ancak, NBD veya geri döngü aygıtı kullanarak bir blok cihaz olarak dizini ortaya çıkarmak için yaratıcı yollar düşündüm ve başarılı olmadı.

Yanıtlar:


17

İlk olarak, gerekli boyutta ham bir görüntü oluşturun. 10G'nin yeterli olduğunu varsayacağım. Kullanılması aramak bir oluşturur seyrek dosya alanı kazandırır.

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

Ardından, üzerinde bir dosya sistemi oluşturun.

mkfs.ext4 -F example.img

( Disk bölümünün aksine bir dosya üzerinde çalışma -Fseçeneğine ihtiyacınız olduğunu unutmayın mkfs.ext4)

Sonra monte edin.

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

Artık dosyalarınızı / mnt / example dizinine kopyalayabilirsiniz. Bu yapıldıktan sonra bağlantısını kesin ve sanal makinede example.img dosyasını sürücü olarak kullanabilirsiniz. İsterseniz, ham görüntüden qemu-img kullanarak qcow2e gibi başka bir formata dönüştürebilirsiniz, ancak bu gerekli değildir.


1
qemu-imgve fallocatebiraz daha uygun dd.
Ciro Santilli 法轮功 at 审查 六四 事件 法轮功

Gerekli minimum boyut nasıl hesaplanır: unix.stackexchange.com/questions/353156/…
Ciro Santilli


4

virt-make-fslibguestfs qcow2örneğinden

https://serverfault.com/a/332114/163884 bahsetti, ancak tam bir örnek:

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 

sudoKurulum ve Ubuntu hata çözümleri dışında, nasıl gerekli olmadığını unutmayın .

Daha sonra QEMU'nun bunu gerçekten okuyabildiğini doğruladım:

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

Daha sonra görüntüyü QEMU Linux içine monte edebilir ve dosyayı okuyabilirim.

virt-make-fs ext örneği

Bu harika araç ham ext dosya sistemlerini de yapabilir, örneğin:

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

doğrudan ana bilgisayarda doğrulayarak şunları yapabiliriz:

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

Görüntü boyutu küçültme

Gerçekten iyi bir özelliği, virt-make-fsistediğimiz buysa görüntü boyutunu otomatik olarak küçültmeye çalışmasıdır:

Virt-make-fs varsayılan olarak fazladan alanı en aza indirir, ancak isterseniz dosya sisteminde boşluk bırakmak için --size bayrağını kullanabilirsiniz.

yani:

df -h

bana resmin% 82 dolu olduğunu söylüyor:

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

Aşağıdakilerle minimumun üstüne kolayca ekstra alan ekleyebiliriz --size-=+:

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

ext4 günlük yükü

Kılavuzda ayrıca:

Ext3 dosya sistemlerinin genellikle 1-32 MB boyutunda bir günlük içerdiğini unutmayın. Dosya sistemini günlük gerektiren bir şekilde kullanmayacaksanız, bu ek yükü boşa harcar.

ve bunu aşağıdakilerle doğrulamak ilginçtir:

du -bs *

hangi üretir:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

bu yüzden ext4'ün önemli ölçüde daha büyük çıktığını görüyoruz.

libguestfs Ubuntu böcek

Dezavantajı için: Şu anda hiçbir Ubuntu bakıcısı yok gibi görünüyor ve kütüphane genellikle Ubuntu'da buggy.

sudoteoride gerekli değildir, ancak bir çözüm yapmazsak bir Ubuntu paketleme hatası nedeniyle gereklidir: /ubuntu/1046828/how-to-run-libguestfs-tools-tools-such-as- virt-make-fs-olmadan-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.

Bundan sonra, geçici çözümlerimiz olmadan, 18.04 (ancak 16.04 değil) ile başarısız olur: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

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

zaten yukarı doğru giderilen bir hata nedeniyle.

Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3, QEMU 1: 2.11 + dfsg-1ubuntu7.3'te test edilmiştir.


1

Fedora 23'te Michaels stratejisini kullanma:

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

Bu, bazı dizine bağlayabileceğiniz ext2 dosya sistemi oluşturur:

# mount file.fs /mnt 

Şimdi / mnt tüm dosyalarınızı içeriyor


Eğer file.fsbir dosya, olmamalıdır mountkomut şu şekilde: mount -o loop file.fs /mnt?
kasperd

0

Hedef sanal disk görüntünüze de bağlı bir sanal makineden dizine ağ paylaşımı olarak erişmeye ne dersiniz? Paylaşımdan takılı disk görüntüsüne basit bir kopyasını yapmaktan daha fazlası.


Bu işe yaramalı ve bir VM oluşturmak ve verileri yeniden senkronize etmek olan mevcut stratejime benziyor. Yine de daha hızlı ve daha temiz bir çözüm olsaydı harika olurdu. Verileri yeni bir makineye kopyalamak oldukça dağınık hale gelir, çünkü fstab ve / boot içindeki çoğu şey gibi kopyalanmaması gereken belirli dosyaları hariç tuttuğunuzdan emin olmanız gerekir
Chris

"fstab ve / boot içindeki çoğu şey gibi kopyalanmaması gereken belirli dosyaları hariç tut" - VM hedefi ek bir birim olduğunda bu kadar önemli olmayabilir.
user48838

0

Ciro Santilli'nin cevabını tercih ediyorum (ve kullanıyorum), ama işte bir guestfishkabukla çalışan bir şey :

# 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.