PVE中 QEMU Guest Agent的使用

对于任何一个虚拟化平台,总有一个客户机软件和宿主机通信,例如vmware的vmtools。KVM下的就是qemu-guest-agent

因为PVE是基于KVM的,所以客户端依旧是 qemu-guest-agent 。

目录:

[TOC]

客户端安装(不安装会提示Guest Agent未运行)

Linux

1
2
3
4
#for rehat
yum install qemu-guest-agent -y
#for debian
apt install qemu-guest-agent -y

WINDOWS 安装 QEMU GUEST AGENT

标签: qemu windows

说明

1
2
3
记录 windows 版本下进行 qemu guest agent 软件安装
当前使用版本为 windows 2012, 其他版本同理 (已验证 2008 与 win7 版本)
解决 qemu guest agent 启动 1053 报错123

作用

1
2
1. 安装 qemu guest agent 可以用于对 libvirtd 下的 instance 进行管理
2. 可以用于收集 windows 的内存信息 (需要添加 balloon 驱动)12

参考安装 qemu guest agent + balloon 驱动前的 windows 数据返回与 linux 下的数据返回差异
默认状态下, windows 只返回当前系统分配的内存 actual 与当前进程 (kvm) 使用中的内存值

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@hh-yun-compute-131230 ~]# virsh dommemstat instance-00023f5f   (windows 2012)
actual 8388608
rss 8245820

[root@hh-yun-compute-131230 ~]# virsh dommemstat instance-000242c3 (centos6.8)
actual 4194304
swap_in 0
swap_out 0
major_fault 397
minor_fault 1544402
unused 3769676
available 3924492
rss 53229212345678910111213

GLANCE IMAGE 配置

1
2
3
4
glance image-update --property dhw_qemu_guest_agent=yes xxxx-image-i-xxxx

ex:
glance image-update --property hw_qemu_guest_agent=yes c0a3df0f-deaa-49e1-9dc6-f5a6034a12b61234

需要重启对应 openstack instance 才生效
参考配置正确并重启后的 instance 中的 libvirt.xml 配置

1
2
3
4
5
6
/var/lib/nova/instances/f4423241-9ad2-48b5-b217-0f707f3ec921/libvirt.xml

<channel type="unix">
<source mode="bind" path="/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00023f5f.sock"/>
<target type="virtio" name="org.qemu.guest_agent.0"/>
</channel>123456

安装顺序参考

1
2
3
4
5
6
1. 获取软件
2. 安装驱动 virto serial driver
3. 更新 balloon 驱动 (需要区分 2012, win7 版本的使用方法)
4. 安装 qemu-ga
5. 注册并重启 balloon 服务
6. 测试可用性123456

注意:

1
2
3
4
1 balloon 服务只能够运行在 administrator 用户下
2 假如你只属于 administrators 组, 那么请你切换成 administrator 用户
3 假如 administrator 用户被隐藏, 那么需要管理员身份运行 cmd , 输入下面命令, 再切换用户
net user administrator /active:yes1234

以管理员身份运行终端
admin-cmd

参考下面方法
enable-admin

软件获取

方法一

1
2
3
4
5
wget https://fedorapeople.org/groups/virt/virtio-win/virtio-win.repo -O /etc/yum.repos.d/virtio-win.repo
yum install -y virtio-win.noarch

iso 软件存放在
/usr/share/virtio-win/virtio-win.iso12345

方法二

1
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso1

更新 VIRTO SERAIL DRIVER

1
2
3
4
5
6
1. windows 系统获得 virtio-win.iso (略)
2. windows2012 双击可直接作虚拟光盘使用
3. 打开光盘后, 看到下面三个重要目录
guest-agent (包含安装的二进制文件 (qemu-ga-x64.msi, qemu-ga-x86.msi)
vioserial ( virto-serail driver )
balloon (用于注册 balloon 服务)123456

解决 QEMU-GA 启动 1053 错误

1
2
3
假如直接安装 qemu-ga 软件
启动 qemu-guest-agent 服务时候, 将会报错 1053
要解决这个问题, 你必须自行手动更新 virto serail 驱动123

驱动安装方法

参考

先更新 VIRTO-SERAIL DRIVER

更新 pci 简单通讯控制器 (使用 vioserail 目录中的驱动)
软件安装

点击确认安装

更新驱动
确认安装完成
安装完成

安装BALLOON PCI 驱动 (WINDOWS2012)

updateballoon

点击完成
ballnoon

确认BALLOON PCI 驱动 (WINDOWS2012)

更新所有驱动

手动更新该驱动(WIN7/WIN2008)

这里写图片描述
完成
ballnoon

1
更新驱动后切记重启 vm (win7)1

安装QEMU GUEST AGENT

1
2
3
根据系统版本(x64,x86)
双击光盘 guest-agent 目录下的 qemu-ga-x86.msi 或 qemu-ga-x64.msi
安装过程(略)123

启动 QEMU GUEST AGENT 服务

1
2
利用 cmd ( services.msc) 启动 qemu guest agent 服务
qemu-ga 只用于 instance 管理, 对于本文中的内存信息获取是需要 balloonservice 获取的12

启动

启动 qemu guest agent vss provider ( windows 2012 )
这里写图片描述

验证服务
这里写图片描述

启动 BALLOON 服务 (WIN2012)

1
2
3
1. 复制光盘中 balloon 目录到 c:\Program Files
2. 注册 balloon 服务
3. 重启 balloon服务123

参考命令行

1
2
3
4
5
6
7
c:\
mkdir "c:\Program Files\balloon\2k12\amd64"
copy d:\balloon\2k12\amd64\* "c:\Program Files\balloon\2k12\amd64\."
cd c:\Program Files\balloon\2k12\amd64
blnsvr.exe -i
net stop balloonservice
net start balloonservice1234567

注册

启动 BALLOON 服务 (WIN7/WIN2008)

利用管理员身份运行终端
admin-cmd
运行下面命令即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1. 利用 winrar 解压 virtio-win.iso 到桌面 如:
c:\Users\administrator\Desktop\virtio-win
2. 完成设备管理器中 PCI 建议通讯控制器驱动安装
3. 安装 virtio-win 解压下的 guest-agent 目录, 安装 qemu-ga.x64.msi 软件

win7 版本
4. 复制 devcon64.exe 至 c:\Users\administrator\Desktop\virtio-win\Balloon\w7\amd64 目录中
5. 复制下面命令

cd c:\Users\administrator\Desktop\virtio-win\Balloon\w7\amd64
devcon64 install BALLOON.inf "PCI\VEN_1AF4&DEV_1002&SUBSYS_00051AF4&REV_00"
BLNSVR.exe -i
net stop balloonservice
net start balloonservice

windows 2008 版本

4. 复制 devcon64.exe 至 c:\Users\administrator\Desktop\virtio-win\Balloon\2k8\amd64 目录中
5. 复制下面命令

cd c:\Users\administrator\Desktop\virtio-win\Balloon\2k8\amd64
devcon64 install BALLOON.inf "PCI\VEN_1AF4&DEV_1002&SUBSYS_00051AF4&REV_00"
BLNSVR.exe -i
net stop balloonservice
net start balloonservice


6. 以管理员身份打开终端, 并执行上面命令12345678910111213141516171819202122232425262728

参考

win7balloon

验证

重启后, 参考一下监控信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@hh-yun-compute-131230 test]# virsh dommemstat instance-00023f5f   (win2012)
actual 8388608
rss 8263016

[root@hh-yun-compute-131230 test]# virsh dommemstat instance-00023f5f
actual 8388608
swap_in 882920
swap_out 0
major_fault 31190
minor_fault 1717511
unused 7280252
available 8388180
rss 8263048

[root@hh-yun-compute-131230 test]# virsh dommemstat instance-000242c1 (win7)
actual 4194304
rss 4160316

[root@hh-yun-compute-131230 test]# virsh dommemstat instance-000242c1
actual 4194304
swap_in 862932
swap_out 0
major_fault 36592
minor_fault 9875462
unused 3239596
available 4193880
rss 4160284

安装完成之后,在虚拟机选项里,勾选 QEMU Guest Agent

服务器使用agent

对于安装好agent的vm,在其概况界面,会显示VM的网卡信息。

更加全面的用法如,需要用到qm agent命令 语法如下

1
qm agent <vmid> <cmd>

这里vmid 就是vm的id啦。cmd就是命令。我这里列出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fsfreeze-freeze 
fsfreeze-status
fsfreeze-thaw
fstrim #查看ssd——trim
get-fsinfo #查看磁盘信息
get-host-name #查看主机名
get-memory-block-info #查看内存块 信息
get-memory-blocks #查看您内存
get-osinfo #查看系统信息
get-time #查看时间
get-timezone #查看时区
get-users #用户
get-vcpus #查看CPU数量
info #查看支持的命令
network-get-interfaces #查看网络
ping #不明
shutdown #关机
suspend-disk #休眠,储存到硬盘
suspend-hybrid #休眠,混合
suspend-ram #挂起/休眠 内存

以上命令均支持TAB键 自动补全。

举个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#查看vm的网卡信息
qm agent 101 network-get-interfaces
#返回json

[
{
"hardware-address" : "00:00:00:00:00:00",
"ip-addresses" : [
{
"ip-address" : "127.0.0.1",
"ip-address-type" : "ipv4",
"prefix" : 8
},
{
"ip-address" : "::1",
"ip-address-type" : "ipv6",
"prefix" : 128
}
],
"name" : "lo",
"statistics" : {
"rx-bytes" : 6324,
"rx-dropped" : 0,
"rx-errs" : 0,
"rx-packets" : 84,
"tx-bytes" : 6324,
"tx-dropped" : 0,
"tx-errs" : 0,
"tx-packets" : 84
}
},
{
"hardware-address" : "76:ee:94:38:3a:85",
"ip-addresses" : [
{
"ip-address" : "10.13.14.100",
"ip-address-type" : "ipv4",
"prefix" : 24
},
{
"ip-address" : "fe80::74ee:94ff:fe38:3a85",
"ip-address-type" : "ipv6",
"prefix" : 64
}
],
"name" : "eth0",
"statistics" : {
"rx-bytes" : 1324,
"rx-dropped" : 0,
"rx-errs" : 0,
"rx-packets" : 9,
"tx-bytes" : 1810,
"tx-dropped" : 0,
"tx-errs" : 0,
"tx-packets" : 17
}
}
]
#查看主机名
root@pve:~# qm agent 105 get-host-name
{
"host-name" : "nginx"
}

