/var/backups/disk1
にデータが入ったディレクトリがあります。これを仮想ディスクイメージに変換し、QEMUまたはKVMを使用して起動できます(ディレクトリにはrsyncを介してコピーされた仮想マシンのファイルシステム)。
完全な物理ディスクを仮想ディスクに変換するための指示はたくさんありますが、単一のディレクトリのコンテンツのみを仮想ディスクイメージにパッケージ化することは、予想よりもはるかに困難であることが判明しています。何か案は?
ところで、私はqemu-img
を使用してブロックデバイスを仮想ディスクに変換できることを知っています(たとえば、qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2
)。したがって、ディレクトリ/var/backups/disk1
をブロックデバイスであれば、理論的にはqemu-img
を使用して目標を達成できるはずです。 NBDまたはループバックデバイスを使用してディレクトリをブロックデバイスとして公開するクリエイティブな方法を考えましたが、成功していません。
まず、必要なサイズの未加工画像を作成します。 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などの別の形式に変換できますが、これは必須ではありません。
Libguestfsがそれを行うことができるようです virt-make-fs(1) と多分 virt-copy-in(1) を見てください。
virt-make-fs
from libguestfs qcow2
example
https://serverfault.com/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
インストールとUbuntuのバグの回避策を除いて、Sudo
は必要ありません。
次に、QEMUが実際にそれを読み取ることができることを確認しました。
qemu-system-x86_64 -drive file=sysroot.ext2.qcow2,format=qcow2,if=virtio,snapshot ...
その後、QEMU Linux内にイメージをマウントして、ファイルを読み取ることができます。
virt-make-fs
extの例
この素晴らしいツールは、生の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でテストされています。
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にすべてのファイルが含まれるようになりました
VMもターゲット仮想ディスクイメージにマウントされている)からネットワーク共有としてディレクトリにアクセスするのはどうですか?共有からマウントされたディスクイメージに単純なコピーを実行するだけではありません。
私は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