`
haoningabc
  • 浏览: 1475128 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

qemu-ga

    博客分类:
  • qemu
阅读更多
bty:git 提交需要xwindow的办法
unset SSH_ASKPASS


1.在virsh的xml定义中加入channel指定host的socket映射到guest的dev
用virsh启动虚拟机的时候
注意加channel
 <channel type='unix'>  
      <source mode='bind' path='/var/lib/libvirt/qemu/test.agent'/>  
      <target type='virtio' name='com.haoning.spice.0'/>  
      <alias name='channel0'/>  
      <address type='virtio-serial' controller='0' bus='0' port='1'/>  
 </channel>  

2.在guest中启动qemu-ga:
yum install qemu-guest-agent qemu-kvm-tools
qemu-ga -v -p /dev/virtio-ports/com.haoning.spice.0

3.在host上使用python连socket或者socat
socat unix-connect:/var/lib/libvirt/qemu/test.agent readline







具体的control.xml
<domain type='kvm' id='12'>
  <name>control</name>
  <uuid>d07d7290-9b1d-f33e-f54a-70a821252410</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.5.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/home/rhel-server-6.5-x86_64-dvd.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <alias name='ide0-1-0'/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/home/control.img'/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <controller type='usb' index='0'>
      <alias name='usb0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='ide' index='0'>
      <alias name='ide0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <alias name='virtio-serial0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:02:a1:90:81'/>
      <source bridge='br0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/1'/>
      <target port='0'/>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/1'>
      <source path='/dev/pts/1'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <channel type='unix'>
      <source mode='bind' path='/var/lib/libvirt/qemu/test.agent'/>
      <target type='virtio' name='com.haoning.spice.0'/>
      <alias name='channel0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <sound model='ich6'>
      <alias name='sound0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='dynamic' model='selinux' relabel='yes'>
    <label>system_u:system_r:svirt_t:s0:c681,c978</label>
    <imagelabel>system_u:object_r:svirt_image_t:s0:c681,c978</imagelabel>
  </seclabel>
</domain>

virsh define control.xml
virsh start control

在guest中
[root@control ~]# qemu-ga -v -p /dev/virtio-ports/com.haoning.spice.0 
1437616495.53279: debug: received EOF
1437616495.153410: debug: received EOF
1437616495.253627: debug: received EOF
1437616495.353849: debug: received EOF
1437616495.454057: debug: received EOF
1437616495.554266: debug: received EOF
1437616495.654507: debug: received EOF
1437616495.754719: debug: received EOF
1437616495.854928: debug: received EOF
1437616495.955151: debug: received EOF
1437616496.55375: debug: received EOF
1437616496.155490: debug: received EOF
^C1437616496.170249: debug: received signal num 2, quitting
[root@control ~]# 




[root@node11 ~]# ls
poll_qemu_guest_agent.py
[root@node11 ~]# cat poll_qemu_guest_agent.py 
#! /usr/bin/python

import base64
import json
import select
import socket

#sock_file = "/tmp/foo.sock"
sock_file = "/var/lib/libvirt/qemu/test.agent"

#import pdb;pdb.set_trace()
READ_LEN = 1024
read_file = "/proc/cpuinfo"
send_cmds = [{"execute": "guest-file-open", "arguments": {"path": read_file, "mode": "r"}},
             {"execute": "guest-file-read", "arguments": {"handle": None, "count": READ_LEN}},
             {"execute": "guest-file-close", "arguments": {"handle": None}}]

serversocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
serversocket.connect(sock_file)
serversocket.setblocking(0)

vm_fileno = serversocket.fileno()
instances = {}
instances[vm_fileno] = "instance-000004e8"

epoll = select.epoll()
epoll.register(vm_fileno, select.EPOLLIN | select.EPOLLOUT | select.EPOLLET)

try:
    #import ipdb;ipdb.set_trace()
    cmd = 0
    stop = False
    while True:
        print '-'*10 + 'start epoll' + '-'*10
        events = epoll.poll(1)
        for fileno, event in events:
            if fileno in instances.keys():# new client is connecting
                print 'instance: ' + instances[fileno]
            if event & select.EPOLLIN:    # new msg is coming in
                print "<<<<<<<<<<<recv"
                try:
                    vm_resp = ''
                    while True:
                        vm_resp += serversocket.recv(READ_LEN)
                except socket.error:
                    pass

                epoll.modify(fileno, select.EPOLLOUT | select.EPOLLET)

                try:
                    vm_resps = vm_resp.split('\n')
                    ok_resp = None
                    for resp in vm_resps:
                        if 'error' not in resp and 'return' in resp:
                            ok_resp = resp
                            break
                        elif 'error' in resp:
                            print 'error occurs: ', resp
                    if ok_resp is not None:
                        resp = json.loads(ok_resp)
                    else:
                        print 'no valid data recv'
                        break
                except ValueError:
                    print 'response content error: ', vm_resp
                    break

                if len(send_cmds) <= cmd:
                    stop = True
                    print resp
                    break
                try:
                    if cmd == 1:
                        print('+'*10 + 'receive:' + '+'*10 + '\n' + vm_resp)
                        handle = resp["return"]
                        send_cmds[cmd]["arguments"]["handle"] = handle
                        send_cmds[cmd+1]["arguments"]["handle"] = handle
                    elif cmd == 2:
                        decoded_file = base64.decodestring(resp["return"]["buf-b64"])
                        print 'file content:\n', decoded_file
                        print resp["return"]["count"]
                        print 'EOF: ', resp["return"]["eof"]
                except (KeyError, ValueError, TypeError):
                    print 'response content error: ', resp

            elif event & select.EPOLLOUT:    # new msg need send out
                print ">>>>>>>>>send"
                if len(send_cmds) <= cmd:
                    print 'no data to send'
                    break
                try:
                    byteswritten = 0
                    data = json.dumps(send_cmds[cmd])
                    while True:
                        byteswritten += serversocket.send(data[byteswritten:])
                        if byteswritten == len(data):
                            print '*'*10 + 'send over' + '*'*10
                            break
                except socket.error:
                    pass

                epoll.modify(fileno, select.EPOLLIN | select.EPOLLET)
                cmd += 1

            elif event & select.EPOLLHUP:   # connect closed
                epoll.unregister(serversocket.fileno())
                serversocket.close()

        print '-'*10 + 'end epoll' + '-'*10 + '\n'
        if stop:
            print 'stop now'
            break
finally:
    epoll.unregister(serversocket.fileno())
    epoll.close()
    serversocket.close()
[root@node11 ~]# 



用socat调用
socat unix-connect:/tmp/qga.sock readline
 {"execute":"guest-sync", "arguments":{"id":1234}}
 {"return": 1234}

socat参考
http://wiki.qemu.org/Features/QAPI/GuestAgent
libvirt配置参考
http://wiki.libvirt.org/page/Qemu_guest_agent
其他参考
http://aspirer2004.blog.163.com/blog/static/1067647201352423628885/


参考
http://www.cloudcraft.cn/use-qemu-guest-agent-to-change-openstack-instance-root-password/

已有功能
http://www.cnblogs.com/biangbiang/p/3222458.html
已有功能

 

目前qga最新版本为1.5.50,linux已经实现下面的所有功能,windows仅支持加*的那些功能:

 
复制代码

Ø guest-sync-delimited*:宿主机发送一个int数字给qga,qga返回这个数字,并且在后续返回字符串响应中加入ascii码为0xff的字符,其作用是检查宿主机与qga通信的同步状态,主要用在宿主机上多客户端与qga通信的情况下客户端间切换过程的状态同步检查,比如有两个客户端A、B,qga发送给A的响应,由于A已经退出,目前B连接到qga的socket,所以这个响应可能被B收到,如果B连接到socket之后,立即发送该请求给qga,响应中加入了这个同步码就能区分是A的响应还是B的响应;在qga返回宿主机客户端发送的int数字之前,qga返回的所有响应都要忽略;


Ø guest-sync*:与上面相同,只是不在响应中加入0xff字符;


Ø guest-ping*:Ping the guest agent, a non-error return implies success;


Ø guest-get-time*:获取虚拟机时间(返回值为相对于1970-01-01 in UTC,Time in nanoseconds.);


Ø guest-set-time*:设置虚拟机时间(输入为相对于1970-01-01 in UTC,Time in nanoseconds.);


Ø guest-info*:返回qga支持的所有命令;


Ø guest-shutdown*:关闭虚拟机(支持halt、powerdown、reboot,默认动作为powerdown);


Ø guest-file-open:打开虚拟机内的某个文件(返回文件句柄);


Ø guest-file-close:关闭打开的虚拟机内的文件;


Ø guest-file-read:根据文件句柄读取虚拟机内的文件内容(返回base64格式的文件内容);


Ø guest-file-write:根据文件句柄写入文件内容到虚拟机内的文件;


Ø guest-file-seek:Seek to a position in the file, as with fseek(), and return the current file position afterward. Also encapsulates ftell()'s functionality, just Set offset=0, whence=SEEK_CUR;


Ø guest-file-flush:Write file changes bufferred in userspace to disk/kernel buffers;


Ø guest-fsfreeze-status:Get guest fsfreeze state. error state indicates;


Ø guest-fsfreeze-freeze:Sync and freeze all freezable, local guest filesystems;


Ø guest-fsfreeze-thaw:Unfreeze all frozen guest filesystems;


Ø guest-fstrim:Discard (or "trim") blocks which are not in use by the filesystem;


Ø guest-suspend-disk*:Suspend guest to disk;


Ø guest-suspend-ram*:Suspend guest to ram;


Ø guest-suspend-hybrid:Save guest state to disk and suspend to ram(This command requires the pm-utils package to be installed in the guest.);


Ø guest-network-get-interfaces:Get list of guest IP addresses, MAC addresses and netmasks;


Ø guest-get-vcpus:Retrieve the list of the guest's logical processors;


guest-set-vcpus:Attempt to reconfigure (currently: enable/disable) logical processors inside the guest。


参考
http://wiki.qemu.org/Features/QAPI/GuestAgent
 mdroth@illuin:~$ sudo socat unix-connect:/tmp/qga.sock readline
 {"execute":"guest-sync", "arguments":{"id":1234}}
 {"return": 1234}

 {"execute":"guest-ping"}
 {"return": {}}

 {"execute": "guest-info"}
 {"return": {"version": "1.0"}}

 // write "hello world!\n" to /tmp/testqga
 {"execute":"guest-file-open", "arguments":{"path":"/tmp/testqga","mode":"w+"}}
 {"return": 0}
 {"execute":"guest-file-write", "arguments":{"handle":0,"buf-b64":"aGVsbG8gd29ybGQhCg=="}}
 {"return": {"count": 13, "eof": false}}
 {"execute":"guest-file-close", "arguments":{"handle":0}}
 {"return": {}}

 // read back the "hello world!\n" from /tmp/testqga
 {"execute":"guest-file-open", "arguments":{"path":"/tmp/testqga","mode":"r"}}
 {"return": 1}
 {"execute":"guest-file-read", "arguments":{"handle":1,"count":1024}}
 {"return": {"buf-b64": "aGVsbG8gd29ybGQhCg==", "count": 13, "eof": true}}
 {"execute":"guest-file-close","arguments":{"handle":1}}
 {"return": {}}

 // freeze and unfreeze freezable guest filesystems
 {"execute":"guest-fsfreeze-status"}
 {"return": "thawed"}
 {"execute":"guest-fsfreeze-freeze"}
 {"return": 3}
 {"execute":"guest-fsfreeze-status"}
 {"return": "frozen"}
 {"execute":"guest-fsfreeze-thaw"}
 {"return": 3}
 {"execute":"guest-fsfreeze-status"}
 {"return": "thawed"}

分享到:
评论

相关推荐

    Qemu专用Qemu-Guest-Agnet整理包

    Windows整理后的qga包,包含amd64和qemu-ga两个文件。 amd64:首先安装证书,管理员运行cmd,命令:pnputil -I -a vioser.inf qemu-ga:将qemu-ga目录放到C:\\Program Files下,管理员运行cmd,命令:qemu-ga -s ...

    qemu-guest-agent:QEMU Guest Agent已针对FreeBSD进行了修补

    QEMU客座代理适用于FreeBSD guest... eq: qemu_guest_agent_flags="-d -v -l /var/log/qemu-ga.log -p /dev/ttyV0.2"入门在使用和编译QEMU Guest Agent之前,请确保已加载模块“ virtio_console”先决条件在控制台

    qmp.c.zip_QMP_qemu

    《QMP与QEMU在虚拟化技术中的应用详解》 在IT行业中,虚拟化技术扮演着至关重要的角色,它能够使一台物理机器运行多个独立的操作系统实例,极大地提高了硬件资源的利用率。QMP(QEMU Monitor Protocol)和QEMU是...

    QEMU for windows+安装说明

    QEMU(Quick Emulator)是一款强大的开源模拟器和虚拟化工具,它允许用户在一台机器上运行多种操作系统,而无需重启或拥有多个物理系统。QEMU适用于Windows平台,为用户提供了一个方便的界面来管理和操作虚拟机。在...

    qemu-4.0.1.tar.xz

    s390:支持 z14 GA 2 CPU 型号,默认情况下启用 Multiple-epoch 和 PTFF 功能 s390:vfio-ap:支持热插拔,不再禁止内存膨胀 x86:HAX 加速器现在支持除 Darwin 以外的 POSIX 主机,包括 Linux 和 NetBSD x86:...

    电脑公司网站管理系统源码程序2010

    1.加入了在线自助装机系统,适合电脑公司网上装机订单。 2.加入在线网上报修系统 3.加入商城程序,公司网站+网上电脑商城销售两不误。 ... 5.修正后台支付接口漏洞,加入了更多支付接口 ...6.修改模板为纯蓝外观,更...

    qemu下载 v3.0.0 电脑版.rar

    QEMU(Quick Emulator)是一款强大的开源模拟器和虚拟化工具,它允许用户在一台计算机上运行多种操作系统,而无需实际硬件。QEMU v3.0.0 是该软件的一个版本,提供了对不同架构的支持,包括x86(32位和64位)。 在...

    虚拟机ubuntu安装qt,附所有安装包链接,Error 127 问题解决,虚拟机许可证-附件资源

    虚拟机ubuntu安装qt,附所有安装包链接,Error 127 问题解决,虚拟机许可证-附件资源

    手把手教你安装配置spice服务

    在客户端机器上,你需要安装相应的Spice客户端软件,如`qemu-ga`或`spice-gtk`,然后使用连接信息(如IP地址、端口和密码)连接到虚拟机。 5. **安全和性能优化**: 为了安全,可以限制Spice服务只接受来自特定IP...

    virtio-win-pkg-scripts:打包virtio-win驱动程序的脚本

    用于将virtio-win驱动程序打包到VFD,ISO和RPM中的脚本。 这里的目标是生成一个与... 并带有指向qemu-ga ,changelog等其他位的链接。 virtio-win驱动程序签名 所有Windows二进制文件都来自在Red Hat内部构建系统上完

    xen全虚拟化安装solaris-笔记

    `file:/OVS/vm/sol-10-u7-ga-x86-dvd.iso`是Solaris的ISO镜像,挂载在`hdc:cdrom`,标记为只读(`r`)。 5. **启动和管理虚拟机** 通过`xm create solaris`命令,使用指定的配置文件启动虚拟机。启动后,可以看到...

Global site tag (gtag.js) - Google Analytics