[server] 디렉토리를 QEMU / KVM 가상 디스크 이미지로 변환

/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로 충분하다고 가정하겠습니다. 사용 추구하는 것은 생성 스파 스 파일 공간을 절약.

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-fslibguestfs qcow2예제에서

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

참고 방법은 sudo설치 및 우분투 버그 해결 방법을 제외하고, 필요하지 않습니다.

그런 다음 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-32MB 크기의 저널이 포함되어 있습니다. 저널이 필요한 방식으로 파일 시스템을 사용하지 않을 경우 이는 오버 헤드로 인한 것입니다.

그리고 다음을 확인하는 것이 흥미 롭습니다.

du -bs *

어떤 생산 :

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

그래서 우리는 ext4가 상당히 커졌다는 것을 알았습니다.

libguestfs 우분투 버그

단점 : 현재 Ubuntu 관리자없는 것으로 보이며 라이브러리는 일반적으로 Ubuntu에서 버그가 있습니다.

sudo이론에없는이 필요하지만, 우리가 해결을하지 않는 한이 우분투 포장 버그로 인해 필요합니다 /ubuntu/1046828/how-to-run-libguestfs-tools-tools-such-as- virt-make-fs-with-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: /:

업스트림에서 이미 수정 된 버그로 인해

우분투 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


답변