OpenStack安装信息
- 安装工具:kolla ansible
- 安装版本:Train版
- 虚拟化层:qemu
- Nova配置:默认配置,未做修改
官方镜像地址
- Cirros:https://download.cirros-cloud.net/
- Centos:http://cloud.centos.org/centos/
- Ubuntu:http://cloud-images.ubuntu.com/releases/
密码注入:Cloud Init
推荐使用该方式修改root密码,适用性强。
创建实例时,在配置项
填写定制化脚本
,并勾选配置驱动
(默认不勾选,不勾选会出现密码不生效的问题)
支持两种形式内容,一种是cloud-init配置文件,另一种是脚本文件。
传入cloud-init配置文件,内容参考如下,有以下几点要特别注意:
#cloud-config
井号和cloud-config中间不能有空格,有空格就会注入失败root:123456
中间不能有空格,有空格就会注入失败Windows使用cloudbase-init工具进行初始化,传入的userdata与linux中的cloud-init格式有差距,具体使用方法可参考:Cloudbase-init官方文档:Userdata
Linux Userdata密码注入
1 | #cloud-config |
Windows Userdata密码注入
1 | #cloud-config |
- 传入脚本文件,内容参考如下:
1 | !/bin/sh |
密码修改:qemu-guest-agent
镜像内部需要安装:qemu-guest-agent
组件 版本 位置 libvirt 1.2.16+ 宿主机 python-libvirt 1.2.16+ 宿主机 qemu-guest-agent 2.3+ 虚机内部 cirros镜像不适用该方式,版本:cirros-0.4.0-x86_64-disk.img。
centos镜像适用。版本:CentOS-7-x86_64-GenericCloud-2003.qcow2。
原理
qemu guest agent,简称qga,是一个运行在虚拟机内部的普通应用程序,可实现宿主机libvirt和虚拟机的通信,宿主机可通过向虚机中的qga发送命令控制虚机。这种通信不依赖网络,而是通过virtio-serial的方式。使用virtio传递消息,对虚拟机和主机的网络设置没有任何要求,且效率更高,类似于VMware Tools。虚机xml文件内 virtio-serial
代码段如下:
1 | <channel type='unix'> |
Libvirt层面修改流程
1 | virsh set-user-password <domain> <user> <password> |
OpenStack层面修改流程
步骤1:修改image元数据
方式1:前端修改
编辑镜像,在元数据
- libvirt Driver Options for Images
- QEMU Guest Agent
,设置为yes
即可
方式2:后端修改
1 | 增加image元数据信息 |
不设置该参数,修改密码时会报QEMU guest agent is not enabled (HTTP 409)
,错误如下:
步骤2:使用更新后的镜像创建虚机
步骤3:后端修改虚机密码
1 | openstack server list |
密码修改:virt-edit
原理
通过 libguestfs-tools
,可直接访问虚机磁盘,通过修改虚机磁盘内的 /etc/shadow
文件,达到修改密码的目的。
libguestfs is a set of tools for accessing and modifying virtual machine (VM) disk images. You can use this for viewing and editing files inside guests, scripting changes to VMs, monitoring disk used/free statistics, creating guests, P2V, V2V, performing backups, cloning VMs, building VMs, formatting disks, resizing disks, and much more.
libguestfs can access almost any disk image imaginable. It can do it securely — without needing root and with multiple layers of defence against rogue disk images. It can access disk images on remote machines or on CDs/USB sticks. It can access proprietary systems like VMware and Hyper-V.
All this functionality is available through a scriptable shell called guestfish, or an interactive rescue shell virt-rescue.
修改流程
- 安装
libguestfs-tools
,若libvirt使用docker方式运行,则需要在docker镜像内打包该工具,参考Dockerfile如下:
1 | FROM registry.local:9001/library/centos-source-libvirt:train |
注意:
- docker yum安装容易出现:Rpmdb checksum is invalid: dCDPT(pkg checksums): … 。需要在安装前先执行
rpm --rebuilddb
且必须与 yum 命令处于同一个 RUN 内。也就是有时候在使用dockerfile build的时候,如果有多条 “RUN yum install -y …” 指令,需要在每条之前都加上 “rpm –rebuilddb”。
- 关闭需要修改密码的虚机。
- 生成新的密码串。
1 | openssl是一个加密工具,-1 是指普通加密, |
- 宿主机内,通过
virt-edit
命令修改虚机磁盘内/etc/shadow
文件中记录的root密码,将内容替换为第三步生成的密文。
1 | virt-edit instance-00000020 /etc/shadow |
注意:
/etc/shadow
文件中,第一个冒号与第二个冒号之间为加密后的密文。- libvirt容器直接运行
virt-edit
命令很容易报错,内容如下:
1
2
3
4
5
6
7
8 supermin: failed to find a suitable kernel (host_cpu=x86_64).
I looked for kernels in /boot and modules in /lib/modules.
If this is a Xen guest, and you only have Xen domU kernels
installed, try installing a fullvirt kernel (only for
supermin use, you shouldn't boot the Xen guest with it).
libguestfs: trace: launch = -1 (error)原因:supermin需要访问内核,但是未在libvirt容器内找到内核
解决方案:libvirt容器透传主机的 /boot 与 /lib/modules。
- 修改后保存退出,启动虚机即可用新密码登录。
参考文档
- libguestfs-tools官方文档
- OpenStack Virtual Machine Image Guide
- OpenStack Train版操作笔记(14)—使用官方云镜像启动实例并命令行修改root密码
- openstack虚拟机系统密码的修改方案
- cloud-init 典型应用 - 每天5分钟玩转 OpenStack(174)
- cloudbase-init官方文档:Cloud config
- Libvirt官方文档:Qemu guest agent
- 基于QMP实现对qemu虚拟机进行交互
- kvm 虚拟化(二 修改root密码)
- Bug 1542892- supermin: failed to find a suitable kernel (host_cpu=x86_64)