Konversi direktori ke image disk virtual QEMU / KVM

10

Saya memiliki direktori yang diisi dengan data /var/backups/disk1yang ingin saya konversi menjadi image disk virtual yang kemudian saya bisa boot menggunakan QEMU atau KVM (direktori berisi sistem file untuk mesin virtual, disalin melalui rsync).

Meskipun ada banyak instruksi di luar sana untuk mengubah disk fisik lengkap menjadi disk virtual, mengemas hanya isi direktori tunggal menjadi gambar disk virtual ternyata jauh lebih sulit daripada yang saya harapkan. Ada ide?

Ngomong-ngomong, saya tahu saya bisa menggunakan qemu-imguntuk mengubah perangkat blok menjadi disk virtual (misalnya, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2), jadi jika saja saya bisa membuat direktori /var/backups/disk1tampak sebagai perangkat blok, maka secara teoritis saya harus dapat mencapai tujuan saya menggunakan qemu-img. Saya sudah memikirkan cara-cara kreatif untuk mengekspos direktori sebagai perangkat blok menggunakan NBD atau perangkat loopback, dan belum berhasil.

Chris
sumber

Jawaban:

16

Pertama, buat gambar mentah dari ukuran yang dibutuhkan. Saya akan menganggap 10G sudah cukup. Menggunakan seek menciptakan file yang jarang , yang menghemat ruang.

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

Selanjutnya, buat sistem file di atasnya.

mkfs.ext4 -F example.img

(Perhatikan bahwa Anda memerlukan -Fopsi untuk mkfs.ext4beroperasi pada file yang bertentangan dengan partisi disk)

Lalu, pasang.

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

Sekarang Anda dapat menyalin file Anda ke / mnt / example. Setelah ini selesai, unmount dan Anda dapat menggunakan example.img sebagai drive di mesin virtual. Jika mau, Anda dapat mengonversinya dari gambar mentah ke format lain seperti qcow2e menggunakan qemu-img, tetapi ini tidak diperlukan.

sciurus
sumber
1
qemu-imgdan fallocatesedikit lebih nyaman daripada dd.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
Cara menghitung ukuran minimum yang disyaratkan: unix.stackexchange.com/questions/353156/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
4

virt-make-fsdari qcow2contoh libguestfs

https://serverfault.com/a/332114/163884 menyebutkannya, tetapi berikut adalah contoh lengkapnya:

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 

Perhatikan bagaimana sudotidak diperlukan, kecuali untuk instalasi dan solusi bug Ubuntu.

Saya kemudian memverifikasi bahwa QEMU benar-benar dapat membacanya dengan:

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

Saya kemudian dapat memasang gambar di dalam QEMU Linux dan membaca file.

virt-make-fs contoh ext

Alat luar biasa ini juga dapat membuat filesystem raw ext, misalnya:

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

yang dapat kami verifikasi langsung pada host dengan:

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

Minimalisasi ukuran gambar

Fitur yang sangat bagus virt-make-fsadalah ia secara otomatis mencoba memperkecil ukuran gambar jika itu yang kita inginkan:

Virt-make-fs default untuk meminimalkan ruang ekstra, tetapi Anda dapat menggunakan flag --size untuk meninggalkan ruang di sistem file jika Anda menginginkannya.

begitu:

df -h

memberi tahu saya bahwa gambar diisi 82%:

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

Kami dapat dengan mudah menambahkan beberapa ruang ekstra di atas minimum dengan --size-=+:

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

overhead jurnal ext4

Manual juga menyebutkan bahwa:

Perhatikan bahwa sistem file ext3 berisi jurnal, biasanya berukuran 1-32 MB. Jika Anda tidak akan menggunakan sistem file dengan cara yang memerlukan jurnal, maka ini hanya membuang-buang overhead.

dan menarik untuk memverifikasi itu dengan:

du -bs *

yang menghasilkan:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

jadi kami melihat bahwa ext4 keluar secara signifikan lebih besar.

bug libguestf Ubuntu

Sekarang untuk sisi negatifnya: saat ini tampaknya tidak ada pengelola Ubuntu dan pustaka pada umumnya bermasalah di Ubuntu.

sudosecara teori tidak diperlukan, tetapi diperlukan karena bug pengemasan Ubuntu kecuali jika kami melakukan penyelesaian: /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.

Setelah itu, tanpa solusi kami, 18,04 (tetapi tidak 16,04) gagal dengan: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

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

karena bug yang sudah diperbaiki hulu.

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

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
sumber
1

Menggunakan strategi Michaels di Fedora 23:

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

Ini menciptakan sistem file ext2, yang dapat Anda mount ke beberapa direktori:

# mount file.fs /mnt 

Sekarang / mnt berisi semua file Anda

Jauzus
sumber
Jika file.fsadalah file, tidak seharusnya mountperintah menjadi: mount -o loop file.fs /mnt?
kasperd
0

Bagaimana dengan mengakses direktori sebagai jaringan berbagi dari VM yang juga dipasang ke gambar disk virtual target Anda? Anda lebih dari sekadar melakukan salinan sederhana dari share ke disk image yang dipasang.

pengguna48838
sumber
Itu harus bekerja, dan mirip dengan strategi saya saat ini, yaitu untuk membangun VM dan rsync data. Akan lebih bagus jika ada solusi yang lebih cepat dan lebih bersih. Menyalin data ke mesin baru menjadi sangat berantakan karena Anda harus khawatir memastikan Anda mengecualikan file tertentu yang tidak boleh disalin, seperti fstab dan sebagian besar hal di / boot
Chris
"mengecualikan file tertentu yang tidak boleh disalin, seperti fstab dan sebagian besar hal di / boot" - mungkin tidak menjadi masalah saat target VM adalah volume tambahan.
user48838
0

Saya lebih suka (dan menggunakan) jawaban oleh Ciro Santilli, tapi di sini ada sesuatu yang bekerja dengan guestfishshell:

# 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
rubik
sumber