背景:
Openstack 的命令行工具中有 修改用户密码的命令。但是如果不做任何修改(配置)的话,无法正常工作。为了让其能够正常工作。我们需要做如下步骤。
大前提 libvirt >=1.2.6在nova can_set_password 函数判断了支持该功能的版本号。
- 首先添加镜像(以ubuntu16.04LTS 为例)。并且给镜像添加两个属性:
# openstackimage create --file ubuntu-16.04-server-cloudimg-amd64-disk1.img --disk-format qcow2 --propertyhw_qemu_guest_agent=yes --public Ubuntu-amd64-16.04LTS
# openstack image set --propertyos_admin_user=ubuntu Ubuntu-amd64-16.04LTS
Note: 其中,hw_qemu_guest_agent=yes 表明 image支持qemu guest agent,即可以支持该agent对应的相应操作。下文会提到如何修改ubuntu原生的qcow2 image安装qemu guest agent。 另外一个参数: 是指定 镜像的admin用户名:比如ubunt默认的是ubuntu,CentOS默认的是centos。如果不在镜像中配置该属性,linux会用root、win会有adminxxx.这个在nova的代码中有体现,回头会写一篇相关的源码分析文章。
当image中添加了hw_qemu_guest_agent=yes.之后,nova在创建使用该image的vm的时候就会在xml文件中多出一个设备,如下:
<devices>
<disk type="file"device="disk">
<driver name="qemu"type="qcow2" cache="none"/>
<sourcefile="/opt/stack/data/nova/instances/be0a2055-3212-421f-b911-59d9d6dd76f8/disk"/>
<target bus="virtio"dev="vda"/>
</disk>
<interface type="bridge">
<macaddress="fa:16:3e:7b:6a:ec"/>
<model type="virtio"/>
<driver name="qemu"/>
<sourcebridge="qbrcf6723cc-ae"/>
<targetdev="tapcf6723cc-ae"/>
</interface>
<serial type="file">
<sourcepath="/opt/stack/data/nova/instances/be0a2055-3212-421f-b911-59d9d6dd76f8/console.log"/>
</serial>
<serial type="pty"/>
<input type="tablet"bus="usb"/>
<graphics type="vnc"autoport="yes" keymap="en-us"listen="127.0.0.1"/>
<video>
<model type="cirrus"/>
</video>
<channeltype="unix">
<sourcemode="bind"path="/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-0000000f.sock"/>
<targettype="virtio" name="org.qemu.guest_agent.0"/>
</channel>
<memballoon model="virtio">
<stats period="10"/>
</memballoon>
</devices>
启动vm之后。在host上就会看到:
/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-0000000f.sock
vm上可以看到:/dev/virtio-ports/org.qemu.guest_agent.0
root@ub:~#file /dev/virtio-ports/org.qemu.guest_agent.0
/dev/virtio-ports/org.qemu.guest_agent.0:symbolic link to ../vport1p1
- 修改host的/etc/libvirt/qemu.conf 关闭掉安全选项(这里只是为了能work。正常的话不应该如此,会介绍正常的方式)。写为none。
root@localhost:/etc/libvirt#cat qemu.conf|grep -v "^#"|grep -v "^$"
security_driver = "none"
cgroup_device_acl= [
"/dev/null","/dev/full", "/dev/zero",
"/dev/random","/dev/urandom",
"/dev/ptmx","/dev/kvm", "/dev/kqemu",
"/dev/rtc","/dev/hpet","/dev/net/tun",
"/dev/vfio/vfio",
]
NOTE:这一步需要使用以下的步骤来替代,在实际部署的时候,或者是测试的时候。为了安全。
sudoecho "/var/lib/libvirt/qemu/*.sock rw," | sudo tee -a/etc/apparmor.d/abstractions/libvirt-qemu
sudoservice libvirt-bin restart
sudoservice nova-compute restart
sudoservice apparmor reload
NOTE:但是可以看到,这个方法的第一步,貌似不是一个万全之策,只能添加现有的 sock。那如果我新建一个vm,如果自动添加哪?这个问题需要调研一下。
- 在vm中安装设置qemu guest agent
ubuntu@agent:~$sudo apt-get install -y qemu-guest-agent
ubuntu@agent:~$sudo mkdir /var/log/qemu-agent
ubuntu@agent:~$sudo tee /etc/default/qemu-guest-agent > /dev/null <<EOF
DAEMON_ARGS="--logfile/var/log/qemu-agent/org.qemu.guest_agent.0.log --fsfreeze-hook --verbose"
EOF
ubuntu@agent:~$sudo service qemu-guest-agent restart
*Restarting QEMU Guest Agent qemu-qa
...done
ubuntu@agent:~$sudo ls /var/log/qemu-agent/
org.qemu.guest_agent.0.log
- 检查配置是否正常工作:
- 在host上:
$sudo bash -c "ls/var/lib/libvirt/qemu/*.sock"
/var/lib/libvirt/qemu/capabilities.monitor.sock /var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00000007.sock
- 在vm上:
$sudo file /var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00000007.sock
/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00000007.sock:socket
- 使用 libvirt命令:
# virsh set-user-password --domain 11--user zzh --password 111
无报错,且切换到zzh验证密码正确。
- 使用 qemu-guest-command 验证:
$sudo virsh qemu-agent-command instance-00000007'{"execute":"guest-ping"}'
{"return":{}}
至此,通过qemu guestagent给 vm的admin用户修改密码就可以工作了:
zzh@localhost:~$openstack server set --root-password ub
Newpassword:
Retypenew password:
zzh@localhost:~$
通过如上配置我们可以简单总结一下:
想要使得openstack的修改admin用户或者其他用户(nova set-password)的密码的相关命令能够工作。
就需要保证 1. guest中安装并正确配置、启动了qemu guest agent。2. 在vm对于的libvirt xml文件中有保证
Guest 和host 通信的unix管道。并且配置正确。权限正确。尤其在host端,需要确认libvrt中qemu的安全配置。如果一切OK,这些都能运行良好了。
如上的文档很多地方参考了如下链接:
http://wiki.qemu.org/Features/QAPI/GuestAgent
http://wiki.libvirt.org/page/Qemu_guest_agent
源文档 <https://www.sebastien-han.fr/blog/2015/02/09/openstack-perform-consistent-snapshots-with-qemu-guest-agent/> (有接下来的fs freeze的扩增,可以参考一下)
http://docs.openstack.org/admin-guide/compute-admin-password-injection.html