निर्देशिका को 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। हालांकि, मैंने एनबीडी या लूपबैक डिवाइस का उपयोग करके ब्लॉक डिवाइस के रूप में निर्देशिका को उजागर करने के रचनात्मक तरीकों के बारे में सोचा है, और सफलता नहीं मिली है।

जवाबों:


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.img का उपयोग कर सकते हैं। यदि आप चाहते हैं कि आप इसे एक कच्ची छवि से दूसरे स्वरूप में बदल सकते हैं जैसे qcow2e qemu-img का उपयोग करके, लेकिन इसकी आवश्यकता नहीं है।


1
qemu-imgऔर की fallocateतुलना में थोड़ा अधिक सुविधाजनक हैं dd
सिरो सेंटिल्ली 冠状 病毒 iro i 法轮功

न्यूनतम आवश्यक आकार की गणना कैसे करें: unix.stackexchange.com/questions/353156/…
Ciro Santilli Sant required required required


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 लिनक्स के अंदर छवि को माउंट करने और फ़ाइल को पढ़ने में सक्षम हूं।

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यह है कि यदि हम चाहते हैं तो यह स्वतः ही छवि का आकार कम करने की कोशिश करता है:

अतिरिक्त जगह को कम करने के लिए लगभग मेक-एफएस डिफॉल्ट करता है, लेकिन आप चाहें तो फाइल सिस्टम में स्पेस छोड़ने के लिए --साइज फ्लैग का उपयोग कर सकते हैं।

इसलिए:

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 एमबी आकार में। यदि आप एक तरह से फाइल सिस्टम का उपयोग नहीं करने जा रहे हैं, जिसके लिए जर्नल की आवश्यकता होती है, तो यह सिर्फ ओवरहेड व्यर्थ है।

और यह सत्यापित करना दिलचस्प है कि:

du -bs *

जो पैदा करता है:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

इसलिए हम देखते हैं कि ext4 काफी बड़ा निकला।

libguestfs उबंटू बग

अब नकारात्मक पक्ष के लिए: वर्तमान में कोई उबंटू अनुचर प्रतीत नहीं होता है और उबंटू में आमतौर पर पुस्तकालय छोटी गाड़ी है।

sudoसिद्धांत रूप में आवश्यक नहीं है, लेकिन एक उबंटू पैकेजिंग बग के कारण यह आवश्यक है जब तक कि हम एक वर्कअराउंड नहीं करते हैं: /ubuntu/1046828/how-to-run-libguestfs-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

फेडोरा 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:?
कास्परड नोव

0

एक वीएम से एक नेटवर्क शेयर के रूप में निर्देशिका को एक्सेस करने के बारे में क्या है जो आपके लक्ष्य वर्चुअल डिस्क छवि पर भी घुड़सवार है? आप शेयर से लेकर माउंटेड डिस्क इमेज तक सिंपल कॉपी करते हैं।


यह काम करना चाहिए, और मेरी वर्तमान रणनीति के समान है, जिसमें एक वीएम का निर्माण करना है और डेटा को rsync करना है। यह बहुत अच्छा होगा यदि कोई तेज और क्लीनर समाधान हो, हालांकि। एक नई मशीन में डेटा कॉपी करना बहुत गड़बड़ हो जाता है क्योंकि आपको यह सुनिश्चित करने के बारे में चिंता करनी होती है कि आप कुछ फ़ाइलों को कॉपी न करें, जैसे कि fstab और अधिकांश चीजें / बूट में नहीं होनी चाहिए
क्रिस

"कुछ फ़ाइलों को कॉपी नहीं किया जाना चाहिए, जैसे कि fstab और अधिकांश चीजें / बूट में" - 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.