في هذه المقالة سوف أخبرك عن الموقف عندما تحتاج إلى تقليل صورة qcow2 للجهاز الظاهري KVM في أسرع وقت ممكن.
شكل جهاز كتلة - qcow2
ولكن ، مع ذلك ، يمكن عمل هذا المخطط باستخدام صور خام ، يكفي تحويله إلى qcow2. بشكل عام ، ستكون التعليمات مناسبة لكل شيء تم تحويله إلى qcow2.
طريقة سهلة لتقليص القرص على KVM هي كما يلي:
- ضغط جهاز كتلة qcow2 (قرص VM)
- صنع قرص أصغر
- تركيب صورة gparted ، القرص القديم والجديد
- التحضير لتمهيد نظام التشغيل
- مواصفات الجهاز الظاهري والجهاز المضيف:
المضيف: CentOS 7 + QEMU 2.12 + LIBVIRT 4.5.0 + Kernel UEK5 v. 4.14
VM: CentOS 7 + 80GB HDD + Kernel std v. 3.10
إن الجهاز الظاهري CentOS 7 الذي يحتوي على صورة قرص ثابت بسعة 80 جيجابايت ، يشغلها بالفعل 20 جيجابايت و 80 جيجابايت فعليًا ، سيكون بمثابة متبرع. سنقوم بتصغيره إلى 40 جيجابايت.
ما الفرق بين حجم الصورة والحجم الفعلي والحجم المادي؟
لنفترض أن صورة qcow2 تم إنشاؤها بحجم 80 جيجابايت ونحن نعرف ذلك. أثناء التشغيل ، كانت الصورة مسدودة بالبيانات ، وتم حذف بعض البيانات. بشكل عام ، نظرًا لخصائص عملية كتابة البيانات وحذفها ، بالنسبة لنظام التشغيل ، لا يبدو أن البيانات المحذوفة موجودة ، ولكنها تظل مسجلة في الصورة حتى يتم استبدالها ببيانات أخرى. وفقًا لذلك ، حتى في نظام التشغيل سترى 20 جيجابايت من البيانات المشغولة بالفعل ، سيعرض مضيف KVM مثل هذه الصورة الرائعة (نستخدم الأداة المساعدة qemu-img للحصول على المعلومات):
qemu-img info qcow2_image.img
image: qcow2_image.img
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 80G
cluster_size: 65536
Format specific information:
compat: 0.10
refcount bits: 16
يمكنك أن ترى أن الحجم الافتراضي = حجم القرص ، وكذلك ستظهر du -sh للصورة أنها تحتل 80 جيجا بايت حقيقي:
du -sh qcow2_image.img
80G qcow2_image.img
ونظرًا لأننا بحاجة إلى تقليل حجم الصورة إلى 40 جيجابايت ، فلنبدأ العملية.
المرحلة 1 - ضغط جهاز الكتلة (صورة)
قبل بدء إجراء تقليل القرص ، تحتاج إلى التأكد من أن المساحة المشغولة داخل نظام التشغيل أقل من الحجم الذي سيتم تقليل القرص إليه بطريقة أو بأخرى.
df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 80G 18G 63G 22% /
كما نرى ، 18 غيغابايت مشغولة ، أي أقل من 40 غيغابايت. قم بإيقاف تشغيل الجهاز الظاهري باستخدام الأمر
shutdown -h now
ونذهب إلى الجهاز المضيف ، ونفحص:
- كم تأخذ الصورة جسديا
- كم فعلا
# qemu-img info qcow_shrink
image: qcow_shrink
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 80G
cluster_size: 65536
Format specific information:
compat: 0.10
refcount bits: 16
# virt-df -h qcow_shrink
du -sh Filesystem Size Used Available Use%
qcow_shrink:/dev/sda1 488M 101M 351M 21%
qcow_shrink:/dev/sda2 79G 17G 62G 22%
# du -sh qcow_shrink
80G qcow_shrink
لضغط الصورة ، نحتاج إلى أداة مساعدة بسيطة تسمى Virt-sparsify . تأكد من أن الجهاز الافتراضي معطل وقم بتنفيذ الأمر في الدليل مع صورة القرص (ملاحظة مهمة: قبل البدء في Virt-sparsify ، تأكد من وجود مساحة خالية كافية في / tmp وفي تخزين الصور لإجراء العملية)
virt-sparsify qcow_shrink qcow_shrink-new
سيؤدي إكمال العملية بنجاح إلى الناتج التالي:
[ 0.0] Create overlay file in /tmp to protect source disk
[ 0.1] Examine source disk
[ 1.2] Fill free space in /dev/sda1 with zero
[ 1.5] Fill free space in /dev/sda2 with zero
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[ 72.5] Copy to destination and make sparse
[ 81.9] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.
ثم نقوم بتبديل القرص (نقل qcow_shrink في مكان ما إلى الجانب ، على سبيل المثال ، qcow_shrink-old و qcow_shrink-new في مكانه - qcow_shrink ).
mv qcow_shrink qcow_shrink-old && mv qcow_shrink-new qcow_shrink
نبدأ VM. إذا بدأ كل شيء ، فإننا نطفئ الجهاز الظاهري ونواصل العمل.
المرحلة 2 - إنشاء قرص أصغر
إجراء بسيط بأمر واحد فقط:
qemu-img create -f qcow2 -o preallocation=metadata qcow_shrinked 40G
qcow_shrinked - اسم الصورة الجديد
40G - الحجم الجديد
المرحلة 3 - ربط gparted
نظرًا لأن المسؤولين في بعض الأحيان يفضلون طرقًا أسهل لحل المشكلة ، يتم وضع الدف جانبًا (kpartx) وتأتي ISO و VNC في مكانها. لحسن الحظ ، ليس من الصعب جدًا توصيله في KVM.
ماذا نفعل:
- تحميل صورة ISO GParted
- قم بتوصيل qcow2_shrinked بـ VM
- قم بتشغيل VM ، والتمهيد من ISO
سأحذف كيفية القيام بذلك من هذه المقالة ، حيث يُفترض أن الشخص الذي يقوم بكل هذا يعرف بالفعل كيف يحدث ذلك ، لكن النتيجة ستكون كما يلي:
بدء تشغيل الجهاز الظاهري وشاهد شاشة التمهيد GParted:
حدد العنصر الأول واتبع الإرشادات التي تظهر على الشاشة. عادة ما أضغط على مفتاح الإدخال طول الطريق.
برؤية GParted نفسها ، دعنا نبدأ العمل. تحقق بسرعة من جدول الأقسام / dev / vda الذي يحتوي على - msdos أو gpt . هذا مهم:
قم بالتبديل إلى القرص الثاني / dev / vdb وإنشاء جدول الأقسام:
عند إنشاء الجدول ، حدد نوع msdos كما تعلمنا سابقًا.
ثم عد إلى / dev / vdaوبالتتابع ، من الأقراص الأولى ، نبدأ في نسخ الأقسام ، والتبديل بين vda و vdb :
ستكون النتيجة النهائية:
اضغط على "تطبيق" وانتظر حتى تكتمل
النتيجة: نتيجة:
هذا يبدو بالفعل مثل الحقيقة. ولكن نظرًا لأننا قمنا ببعض التلاعب الذي سيؤدي إلى تغيير UUID الخاص بالأقراص ، فمن المحتمل ألا نقوم بالتمهيد إلى نظام التشغيل. لماذا ا؟ يستخدم CentOS 7 UUIDs للقرص في fstab ، ويستخدم Grub2 UUIDs للقرص ، لذلك نقفز إلى وحدة التحكم ونقوم ببعض السحر الأسود.
يعمل Gparted في البداية كمستخدم ، لذلك نقفز تحت الجذر باستخدام الأمر sudo su - root :
دعنا blkid للتأكد من تغيير UUID للأقسام
يمكن ملاحظة أن UUID vda1 = vdb1 ، لكنه تغير بالنسبة لـ vdb2. لا بأس - يمكنك التعايش معها.
قم بتركيب vdb بالكامل ، جنبًا إلى جنب مع قسم التمهيد / ، وقم بتركيب بعض الأقسام لراحتنا.
mkdir vdb2
mount /dev/vdb2 vdb2
mount /dev/vdb1 vdb2/boot
cd vdb2
mount --bind /dev dev
mount --bind /sys sys
mount --bind /proc proc
chroot .
لنبدأ بـ fstab - نظرًا لأنه ليس من الملائم جدًا كتابة UUID في VNC ، سنقوم باستبداله باسم الجهاز المألوف.
نحن استبدال خط مع UUID = ... مع، الانتباه : نحن
تحديد / ديف / vdb2 ، إذا كان القرص القديم لم يكن مخططا له أن يكون مفصولا، فإننا
تحديد / ديف / vda2 ، إذا كان القرص القديم سيتم قطع
وبما أننا فصل القرص القديم قبل تحميل نظام التشغيل، ثم كتابة / ديف / vda2
التالي دعونا نغير محمل الإقلاع ، ونرتبها. لنفترض أن كل شيء موجود في / boot / grub2 ، و grub.cfg في نفس المكان ، لكن efi ليس (جدول msdos ، وهو efi :)):
grub2-install /dev/vdb
cd /boot/grub2
grub2-mkconfig -o grub.cfg
في هذا ، يمكنك أن تكون سعيدًا بنفسك ومن خلال تعطيل gparted ، قم بالتمهيد إلى نظام التشغيل.
المرحلة 4 - تمهيد نظام التشغيل
قبل تحميل نظام التشغيل ، ما زلت أوصي بفصل القرص القديم عن الخادم. لذلك ، في المرحلة السابقة ، كان يجب تسجيل vda2 في fstab ، ولكن إذا كنت من مستخدمي الكمبيوتر اليقظين ولم تقم بفصل أي شيء ، فلن تكون هناك مشاكل. باستخدام قرص قديم ، من المحتمل جدًا أن تقوم بالتمهيد منه.
أثناء عملية التمهيد ، لم تظهر أي مشاكل ، وتم تمهيد الخادم كما هو متوقع. دعنا نتحقق من هذا:
[root@shrink ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 0 496M 0% /dev/shm
tmpfs 496M 6.7M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/vdb2 40G 18G 23G 44% /
/dev/vdb1 488M 101M 352M 23% /boot
tmpfs 100M 0 100M 0% /run/user/0
[root@shrink ~]# blkid
/dev/vda1: UUID="ea505196-32fb-4df6-8bed-0a0ab2d0b726" TYPE="ext4"
/dev/vda2: UUID="30ec1bc6-658f-4611-8708-5e3b7ebaa467" TYPE="xfs"
/dev/vdb1: UUID="ea505196-32fb-4df6-8bed-0a0ab2d0b726" TYPE="ext4"
/dev/vdb2: UUID="c8548834-272b-4331-a9bf-aa99fb41a434" TYPE="xfs"
/dev/sr0: UUID="2019-03-21-13-42-32-00" LABEL="GParted-live" TYPE="iso9660" PTTYPE="dos"
يمكننا أن نرى أن / التمهيد و / مطلوبان ، الحجم 40 جيجابايت ، نظام التشغيل قيد التشغيل. السعادة لا خلاف ذلك!
علاوة
ما عليك مواجهته في بعض المواقف.
- VM Windows, virt-sparsify . , , ( blkid), Windows , . ( ) fixmbr + rebuildbcd. — man
- — xfs Superblock has unknown read-only compatible features (0x4) enabled. read-only, . :
على الأرجح ، عندما تم إجراء كل شيء في بيئة gparted أو بيئة أخرى ، كان إصدار نواة هذه البيئة جديدًا للغاية ، حيث تم تغيير xfs قليلاً ، أي اختلاف البيانات الوصفية وإصدارها. نتيجة لذلك ، تتحول xfs المصنوعة في النواة الجديدة إلى قرع على النواة القديمة. ما نقوم به هو إعادة التشغيل في عملية الإنقاذ ، ورفع الشبكة في بيئة الإنقاذ هذه وتثبيت أحدث نواة في نظام التشغيل. لقد قمت بتثبيت 5.x على CentOS 7 ، ربما 4.x سيفعل ذلك ، لم أقم باختباره ، ولكن في النهاية نجح كل شيء. علاوة على ذلك ، دون أي مشاكل.
هذا كل شئ!
كما ترون ، لا يوجد شيء معقد في ذلك. بالطبع ، يمكنك استخدام LVM و resize2fs وأشياء أخرى ، ولكن لا يزال qcow2 يستخدم في مكان آخر وحتى يحتاجه شخص ما.
إذا كنت تعرف طريقة أبسط - اكتب عنها في التعليقات.