您的位置:首页 > 产品设计 > UI/UE

nova 通过 qemu-guest-agent 修改用户密码

2016-09-23 15:33 846 查看
背景:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息