openstack通过qemu-guest-agent在物理机上操作虚拟机

简介

qga是一个运行在虚拟机内部的普通应用程序(可执行文件名称默认为qemu-ga,服务名称默认为qemu-guest-agent),其目的是实现一种宿主机和虚拟机进行交互的方式,这种方式不依赖于网络,而是依赖于virtio-serial(默认首选方式)或者isa-serial,而QEMU则提供了串口设备的模拟及数据交换的通道,最终呈现出来的是一个串口设备(虚拟机内部)和一个unix socket文件(宿主机上)。qga通过读写串口设备与宿主机上的socket通道进行交互,宿主机上可以使用普通的unix socket读写方式对socket文件进行读写,最终实现与qga的交互,交互的协议与qmp(QEMU Monitor Protocol)相同(简单来说就是使用JSON格式进行数据交换),串口设备的速率通常都较低,所以比较适合小数据量的交换。

目前官方支持的接口有查看时间、ping、读写文件、freeze、thaw、设置时间等。如果想自主执行一些脚本或者命令,可以很tricky地利用thaw这个接口,下面会详细介绍

配置过程

准备镜像

glance image-create --name cirros \
--disk-format raw \
--container-format bare \
--file cirros-0.3.3-x86_64-disk.raw \
--is-public True \
--property hw_qemu_guest_agent=yes \
--progress

注意–disk-format要填写自己openstack使用的格式。

启动虚拟机

在虚拟机中安装qemu-guest-agent

centos:

sudo yum install -y qemu-guest-agent

centos的配置路径是/etc/sysconf/qemu-ga 要把里面的black_list删掉,并且把enable_hook置为1

ubuntu:

sudo apt-get install qemu-guest-agent

ubuntu要下载fsfreeze-hook脚本

sudo wget -O /etc/qemu/fsfreeze-hook https://raw.githubusercontent.com/qemu/qemu/master/scripts/qemu-guest-agent/fsfreeze-hook
sudo chmod +x /etc/qemu/fsfreeze-hook

然后创建fsfreeze-hook.d文件夹,并写脚本,centos和ubuntu的路径可能不一样,centos应该是/usr/libexe/qemu-ga

ubuntu@agent:~$ sudo mkdir /etc/qemu/fsfreeze-hook.d
ubuntu@agent:~$ sudo tee > /etc/qemu/fsfreeze-hook.d/foo.sh > /dev/null <#!/bin/bash

case "$1" in
    freeze)
        echo "I'm frozen" > /tmp/freeze
        ;;
    thaw)
        echo "I'm thawed" >> /tmp/freeze
        ;;
    *)
        exit 1
        ;;
esac
EOF
ubuntu@agent:~$ sudo chmod +x /etc/qemu/fsfreeze-hook.d/foo.sh

然后就可以开始远程操作虚拟机了

sudo virsh qemu-agent-command instance-00000008 '{"execute":"guest-fsfreeze-freeze"}'
sudo virsh qemu-agent-command instance-00000008 '{"execute":"guest-fsfreeze-thaw"}'

instance-00000008是虚拟机的名字,virsh list命令可以看到
然后在虚拟机中看看是否操作虚拟机成功:

sudo cat /tmp/freeze
I'm frozen
I'm thawed

如何在虚拟机上执行任意命令

在/etc/qemu/fsfreeze-hook.d/foo.sh中写成这样的:

#!/bin/bash

case "$1" in
    freeze)
        echo "I'm frozen" > /tmp/freeze
        ;;
    thaw)
        bash /etc/qemu/script.sh 2>/etc/qemu/2 1>/etc/qemu/1
        echo "I'm thawed" >> /tmp/freeze
        ;;
    *)
        exit 1
        ;;
esac

这样每次先用qemu-agent-command中的文件读写命令把想要执行的命令写入到/etc/qemu/script.sh然后再运行thaw命令

sudo virsh qemu-agent-command instance-00000008 '{"execute":"guest-fsfreeze-thaw"}'
就相当于执行了bash /etc/qemu/script.sh

你可能感兴趣的:(openstack)