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

版权声明:本文为博主原创文章,欢迎转载分享。请注明出处 https://blog.csdn.net/zzh_gaoxingjiuhao/article/details/52638863

背景:

    Openstack 的命令行工具中有 修改用户密码的命令。但是如果不做任何修改(配置)的话,无法正常工作。为了让其能够正常工作。我们需要做如下步骤。

大前提 libvirt >=1.2.6在nova can_set_password 函数判断了支持该功能的版本号。

 

 

  1. 首先添加镜像(以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

 

  1. 修改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,如果自动添加哪?这个问题需要调研一下。

 

 

  1. 在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

 

  1. 检查配置是否正常工作:
    • 在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

 

 

 

 

 

 

阅读更多

没有更多推荐了,返回首页