شعبده بازی با Disk Image ماشین های مجازی بوسیله libguestfs

بصورت خلاصه libguestfs مجموعه ای از ابزارها برای کار با انواع Disk Image های مورد استفاده در VM ها و یکی از ابزارهای اصلی Virt Tools است. بنقل از وب سایت خودش :libguestfs is a set of tools for accessing and modifying virtual machine (VM) disk images. You can use this for viewing and editing files inside guests, scripting changes to VMs, monitoring disk used/free statistics, creating guests, P2V, V2V, performing backups, cloning VMs, building VMs, formatting disks, resizing disks, and much more.libguestfs can access almost any disk image imaginable. It can do it securely — without needing root and with multiple layers of defence against rogue disk images. It can access disk images on remote machines or on CDs/USB sticks. It can access proprietary systems like VMware and Hyper-V.لیستی از فرامین و ابزارهای در دسترس در ذیل ذکر شده اند :guestfs — main API guestfish — interactive shell guestmount — mount guest filesystem in host guestunmount — unmount guest filesystem virt-alignment-scan — check alignment of virtual machine partitions virt-builder — quick image builder virt-builder-repository — create virt-builder repositories virt-cat — display a file virt-copy-in — copy files and directories into a VM virt-copy-out — copy files and directories out of a VM virt-customize — customize virtual machines virt-df — free space virt-dib — safe diskimage-builder virt-diff — differences virt-edit — edit a file virt-filesystems — display information about filesystems, devices, LVM virt-format — erase and make blank disks virt-get-kernel — get kernel from disk virt-inspector — inspect VM images virt-list-filesystems — list filesystems virt-list-partitions — list partitions virt-log — display log files virt-ls — list files virt-make-fs — make a filesystem virt-p2v — convert physical machine to run on KVM virt-p2v-make-disk — make P2V ISO virt-p2v-make-kickstart — make P2V kickstart virt-rescue — rescue shell virt-resize — resize virtual machines virt-sparsify — make virtual machines sparse (thin-provisioned) virt-sysprep — unconfigure a virtual machine before cloning virt-tail — follow log file virt-tar — archive and upload files virt-tar-in — archive and upload files virt-tar-out — archive and download files virt-v2v — convert guest to run on KVM virt-win-reg — export and merge Windows Registry keys libguestfs-test-tool — test libguestfs libguestfs-make-fixed-appliance — make libguestfs fixed appliance hivex — extract Windows Registry hive hivexregedit — merge and export Registry changes from regedit-format files hivexsh — Windows Registry hive shell hivexml — convert Windows Registry hive to XML hivexget — extract data from Windows Registry hive febootstrap — tool for building supermin appliances febootstrap-supermin-helper — febootstrap helper supermin — tool for building supermin appliances supermin-helper — supermin helper guestfsd — guestfs daemonیکی از بهترین مقاصد استفاده از این ابزارها بجز موارد زیرساختی و امنیتی و rescue و ... در اتوماسیون ها و اسکریپت نویسی است. مثلاً برای برنامه ریزی فرآیندهای مختلف روی یک یا یک پشته از ماشین های مجازی بوسیله ansible خیلی خوب وکارا هستند.من چند مثال از پرکاربردترین ابزارهاش می زنم تا فرمت و قضیه را بصورت کلی بیان کرده باشم، محیط من اینجا KVM/QEMU روی یک CentOS8 است و ماشین مجازی هدف هم یک CentOS8 است. دقت بفرمایید برای مثلاً دسترسی به فایل های داخل Disk Image چند روش و راه و ابزار هست که من همه را ذکر نکرده ام و متداولترین را مثال زده ام. disk image من در vm1data/centos8.qcow2/ قرار دارد.* برای استفاده از بسیاری از ابزارها مثل virt-customize هم باید vm خاموش و disk image آزاد باشد.* اگر در هنگام اجرا خطاهای qemuی گرفتید احتمالاً با ویرایش فایل etc/libvirt/qemu.conf/ و مثلاً تعریف user و group مشکل حل می شود.نصب libguestfs#yum install libguestfs-tools #apt-get install libguestfs-toolsگرفتن اطلاعات درباره ماشین مجازی از روی Disk Image#qemu-img info /vm1data/centos8.qcow2 و #virt-filesystems --long -h --all -a /vm1data/centos8.qcow2 و #virt-inspector /vm1data/centos8.qcow2این سه متداولترین ابزارها برای گرفتن اطلاعات سیستم از vm و وضعیت فایل سیستم آن از روی disk image هستند. در مورد virt-inspector باید توجه داشته باشید که کل متادیتاهای vm را با فرمت xml خروجی می دهد و بهتر است خروجی آن را به یک فایل < بدهید که بتوانید مرورگرهای xml داخل این دیتا را مرور بفرمایید.بجای a diskimage- می توانید از d domain- هم استفاده بفرمایید که اینجا منظور از domain همان KVM VM guest name است (که با virsh list --all می گیرید). اگر در مقالات و مستندات دیگری ملاحظه فرمودید همه را با d- زده متوجه باشید بجای معرفی آدرس فایل disk image از نام آن استفاده کرده است.کپی فایل به/از داخل Disk Image#mkdir vmfiles #virt-copy-out -a /vm1data/centos8.qcow2 /root/file1 /root/vmfiles و برای فرو کردن فایل به ماشین مجازی #virt-copy-in -a /vm1data/centos8.qcow2 /root/file2ONHOST /root در اولی مبداء ابتدا نوشته می شود و فایل روی ماشین مجازی است و پوشه مقصد روی هاست که این فایل باید در آن کپی شود سپس ذکر شده در دومی مبداء که ابتدا نوشته شده فایل روی هاست و مقصد پوشه روی ماشین مجازی استهمین کار با استفاده از virt-customize بشکل ذیل می شود :#virt-customize -a /vm1data/centos8.qcow2 --copy fileonguest:fileonhost #virt-customize -a /vm1data/centos8.qcow2 --copy-in fileonhost:fileonguest توضیحات : --copy SOURCE:DEST Copy files or directories recursively inside the guest. Wildcards cannot be used. --copy-in LOCALPATH:REMOTEDIR Copy local files or directories recursively into the disk image, placing them in the directory REMOTEDIR (which must exist). Wildcards cannot be used.این virt-customize یکی از قویترین و کاملترین ابزارها برای کار کردن با فایل سیستم ماشین مجازی است.virt-customize [ -a disk.img [ -a disk.img ... ] | -d domname ] [--attach ISOFILE] [--attach-format FORMAT] [ -c URI | --connect URI ] [ -n | --dry-run ] [ --format FORMAT] [ -m MB | --memsize MB ] [ --network | --no-network ] [ -q | --quiet ] [--smp N] [ -v | --verbose ] [-x] [--append-line FILE:LINE] [--chmod PERMISSIONS:FILE] [--commands-from-file FILENAME] [--copy SOURCE:DEST] [--copy-in LOCALPATH:REMOTEDIR] [--delete PATH] [--edit FILE:EXPR] [--firstboot SCRIPT] [--firstboot-command 'CMD+ARGS'] [--firstboot-install PKG,PKG..] [--hostname HOSTNAME] [--install PKG,PKG..] [--link TARGET:LINK[:LINK..]] [--mkdir DIR] [--move SOURCE:DEST] [--password USER:SELECTOR] [--root-password SELECTOR] [--run SCRIPT] [--run-command 'CMD+ARGS'] [--scrub FILE] [--sm-attach SELECTOR] [--sm-register] [--sm-remove] [--sm-unregister] [--ssh-inject USER[:SELECTOR]] [--truncate FILE] [--truncate-recursive PATH] [--timezone TIMEZONE] [--touch FILE] [--uninstall PKG,PKG..] [--update] [--upload FILE:DEST] [--write FILE:CONTENT] [--no-logfile] [--password-crypto md5|sha256|sha512] [--selinux-relabel] [--sm-credentials SELECTOR]تغییر پسورد user یا root#virt-customize -a /vm1data/centos8.qcow2 --root-password password:NEWPASS یا #virt-sysprep --root-password password:NEWPASS -a /vm1data/centos8.qcow2 برای یوزر #virt-customize -a /vm1data/centos8.qcow2 --password USER:PASS #virt-sysprep --password USER:PASS -a /vm1data/centos8.qcow2از virt-sysprep غالباً برای reset or unconfigure a virtual machine so that clones can be made from it استفاده می شود یعنی همه ssh keyها و mac address ها و هرچیز دیگری را که ممکن است کانفلیکت بدهد را هم ریست می کند. بنابراین برای فقط تغییر پسورد همان virt-customize بهتر است.نصب و حذف بسته ها#virt-customize -a /vm1data/centos8.qcow2 --install [PACKAGENAME] #virt-customize -a /vm1data/centos8.qcow2 --uninstall [PACKAGENAME]دیدن و لیست کردن فایل هااینکار با ابزار virt-ls انجام می شود، مثلاً دستور ذیل فایل هایی را که در 7 روز گذشته تغییر کرده اند را نمایش می دهد :#virt-ls -lR -a /vm1data/centos8.qcow2 --time-days / | awk '$6 <= 7'همینطور virt-tail را داریم که به معنای tail -f است و virt-cat را داریم که برای cat کردن است و ...ساخت ماشین مجازی جدید با virt-builderابزارهای libguestfs متنوع و زیاد هستند و باید براساس مستندات یک مرور کلی روی آن ها داشته باشید، یکی از معروفترین و پرکاربردترین این ابزارها virt-builder است که برای ساخت راحت یک disk image آماده برای یک ماشین مجازی جدید استفاده می شود که خروجی آن را می توانید در محیط مجازی سازی خود import کنید.برای ساخت disk image ماشین مجازی virt-builder یکسری OS templates دارد که باید یکی از اینها را انتخاب بفرمایید.برای دیدن این لیست از virt-builder --list# استفاده بفرمایید.برای دیدن توضیحات مربوط به هر کدام از virt-builder --notes OSTEMPLATE# استفاده بفرمایید،مثلاً virt-builder --notes centos-8.2 بعد از انتخاب OS Template می توانید پارامترها را تنظیم نمایید تا ساخت disk image شروع شود.مثلاً :#virt-builder -x -v centos-8.2 --format qcow2 --size 50G --arch x86_64 --root-password password:centos --hostname centos.local --install 'htop' --firstboot-command 'yum update -y'با توجه به حجم زیاد OS Template ها وقتی برای اولین بار با یکی یک disk image می سازید آن OS Template روی سیستم کش می شود تا دفعات بعد دوباره دانلود نشود. برای دیدن لیست OS Template های کش شده از virt-builder --print-cache# استفاده فرمایید. برای حذف کش از virt-builder --delete-cache# و برای دانلود همه OS Templateها و کش شدن آن ها از virt-builder --cache-all-templates# استفاده بفرمایید.سوییچ های x- و v- برای نمایش جزییات دیباگ و توضیحات بصورت verbose هستند.استفاده از guestfish این ابزار بصورت interactive shell یا shell scripts برای کار با فایل سیستم disk image ها استفاده می شود. در حقیقت نوعی خط فرمان libguestfs است و مثل بقیه ابزارهای از همان apiها استفاده می کند.صحبت درباره امکانات و دستورات guestfish یک مقاله مجزا می طلبد اما برای اینکه با کلیات موضوع آشنا باشید تا بتوانید نیاز خود را در مستندات آن پیدا کنید چند مثال می زنم.برای مثال mount کردن یک پارتیشن را بوسیله guestfish ببینیم، ro به معنای readonly و rw به معنای read/write است :[root@centos ~]# guestfish --ro -a /vm1data/centos8.qcow2 Welcome to guestfish, the guest filesystem shell for editing virtual machine filesystems and disk images. Type: ‘help’ for help on commands ‘man’ to read the manual ‘quit’ to quit the shell ><fs> run 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 ><fs> list-filesystems /dev/sda1: ext4 /dev/cl/root: xfs /dev/cl/swap: swap ><fs> mount /dev/cl/root / ><fs> ! mkdir /tmp/myGuestMount ><fs> mount-local /tmp/myGuestMount readonly:true ><fs> mount-local-runبجز این از guestmount هم برای Mount a guest filesystem on the host می توان استفاده کرد. مثلاً :# guestmount -a /vm1data/centos8.qcow2 -m /dev/cl/root --ro /mntدر موقع mount کردن با guestmount یا guestfish باید به سیستم عامل guest و اینکه کدام پارتیشن آن باید mount شود دقت کنید.