利用qemu-guest-agent软件实现对KVM虚拟机密码修改

华温书
2023-12-01
当使用KVM虚拟化环境或openstack环境(hypervios层用KVM实现)的虚拟机,很有可能会出现长时间不登录遗忘密码这种很尴尬的情况,以往根据这种情况,往往linux通过单用户模式,window通过工具盘的方式进行密码的更改,这样做比较麻烦,这样情况,当libvirt出现了“Set Admin Root Password”这一功能后就应该得到解决。
由于是基于libvirt提供的功能,所以对libvirt有版本的需求:在ubntu上应该为1.2.16,centos上应该为2.0.0-10。

查看宿主机上libvirt版本
virsh -v 较为简略的输出模式
          -V 较为详细的输出模式
输出样例:
[root@localhost ~]# virsh -v
2.0.0
[root@localhost ~]# virsh -V
Virsh command line tool of libvirt 2.0.0
See web site at http://libvirt.org/
Compiled with support for:
 Hypervisors: QEMU/KVM LXC ESX Test
 Networking: Remote Network Bridging Interface netcf Nwfilter VirtualPort
 Storage: Dir Disk Filesystem SCSI Multipath iSCSI LVM RBD Gluster
 Miscellaneous: Daemon Nodedev SELinux Secrets Debug DTrace Readline Modular

但需要注意的是,即使宿主机上libvirt版本符合要求,直接使用virsh set-user-password命令无法实现更改guest的密码,还需要在guest中安装类似于vmware-tools这样的插件驱动程序的软件-qemu-guest-agent并对guest的xml配置文件做一些修改(这是根据相关工作原理来决定的,宿主机使用一个本地的套接字通过一个通道与guest中的qemu-guest-agent通信,qemu-guest-agent接受相关信息实现相关命令的完成)。

实验: 测试virsh set-user-password是否可以实现对直接修改guest密码的功能
实验环境:宿主机(centos7.3)
                  虚拟机(centos6.5,centos7.0,window 2008,window 2012)
在宿主机上安装虚拟化环境:
# yum group install "Virtualization Host"
# yum install virt-install
# yum install bridge-utils
开启libvirt服务
# systemctl start libvirtd
设置开机自动启动
# systemctl enable libvirtd
注意:如果没有开启libvirt服务
[root@localhost ~]# virsh uri
error: failed to connect to the hypervisor
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or director
启动服务后再检查一下
再进行一下检查工作,出现以下信息表示libvirt服务启动成功
[root@localhost ~]# virsh uri
qemu:///system

为了避免安装系统这一非必要的过程,事先准备好五种系统的镜像,直接使用硬盘启动方式来启动虚拟机,提前建好一个叫netwotk-10-2的网桥
测试centos6.5:
virt-install --name centos6.5 --vcpus 2 --ram 2048 --disk /home/kvm/centos6.5/centos6.5.img,format=raw --network bridge=network-10-2 --graphics vnc,listen=0.0.0.0,port=5901  --channel unix,path=/var/lib/libvirt/qemu/centos6.5.agent,mode=bind,target_type=virtio,name=org.qemu.guest_agent.0  --boot hd
测试centos7.0:
virt-install --name centos7.0 --vcpus 2 --ram 2048 --disk /home/kvm/centos7.0/centos7.0.img,format=raw --network bridge=network-10-2 --graphics vnc,listen=0.0.0.0,port=5902 --channel unix,path=/var/lib/libvirt/qemu/centos7.0.agent,mode=bind,target_type=virtio,name=org.qemu.guest_agent.0  --boot hd
测试window2008:
virt-install --name windows2008 --vcpus 2 --ram 2048 --disk /home/kvm/window2008/window2008.img,format=raw --network bridge=network-10-2 --graphics vnc,listen=0.0.0.0,port=5903 --channel unix,path=/var/lib/libvirt/qemu/window2008.agent,mode=bind,target_type=virtio,name=org.qemu.guest_agent.0  -boot hd
测试window2012:
virt-install --name window2012 --vcpus 2 --ram 2048 --disk /home/kvm/windows2012/windows2012.img,format=raw --network bridge=network-10-2 --graphics vnc,listen=0.0.0.0,port=5904 --channel unix,path=/var/lib/libvirt/qemu/window2012.agent,mode=bind,target_type=virtio,name=org.qemu.guest_agent.0  --boot hd

与常用的创建虚拟机命令相比,以上命令都多了红字部分。这段命令的主要意思是创建一个channel,属主机上提供一个叫xxx.agent的unix套接字,在guest上创建一个org.qemu.guest_agent.0的串行设备,利用这个channel进行相互通信。
当创建完guest之后,当查看guest的xml配置文件时,会多出
 
 
 
 
 
这样的配置片段。

当guest创建完成后,对于centos系统,使用yum install qemu-guest-agent安装qemu-guest-agent软件,对于window系统,利用virtio-win这个iso文件里中的guest-agent文件里的guest-agent.msi软件安装qemu-guest-agent软件。安装软件后,开启相关服务。

centos6.5              # service qemu-ga start
centos7.0              # systemctl start qemu-guest-agent 
window2008       QEMU Guest Agent和  QEMU Guest Agent VSS Provider两个服务
window2012         QEMU Guest Agent和  QEMU Guest Agent VSS Provider两个服务

之后利用virsh   set-user-password [--encrypted] 命令修改guest密码
例如:[root@localhost ~]# virsh set-user-password centos6.5 --user root --password 123456789
当出现Password set successfully for root in centos6.5   表示修改成功

经过测试属主机centos7.3 libvirt版本:libvirt-2.0.0-10
              guest centos6.5 centos7.0 通过centos官方源提供的qemu-guest-agent版本 
                        window2008,window2012 安装virtio-win-0.1.130这个ISO文件内的qemu-guest-agent软件 均可以实现基于 libvirt Set Admin Root Password这一功能。

另外:需要注意的是
1.对于guest的操作系统是centos类linux系统时,需要将系统的selinux关闭或更改为 permissive模式,否则在使用 virsh   set-user-password会报错误;
2.对于 guest的操作系统是centos类linux系统时,如果默认的串口设备名不是org.qemu.guest_agent.0时,需要修改qemu-guest-agent的启动脚本,因为默认启动脚本只识别 org.qemu.guest_agent.0;
3.对于已经使用的系统,可以使用virsh edit “domain”编辑配置文件,在相关的位置中添加
 
 
然后在系统中安装qemu-guest-agent。然后再通过virsh start方式启动虚拟机。

如果是openstack环境:在L版已经支持该特性。我们需要做的是,在上传镜像时,需要给镜像指定一个特定的属性:hw_qemu_guest_agent=yes
样例:glance image-create --name "centos7.0" --file centos7.0-x64-001.img --disk-format raw --container-format bare --visibility public --progress --property hw_qemu_guest_agent=yes

启动虚拟机后,使用 nova set-password (可以是名称也可以是UUID)修改虚拟机的管理员密码
例如:
# nova set-password 7873e461-8ff1-440d-a485-ac32246d3283
输入要修改的密码
当未出现任何提示信息时,一般就表示成功修改了管理员密码。

 类似资料: