Chuyển đổi thư mục sang hình ảnh đĩa ảo QEMU / KVM


10

Tôi có một thư mục chứa đầy dữ liệu /var/backups/disk1mà tôi muốn chuyển đổi thành hình ảnh đĩa ảo mà sau đó tôi có thể khởi động bằng QEMU hoặc KVM (thư mục chứa hệ thống tệp cho máy ảo, được sao chép qua rsync).

Mặc dù có rất nhiều hướng dẫn để chuyển đổi một đĩa vật lý hoàn chỉnh sang một đĩa ảo, nhưng việc đóng gói chỉ nội dung của một thư mục vào một hình ảnh đĩa ảo hóa ra lại khó khăn hơn tôi mong đợi. Có ý kiến ​​gì không?

Nhân tiện, tôi biết tôi có thể sử dụng qemu-imgđể chuyển đổi một thiết bị khối thành một đĩa ảo (ví dụ qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2:), vì vậy nếu tôi có thể khiến thư /var/backups/disk1mục xuất hiện thành một thiết bị khối, thì về mặt lý thuyết tôi có thể thực hiện mục tiêu của mình bằng cách sử dụng qemu-img. Tuy nhiên, tôi đã nghĩ về các cách sáng tạo để hiển thị thư mục dưới dạng một thiết bị khối bằng NBD hoặc thiết bị loopback, tuy nhiên, và đã không thành công.

Câu trả lời:


16

Đầu tiên, tạo một hình ảnh thô của kích thước yêu cầu. Tôi sẽ cho rằng 10G là đủ. Sử dụng tìm kiếm tạo ra một tập tin thưa thớt , giúp tiết kiệm không gian.

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

Tiếp theo, tạo một hệ thống tập tin trên nó.

mkfs.ext4 -F example.img

(Lưu ý rằng bạn cần -Ftùy chọn mkfs.ext4để hoạt động trên một tệp chứ không phải phân vùng đĩa)

Sau đó, gắn kết nó.

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

Bây giờ bạn có thể sao chép các tập tin của bạn vào / mnt / example. Một khi điều này được thực hiện, ngắt kết nối nó và bạn có thể sử dụng example.img như một ổ đĩa trong một máy ảo. Nếu bạn muốn, bạn có thể chuyển đổi nó từ một hình ảnh thô sang định dạng khác như qcow2e bằng cách sử dụng qemu-img, nhưng điều này không bắt buộc.


1
qemu-imgfallocatelà một chút thuận tiện hơn dd.
Ciro Santilli 冠状 病毒 审查 事件 法轮功

Cách tính kích thước tối thiểu cần thiết: unix.stackexchange.com/questions3533156/iêu
Ciro Santilli 病毒 六四 事件


4

virt-make-fstừ qcow2ví dụ libguestfs

/server//a/332114/163884 đã đề cập đến nó, nhưng đây là một ví dụ đầy đủ:

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 

Lưu ý cách sudokhông bắt buộc, ngoại trừ cài đặt và cách khắc phục lỗi Ubuntu.

Sau đó tôi đã xác minh rằng QEMU thực sự có thể đọc nó với:

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

Sau đó tôi có thể gắn hình ảnh bên trong QEMU Linux và đọc tệp.

virt-make-fs ví dụ

Công cụ tuyệt vời này cũng có thể tạo các hệ thống tập tin ext thô, ví dụ:

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

mà chúng tôi có thể xác minh trực tiếp trên máy chủ với:

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

Giảm thiểu kích thước hình ảnh

Một tính năng thực sự tốt virt-make-fslà nó tự động cố gắng giảm thiểu kích thước hình ảnh nếu đó là những gì chúng ta muốn:

Virt-make-fs mặc định để giảm thiểu không gian thừa, nhưng bạn có thể sử dụng cờ --size để chừa không gian trong hệ thống tệp nếu bạn muốn.

vì thế:

df -h

nói với tôi rằng hình ảnh được lấp đầy 82%:

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

Chúng tôi có thể dễ dàng thêm một số không gian bổ sung trên đầu trang tối thiểu với --size-=+:

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

tạp chí ext4 trên cao

Hướng dẫn cũng đề cập rằng:

Lưu ý rằng hệ thống tập tin ext3 chứa một tạp chí, thường có kích thước 1-32 MB. Nếu bạn sẽ không sử dụng hệ thống tập tin theo cách yêu cầu nhật ký, thì đây chỉ là sự lãng phí.

và thật thú vị khi xác minh rằng với:

du -bs *

sản xuất:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

vì vậy chúng tôi thấy rằng ext4 xuất hiện lớn hơn đáng kể.

lỗi libguestfs Ubuntu

Bây giờ cho nhược điểm: dường như không có người bảo trì Ubuntu hiện tại và thư viện nói chung là lỗi trên Ubuntu.

sudokhông phải là lý thuyết bắt buộc, nhưng nó được yêu cầu do lỗi đóng gói Ubuntu trừ khi chúng tôi giải quyết: https://askubfox.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.

Sau đó, không có cách giải quyết của chúng tôi, 18.04 (nhưng không phải 16.04) đã thất bại với: https://ormszilla.redhat.com/show_orms.cgi?id=1591617

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

do một lỗi đã được sửa chữa ngược dòng.

Đã thử nghiệm trong Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubfox3, QEMU 1: 2.11 + dfsg-1ubfox7.3.


1

Sử dụng chiến lược Michaels trong Fedora 23:

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

Điều này tạo ra hệ thống tệp ext2, mà bạn có thể gắn vào một số thư mục:

# mount file.fs /mnt 

Bây giờ / mnt chứa tất cả các tệp của bạn


Nếu file.fslà một tập tin, không nên mountlệnh là : mount -o loop file.fs /mnt?
kasperd

0

Điều gì về việc truy cập thư mục dưới dạng chia sẻ mạng từ VM cũng được gắn vào hình ảnh đĩa ảo mục tiêu của bạn? Bạn không chỉ thực hiện một bản sao đơn giản từ chia sẻ sang hình ảnh đĩa được gắn.


Điều đó sẽ hoạt động và tương tự như chiến lược hiện tại của tôi, đó là xây dựng VM và rsync dữ liệu. Thật tuyệt vời nếu có một giải pháp nhanh hơn và sạch hơn. Sao chép dữ liệu vào một máy mới trở nên khá lộn xộn vì bạn phải lo lắng về việc đảm bảo rằng bạn loại trừ một số tệp không nên sao chép, như fstab và hầu hết mọi thứ trong / boot
Chris

"loại trừ một số tệp không nên sao chép, như fstab và hầu hết mọi thứ trong / boot" - có thể không phải là vấn đề lớn khi mục tiêu VM là một ổ đĩa bổ sung.
dùng48838

0

Tôi thích (và sử dụng) câu trả lời của Ciro Santilli, nhưng đây là một cái gì đó hoạt động với guestfishvỏ:

# 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.