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


10

/var/backups/disk1가상 디스크 이미지로 변환하고 QEMU 또는 KVM을 사용하여 부팅 할 수 있는 데이터로 채워진 디렉토리가 있습니다 (디렉토리에는 rsync를 통해 복사 된 가상 머신의 파일 시스템이 포함되어 있음).

완전한 물리 디스크를 가상 디스크로 변환하기위한 지침이 많이 있지만, 단일 디렉토리의 내용 만 가상 디스크 이미지로 패키징하는 것은 예상보다 훨씬 어려운 것으로 판명되었습니다. 어떤 아이디어?

그건 그렇고, qemu-img블록 장치를 가상 디스크 (예 :)로 변환하는 데 사용할 수 있다는 것을 알고 qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2있으므로 디렉토리 /var/backups/disk1를 블록 장치로 표시 할 수있는 경우 이론적으로는 목표를 달성 할 수 있어야합니다 qemu-img. 그러나 NBD 또는 루프백 장치를 사용하여 디렉토리를 블록 장치로 표시하는 창의적인 방법에 대해 생각했지만 성공하지 못했습니다.

답변:


17

먼저 필요한 크기의 원시 이미지를 만듭니다. 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와 같은 다른 형식으로 변환 할 수는 있지만 필수는 아닙니다.


1
qemu-img그리고 fallocate보다 약간 더 편리합니다 dd.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功



4

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.


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을 구축하고 데이터를 재 동기화하는 현재 전략과 비슷합니다. 더 빠르고 깨끗한 솔루션이 있다면 좋을 것입니다. fstab 및 / boot에있는 대부분의 파일과 같이 복사하지 말아야 할 특정 파일을 제외해야하므로 걱정할 필요가 있기 때문에 데이터를 새 컴퓨터에 복사하는 것은 상당히 복잡합니다.
Chris

"fstab 및 / boot에있는 대부분의 파일과 같이 복사해서는 안되는 특정 파일 제외"-VM 대상이 추가 볼륨 인 경우 큰 문제가되지 않을 수 있습니다.
user48838

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.