guestfish是在宿主机里编辑虚拟机镜像的工具,guestfish命令只是对libguestfs接口的封装。
guestfish打开和操作vm镜像的过程如下:
首先libguestfs调用febootstrap取宿主机的资源准备vm环境,包括
①在临时目录中建立到取宿主机内核的链接。
②取基本内核模块、init、modules列表打包为启动内存盘initrd
③建立稀疏文件准备制作vm启动磁盘镜像
④取宿主机的基本命令程序、配置文件和libguestfs的集成命令等等在vm镜像中构建rootfs
然后启动kvm,命令如下:
root@debian:/var/tmp/.guestfs-0# ps -ef | grep kvm
root 28472 28445 7 16:03 pts/0 00:00:33 /usr/bin/kvm -global virtio-blk-pci.scsi=off -nodefconfig -nodefaults -nographic -drive file=./disknt,cache=off,if=virtio -machine accel=kvm:tcg -m 500 -no-reboot -no-hpet -device virtio-serial -serial stdio -chardev socket,path=/tmp/libguestfsuc4Wcs/guestfsd.sock,id=channel0 -device virtserialport,chardev=channel0,name=org.libguestfs.channel.0 -kernel /var/tmp/.guestfs-0/kernel.28445 -initrd /var/tmp/.guestfs-0/initrd.28445 -append panic=1 console=ttyS0 udevtimeout=300 no_timer_check acpi=off printk.time=1 cgroup_disable=memory selinux=0 TERM=xterm -drive file=/var/tmp/.guestfs-0/root.28445,snapshot=on,if=virtio,cache=unsafe
再然后vm里就会启动guestfsd,通过上面命令的serial与宿主机的libguestfs通信。
最后宿主机就可以通过libguestfs控制guestfsd操作镜像,也就是虚拟机的磁盘了。
最后我觉得为了实现这么个功能绕了这么一大圈,虽然说可能是一劳永逸,也就是不管qemu更新再支持什么格式libguestfs都不需要改,直接启动qemu挂载就成了。但是资源开消真是有些大,打开镜像这过程有些太长了,比如操作raw格式的话这速度真是被本地mount命令甩了几条街,难免给人一种脱了裤子放屁的感觉。不过要是编辑qcow2之类的格式目前好像也就只能靠它了。
1 条评论。