ディレクトリをQEMU / KVM仮想ディスクイメージに変換


10

/var/backups/disk1QEMUまたはKVMを使用して起動できる仮想ディスクイメージに変換したいデータが入ったディレクトリがあります(ディレクトリには、rsyncを介してコピーされた仮想マシンのファイルシステムが含まれています)。

完全な物理ディスクを仮想ディスクに変換するための指示はたくさんありますが、単一のディレクトリのコンテンツのみを仮想ディスクイメージにパッケージ化することは、予想よりもはるかに困難であることが判明しています。何か案は?

ところで、私qemu-imgはブロックデバイスを仮想ディスクに変換するために使用できることを知っています(例qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2:)。そのため、ディレクトリ/var/backups/disk1をブロックデバイスのように見せることができれば、理論的にはqemu-img。しかし、NBDまたはループバックデバイスを使用してディレクトリをブロックデバイスとして公開するクリエイティブな方法を考えましたが、成功していません。

回答:


16

まず、必要なサイズの未加工画像を作成します。10Gで十分だと思います。seekを使用すると、スパースファイルが作成され、スペースが節約されます。

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

次に、その上にファイルシステムを作成します。

mkfs.ext4 -F example.img

(ディスクパーティションではなく、ファイルを操作する-Fためのオプションが必要であることに注意してくださいmkfs.ext4

次に、マウントします。

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

これで、ファイルを/ mnt / exampleにコピーできます。これが完了したら、マウントを解除すると、仮想マシンのドライブとしてexample.imgを使用できます。必要に応じて、生の画像からqemu-imgを使用してqcow2eなどの別の形式に変換できますが、これは必須ではありません。


1
qemu-imgおよびfallocateよりも少し便利ですdd
Ciro Santilli冠状病毒审查六四事件法轮機能



4

virt-make-fslibguestfsのqcow2例から

/server//a/332114/163884はそれを言及しましたが、ここに完全な例があります:

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 

sudoインストールとUbuntuのバグの回避策を除いて、どのように必要とされないかに注意してください。

次に、QEMUが実際にそれを読み取ることができることを確認しました。

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

その後、QEMU Linux内にイメージをマウントして、ファイルを読み取ることができます。

virt-make-fs 次の例

この素晴らしいツールは、生のextファイルシステムを作成することもできます。例:

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

ホストで直接確認できます:

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

画像サイズの最小化

の非常に優れた機能virt-make-fsは、必要な場合は自動的に画像サイズを最小化しようとすることです。

Virt-make-fsはデフォルトで余分なスペースを最小限に抑えますが、必要に応じて--sizeフラグを使用してファイルシステムにスペースを残すことができます。

そう:

df -h

画像が82%塗りつぶされていることを教えてくれます。

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

次のようにして、最小値の上に余分なスペースを簡単に追加できます--size-=+

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

ext4ジャーナルのオーバーヘッド

マニュアルには、次のことも記載されています。

ext3ファイルシステムには、通常1〜32 MBのサイズのジャーナルが含まれていることに注意してください。ジャーナルを必要とする方法でファイルシステムを使用しない場合、これはオーバーヘッドの無駄になります。

そしてそれを確認することは興味深いです:

du -bs *

生成されるもの:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

ext4が大幅に大きくなったことがわかります。

libguestfs Ubuntuのバグ

欠点としては、現在Ubuntuのメンテナがいないようで、ライブラリは通常、Ubuntuにバグがあります。

sudo理論的には必須ではありませんが、回避策を実行しない限り、Ubuntuのパッケージングバグのために必須です。https//askubuntu.com/questions/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.

その後、回避策がないと、18.04(16.04ではなく)は次のエラーで失敗します:https : //bugzilla.redhat.com/show_bug.cgi?id=1591617

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

すでに上流で修正されているバグが原因です。

Ubuntu 18.04、libguestfs-tools 1:1.36.13-1ubuntu3、QEMU 1:2.11 + dfsg-1ubuntu7.3でテストされています。


1

Fedora 23でのMichaels戦略の使用:

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

これにより、ext2ファイルシステムが作成され、いくつかのディレクトリにマウントできます。

# mount file.fs /mnt 

/ mntにすべてのファイルが含まれるようになりました


file.fsがファイルの場合、mountコマンドは次のようにすべきではありませんmount -o loop file.fs /mnt
kasperd

0

ターゲット仮想ディスクイメージにマウントされているVMからネットワーク共有としてディレクトリにアクセスするのはどうですか?共有からマウントされたディスクイメージへの単純なコピーを実行するだけではありません。


これはうまくいくはずで、VMを構築してデータをrsyncするという私の現在の戦略に似ています。ただし、より速くてよりクリーンなソリューションがあったらすばらしいでしょう。fstabや/ bootのほとんどのものなど、コピーしてはならない特定のファイルを除外することを心配する必要があるため、データを新しいマシンにコピーするのはかなり面倒になります
Chris

「fstabや/ boot内のほとんどのものなど、コピーしてはならない特定のファイルを除外する」-VMターゲットが追加ボリュームの場合、それほど問題にはならない可能性があります。
user48838 2011年

0

私はCiro Santilliの答えを好みます(使用します)が、guestfishシェルで動作するものは次のとおりです。

# 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.