guestfs这么强大你知道吗

简介

libguestfs 是Redhat开源的一组工具集,主要用来访问和修改虚拟机的磁盘。其功能非常强大,我们常用的监控虚拟机磁盘使用率、P2V、V2V、备份克隆虚拟机、格式化重置虚拟机磁盘大小等功能libguestfs都能提供。甚至定制操作系统、操作windows虚拟机注册表这样的功能它也包含其中。

libguestfs时使用C语言开发的。

使用libguestfs时,可以使用virt-df这样的一系列命令行工具,也可以在程序中调用libguestfs实现的API库函数。它还包含两个shell交互工具。

使用举例1. 两个shell: guestfish和virt-rescue

guestfish - the guest filesystem shell,It uses libguestfs and exposes all of the functionality of the guestfs API

例如:

guestfish -a /tmp/test.img --ro <<_EOF_

run

list-filesystems

_EOF_

virt-rescue - the rescue shell and some simple recovery tools which you can use to examine or rescue a virtual machine or disk image.

例如:

# virt-rescue -a /tmp/test.img

Could not open option rom 'sgabios.bin': No such file or directory

[    0.000000] Initializing cgroup subsys cpuset

[    0.000000] Initializing cgroup subsys cpu

[    0.000000] Initializing cgroup subsys cpuacct

[    0.000000] Linux version 4.4.0-64-generic (buildd@lgw01-56) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #85-Ubuntu SMP Mon Feb 20 11:50:30 UTC 2017 (Ubuntu 4.4.0-64.85-generic 4.4.44)

[    0.000000] Command line: panic=1 console=ttyS0 udevtimeout=6000 udev.event-timeout=6000 no_timer_check acpi=off printk.time=1 cgroup_disable=memory root=/dev/sdb selinux=0 TERM=linux guestfs_rescue=1

[    0.000000] KERNEL supported cpus:

[    0.000000]   Intel GenuineIntel

[    0.000000]   AMD AuthenticAMD

... ...

[    0.809809] intel_rapl: no valid rapl domains found in package 0

/init: 86: /init: cannot create /sys/block/{h,s,ub,v}d*/queue/scheduler: Directory nonexistent

[    1.223216] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x2283c44026a, max_idle_ns: 440795260713 ns

mdadm: No arrays found in config file or automatically

  lvmetad is not active yet, using direct activation during sysinit

/init: 129: /init: ldmtool: not found

------------------------------------------------------------

Welcome to virt-rescue, the libguestfs rescue shell.

Note: The contents of / are the rescue appliance.

You have to mount the guest's partitions under /sysroot

before you can examine them.

groups: cannot find name for group ID 0

><rescue>

使用举例2. 其他命令行工具

virt-inspector — 显示一个虚拟机的操作系统信息

virt-builder — 快速创建并定制一个虚拟机

virt-v2v — 把VMware, Xen, Hyper-V 等其他hypervisors,上的虚拟机迁移到KVM

virt-p2v — 把物理机上的操作系统迁移到KVM

hivexsh、hivexml、hivexget — windows注册表hive文件的操作工具

supermin — 创建一个supermin appliances,我们在使用LXC或docker时经常使用的工具

例如监控虚拟机磁盘状态,修改虚拟机内部文件等更多工具在libguestfs的网站可以查看到。

# virt-df -d ubuntu

Filesystem                           1K-blocks       Used  Available  Use%

ubuntu:/dev/sda                          10475520     235820   10239700    3%

#

使用举例3. API

支持的API类型有:C/C++, Erlang, Golang, Java, Lua, OCaml, Perl, Python, Ruby。

举例:

#test.py

import guestfs

g = guestfs.GuestFS(python_return_dict=True)

g.add_drive_opts("/tmp/test.img", readonly=1)

g.launch()

roots = g.inspect_os()

for root in roots:

    print "Root device: %s" % root

    mps = g.inspect_get_mountpoints(root)

    print "MPS: %s" % mps

# python test.py

Root device: /dev/sda1

MPS: {'/data': '/dev/vdb', '/': '/dev/sda1'}

#

工作原理

libguestfs进程使用qemu运行一个appliance作为它的子进程。

appliance使用supermin和host的kernel制作而成。

使用qemu-img制作目标磁盘的增量盘给appliance使用。

