แปลงไดเร็กทอรีเป็นอิมเมจดิสก์เสมือน 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 เพียงพอแล้ว การใช้findสร้างไฟล์แบบกระจายซึ่งช่วยประหยัดพื้นที่

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 เป็นไดรฟ์ในเครื่องเสมือน ถ้าคุณต้องการคุณสามารถแปลงจากรูปภาพดิบเป็นรูปแบบอื่นเช่น qcow2e โดยใช้ qemu-img แต่ไม่จำเป็น


1
qemu-imgและfallocateสะดวกกว่าddเล็กน้อย
Ciro Santilli 冠状病毒审查六四事件法轮功

วิธีการคำนวณขนาดต่ำสุดที่ต้องการ: unix.stackexchange.com/questions/353156/…
Ciro Santilli 冠状病毒审查审查六四事件法轮功


4

virt-make-fsจากqcow2ตัวอย่างlibguestfs

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ไม่จำเป็นต้องใช้ยกเว้นการติดตั้งและการแก้ไขข้อบกพร่องของ Ubuntu

ฉันยืนยันแล้วว่า QEMU สามารถอ่านได้ด้วย:

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

ฉันสามารถเมานต์รูปภาพภายใน QEMU Linux และอ่านไฟล์ได้

virt-make-fs ต่อตัวอย่าง

เครื่องมือที่ยอดเยี่ยมนี้ยังสามารถสร้างระบบไฟล์ raw 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 flag เพื่อเว้นช่องว่างในระบบไฟล์ได้หากคุณต้องการ

ดังนั้น:

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 เว้นแต่ว่าเราจะแก้ปัญหา: /ubuntu/1046828/how-to-run-libguestfs-tools-tools-tools-tools-tools-tools-tools-tools-tools-such-as- virt-ทำให้ FS-โดยไม่ต้อง 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:

# 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

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.