qm guest 命令集合

qm agent就是qm guest。qm guest主要有下面四个

1
2
3
4
qm guest cmd
qm guest exec
qm guest exec-status
qm guest passwd

1、qm guset cmd

此项等同于qm agent

2、qm guest exec(创建进程)

此项是传递给VM的命令

1
2
3
4
5
6
7
qm guest exec <vmid> <vmcmd> --<option>
<vmid>=vmid
<vmcmd>=vm里面的命令。例如ip link /docker ps等等。命令不能有“-”,因为加了“-”,就会设别成后面的<option>
<option>=这个是特别操作,有3个
pass-stdin=<0/1> 这个似乎不能用
synchronous=<0/1> 如果是0,则返回pid。如果是1,则返回json格式的输出结果
timeout=<整数数字> 超时时间

举几个例子

1、查看usr目录

1
2
3
4
5
6
qm guest exec 108 ls /usr 
{
"exitcode" : 0,
"exited" : 1,
"out-data" : "bin\ngames\ninclude\nlib\nlocal\nsbin\nshare\nsrc\n"
}

如果加上一个 synchronous=0

1
2
3
4
root@pve:/# qm guest exec 108 ls /usr --synchronous=0
{
"pid" : 2001
}

下载一个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
###下载百度首页
root@pve:/# qm guest exec 108 wget https://www.baidu.com
{
"err-data" : "--2020-05-18 19:52:09-- https://www.baidu.com/\nResolving www.baidu.com (www.baidu.com)... 61.135.169.121, 61.135.169.125\nConnecting to www.baidu.com (www.baidu.com)|61.135.169.121|:443... connected.\nHTTP request sent, awaiting response... 200 OK\nLength: 2443 (2.4K) [text/html]\nSaving to: ‘index.html’\n\n 0K .. 100% 258M=0s\n\n2020-05-18 19:52:09 (258 MB/s) - ‘index.html’ saved [2443/2443]\n\n",
"exitcode" : 0,
"exited" : 1
}
###查看根目录是否有index.html
root@pve:/# qm guest exec 108 ls
{
"exitcode" : 0,
"exited" : 1,
"out-data" : "bin\nboot\ndev\netc\nhome\nindex.html\ninitrd.img\ninitrd.img.old\nlib\nlib64\nlost+found\nmedia\nmnt\nopt\nproc\nroot\nrun\nsbin\nsnap\nsrv\nsys\ntmp\nusr\nvar\nvmlinuz\nvmlinuz.old\n"
}

查看nginx是否在运行

1
2
qm guest exec 108 ps aux|grep nginx
返回一堆代表在运行,没运行是没有返回的。

3、qm guest exec-status

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
用法如下
qm guest exec-status <vmid> <pid>
此项可以查看VM的进程PID状态。
比如,我创建一个ping 的进程
qm guest exec 108 ping www.baidu.com --synchronous=0
返回如下。
{
"pid" : 2722
}
那么我再通过这个命令,看看这个pid是什么状态
qm guest exec-status 108 2722
返回
{
"exited" : 0
}
证明这个进程还在存活。
如果先杀掉这个进程,再执行查看pid,第一次回返回一长串数据
{
"exited" : 1,
"out-data" : "PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.\n64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=55 time=37.9 ms\n64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=55 time=38.4 ms\n64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=3 ttl=55 time=38.3 ms\n64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=4 ttl=55 time=38.4 ms\n64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=5 ttl=55 time=38.3 ms\n64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=6 ttl=55 time=38.4 ms\n64 bytes from 61.135.1
******
}
再次执行qm guest exec-status 108 2722
Agent error: Invalid parameter 'pid'
这是就提示错误了。

注意的是。qm guest exec-status这个命令是要和qm guest exec 配合使用。单独使用无效

4、qm guest passwd (重置密码)

此项非常有用

1
2
3
4
5
6
7
8
9
10
#语法如下
qm guest passwd <vmid> <username> [OPTIONS]

#[OPTIONS]只有一个 --crypted=<0/1> 是否加密密码 默认0
实例
qm guest passwd 108 root
#直接更改密码
qm guest passwd 108 administrator
#适用于更改windows操作系统密码
#至于后面的--crypted= 一般不加,都是加密了的密码

文件来源:https://foxi.buduanwang.vip/virtualization/pve/530.html/