appliance内部运行guestfsd守护进程。

libguestfs进程和appliance内部的guestfsd通过socket和host进行通信,实现具体的功能。

qemu启动appliance过程如下:

qemu-img create -f qcow2 -o backing_file=rbd:rbd/test.img:mon_host=10.20.1.5\:6789\;10.20.1.6\:6789\;10.20.1.7\:6789:auth_supported=none,backing_fmt=raw /tmp/libguestfsXRFM98/overlay1

#使用目标虚拟机的磁盘创建一个增量盘
/usr/bin/qemu-system-x86_64 -global virtio-blk-pci.scsi=off -nodefconfig -enable-fips -nodefaults -display none -machine accel=kvm:tcg -cpu host -m 500 -no-reboot -rtc driftfix=slew -no-hpet -global kvm-pit.lost_tick_policy=discard -kernel /var/tmp/.guestfs-0/appliance.d/kernel -initrd /var/tmp/.guestfs-0/appliance.d/initrd -device virtio-scsi-pci,id=scsi -drive file=/tmp/libguestfsXRFM98/overlay1,cache=unsafe,format=qcow2,id=hd0,if=none -device scsi-hd,drive=hd0 -drive file=/var/tmp/.guestfs-0/appliance.d/root,snapshot=on,id=appliance,cache=unsafe,if=none -device scsi-hd,drive=appliance -device virtio-serial-pci -serial stdio -device sga -chardev socket,path=/tmp/libguestfsXRFM98/guestfsd.sock,id=channel0 -device virtserialport,chardev=channel0,name=org.libguestfs.channel.0 -append panic=1 console=ttyS0 udevtimeout=6000 udev.event-timeout=6000 no_timer_check acpi=off printk.time=1 cgroup_disable=memory root=/dev/sdb selinux=0 TERM=linux

#使用创建好的增量盘启动qemu实例

更多信息参考官网:

http://libguestfs.org/


关注本公众号,了解更多关于云计算虚拟化的知识。

原文发布于微信公众号 - 虚拟化云计算(openstack_openstack)

原文发表时间:2018-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Varnish 4.0 实战

简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,v...

3974
来自专栏coder修行路

jS正则和WEB框架Django的入门

JS正则 -test 判断字符串是否符合规定的正则表达式 -exec 获取匹配的数据 test的例子: ? 从上述的例子我们可以看出,如果rep.test匹配到...

2156
来自专栏飞雪无情的博客

Go语言实战笔记(十六)| Go 并发示例-Pool

这篇文章演示使用有缓冲的通道实现一个资源池,这个资源池可以管理在任意多个goroutine之间共享的资源,比如网络连接、数据库连接等,我们在数据库操作的时候,比...

1232
来自专栏cloudskyme

开源权限系统sshpermissions

第一章 引言 1.1 编写目的 使用easyui+ssh2+shiro的权限管理系统,粒度可细化到按钮及菜单级别。目前是第一个稳定版本,可实现基本的权限控制功能...

4178
来自专栏静默虚空的博客

Tomcat 快速入门

Tomcat 快速入门 版本说明 本文使用 Tomcat 版本为 Tomcat 8.5.24。 Tomcat 8.5 要求 JDK 版本为 1.7 以上。...

3595
来自专栏北京马哥教育

看了还想看—普通权限及umask

权限在操作系统是尤为重要的,无论是windows和linux中,都少不了权限这么一说,权限的大小决定了你能操作些什么,在linux中,权限对目录和文件的意义是不...

3797
来自专栏你不就像风一样

深入理解跨域SSO原理与技术

​ SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登...

1951
来自专栏游戏杂谈

Linux下使用rsync同步文件

遇到的问题是几台游戏服务器,有一台新的服务器之前已经copy(Linux的scp命令)过文件上去,但在测试的过程中发现还是图片无法正常不显示出来,然后用http...

3942
来自专栏数据之美

shell 学习笔记(19)

声明:转载需署名出处,严禁用于商业用途! 1801.关于 nohup 后台运行的问题: nohup就是拒绝hup信号,没什么其他用途, 如...

2395
来自专栏Java后端生活

Linux(六)vi和vim编辑器的使用

3055

扫码关注云+社区

领取腾讯云代金券