8.3 制作 OpenStack 镜像
=======================
|image0|
--------------
这里仅以Ubuntu系统为例,其他系统也是类似,部分不同的地方会给出标注。
8.3.1 准备工作
--------------
--------------
8.3.1.1 下载iso文件
~~~~~~~~~~~~~~~~~~~
下载链接
- ubuntu: https://www.ubuntu.com/download/desktop
- centos:\ `archive.kernel.org/centos-vault/ `__
.. code:: shell
wget http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-server-amd64.iso
8.3.1.2 安装原始系统
~~~~~~~~~~~~~~~~~~~~
步骤主要有两点: 1. raw系统盘 2. xml文件
**raw系统盘**
既然是安装系统,那就必须给系统一个地方放置系统,对于虚拟机来说,其系统盘在宿主机上就是一个文件。我们要先创建这个文件,然后在xml里指定,这就是它的系统盘,把系统安装在这里就行了。
.. code:: shell
qemu-img create -f raw ubuntu-16.04.raw 50G
这里要说明一下,这和 ``CentOS`` 不一样, ``CentOS`` 可以直接使用
``qcow2`` 文件,而 ``Ubuntu``
则不行。因为qcow2文件大小是根据实际占用的大小决定的,一个空文件 只有
``197kb`` 大小 ,\ ``Ubuntu`` 则会认为给定的磁盘空间过小,无法安装。
关于几种镜像格式
可以参考这里:\ `转换镜像格式 `__
**xml文件**
安装原始系统的 ``xml``
文件和由镜像创建虚拟机的大不相同。亲测可用如下,只需要修改\ ``ubuntu-16.04.raw``
和 ``ubuntu-16.04.3-server-amd64.iso`` 对应路经即可。
题外话,如果嫌弃xml太麻烦,而且看不懂。可以直接用命令启动,不过这个我试过是使用vnc的,可能要手动改下为spice。如果是使用
``virt-install`` 的,后面查看 vnc 端口的可以使用
``virsh vncdisplay [domain]``
::
virt-install --name ubuntu-16.04 \
--ram 4096 \
--vcpus 4 \
--cdrom=ubuntu-16.04.3-server-amd64.iso \
--disk ubuntu-16.04.qcow2,format=qcow2 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--os-type=linux \
--os-variant=ubuntuquantal \
--check all=off
``ubuntu.xml`` 文件内容如下:
.. code:: xml
ubuntu-iso
4194304
4194304
2
hvm
destroy
restart
destroy
/usr/libexec/qemu-kvm
8.3.1.3 启动虚拟机
~~~~~~~~~~~~~~~~~~
.. code:: shell
virsh define ubuntu.xml
virsh start ubuntu-iso
# 查看 vnc spice 端口,比如是5909
virsh dumpxml ubuntu-iso|grep spice
8.3.1.4 安装系统
~~~~~~~~~~~~~~~~
安装系统需要可视化图形界面,而我们通常都是使用ssh连接到服务器端,这是没有可视化图形界面的。
这时候就要在我们在windows上安装一个 ``vnc`` 客户端 这里我使用的是
``spice virt-viewer``\ 。
官网下载地址:\ https://virt-manager.org/download/
下载速度十分缓慢,可能需要半个多小时,我已经下载好,上传到百度云盘,需要自取。
|image1|
安装好后,可以尝试连接虚拟机。 如果连接失败,可以自己的排查下原因
.. code:: shell
1. 宿主机的iptables,firewall
2. 端口是否开放,telnet 一下
|image2|
然后根据提示安装系统(注意要先新建一个用户,设置该用户密码,后续要登陆虚拟机使用)。安装完成后,退出spice。
最后关闭虚拟机。
.. code:: shell
virsh shutdown/destroy ubuntu-iso
这样我们所安装的系统就已经存放在 ``ubuntu-16.04.raw`` 这个文件里。
8.3.2 自定义镜像内容
--------------------
8.3.2.1 转换镜像格式
~~~~~~~~~~~~~~~~~~~~
还记得我们之前的镜像是 ``raw`` 格式的吧? ``raw``
文件,有一特点是你创建多大的盘,这个文件就有多大,而不是按需分配的。我们之前创建的是
``50G``\ ,这么大的文件,是无法上传到glance的,我需要将其转换成
``qcow2`` 文件,转换之后,原先的 ``50G`` 就变成了
``1G多``\ ,等到OpenStack创建的时候,它自会转成raw的格式。
.. code:: shell
qemu-img convert -f raw -O qcow2 ubuntu.raw ubuntu-16.04.qcow2
.. _启动虚拟机-1:
8.3.2.2 启动虚拟机
~~~~~~~~~~~~~~~~~~
上面得到的qcow2文件,这时候就要用起来了。用这个镜像文件启动一个虚拟机。
``ubuntu-16.04.xml`` 文件如下:
.. code:: xml
ubuntu-16.04
4194304
4194304
2
/machine
hvm
SandyBridge
destroy
restart
restart
/usr/libexec/qemu-kvm
启动虚拟机
.. code:: shell
virsh define ubuntu-16.04.xml
virsh start ubuntu-16.04
virsh console ubuntu-16.04
8.3.2.3 设置ip地址
~~~~~~~~~~~~~~~~~~
由于我们后面安装东西需要联网。所以我们这边先设置下ip地址,保证虚拟机可以上网。
为了方便和不留下历史ip数据,我推荐使用命令来临时配置ip和网关,而不推荐使用配置文件。
::
# 配置ip
ifconfig ens3 172.20.20.122 up
# 配置网关,这个网关会做snat转发,所以可以上网
route add default gw 172.20.20.200 ens3
检查并设置一下 dns , 不然会装不了包。
``ubuntu`` : ``/etc/resolvconf/resolv.conf.d/base``
``centos`` : ``cat /etc/resolv.conf``
::
nameserver 8.8.8.8
nameserver 114.114.114.114
8.3.2.4 ssh安装并设置
~~~~~~~~~~~~~~~~~~~~~
纯净的系统,是没有 ``openssh`` 的,我们需要手动安装
.. code:: shell
sudo apt-get update
sudo apt-get install openssh-server
查看是否允许密码登陆:
vim /etc/ssh/sshd_config
PermitRootLogin prohibit-password -> PermitRootLogin yes
查看sshd是否启动
ps -ef|grep sshd 如果没启动:sudo service ssh start
ssh目录
::
mkdir -p /root/.ssh
chmod 700 /root/.ssh
8.3.2.5 安装cloud-init
~~~~~~~~~~~~~~~~~~~~~~
**安装软件包**
.. code:: shell
sudo apt-get install cloud-init -y
sudo apt-get install acpid -y
**加入开机自启**
ubuntu的命令如下
.. code:: shell
update-rc.d acpid defaults
# 若要关闭开机自启:
sudo update-rc.d -f acpid remove
centos命令如下
::
chkconfig acpid on
配置cloud-init: ``/etc/cloud/cloud.cfg``
.. code:: shell
# 允许root登陆
disable_root: false
# 开启ssh
ssh_pwauth: 1
如果有自定义的模块,可以放在
``/usr/lib/python2.7/site-packages/cloudinit/config`` 目录下
然后在cloud-init 的配置文件里相应的配置上这个模块即可。
就比如,我写了一个自定义的模块:\ ``cc_ws_virt_network_dep.py``
那我就在 ``/etc/cloud/cloud.cfg`` 的 ``cloud_final_modules``
阶段配置中写入
::
- ws_virt_network_dep
8.3.2.6 实现系统盘自动扩容
~~~~~~~~~~~~~~~~~~~~~~~~~~
原文:\ `OpenStack CentOS
镜像根分区自动扩展 `__
- centos5:太老不支持
- centos6:CentOS 6
要实现分区自动扩展,要安装以下三个包,通过yum安装可能安装不了,可以通过下载离线rpm包来安装:\ `cloud-utils-growpart `__\ ,\ `dracut-modules-growroot `__
::
yum install cloud-init cloud-utils-growpart dracut-modules-growroot
生新生成 initramfs
::
dracut -f
- centos7:CentOS 7 使用的是 3.10 ( > 3.8 ) 的内核,所以并不需要
dracut-modules-growroot 包 ( 源里面也并没有这个包 )。
只安装以下两个包就可以了。
::
yum install cloud-init cloud-utils-growpart
8.3.2.7 开启console
~~~~~~~~~~~~~~~~~~~
原文参考:\ `CentOS 配置
console登录 `__
如果确认虚拟机grub已经设置了,就是xml的问题。将virtio 改成 serial
::
Ubuntu16.04
.. code:: shell
vim /etc/default/grub
# >>> GRUB_CMDLINE_LINUX="console=ttyS0"
# 重新生成配置
grub-mkconfig -o /boot/grub/grub.cfg
CentOS 6.X
::
1. 添加ttyS0的许可,允许root登录
# echo "ttyS0" >> /etc/securetty
2. 修改 /etc/grub.conf 文件
在/etc/grub.conf文件中kernel行末尾追加console=ttyS0
3. 修改/etc/inittab文件(可省略)
在/etc/inittab中加入
S0:12345:respawn:/sbin/agetty ttyS0 115200
4. 重启
# reboot
CentOS 7.X
::
1. 编辑文件/etc/sysconfig/grub,或者/etc/default/grub 文件
在GRUB_CMD_LINELINUX行末尾添加console=ttyS0,类似以下这样:
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet console=ttyS0"
GRUB_DISABLE_RECOVERY="true"
2. 并以root权限运行以下命令:
stty -F /dev/ttyS0 speed 9600
grub2-mkconfig -o /boot/grub2/grub.cfg 或者 grub-mkconfig -o /boot/grub/grub.cfg
systemctl start getty@ttyS0
完成后验证。
8.3.2.8 其他自定义的选项
~~~~~~~~~~~~~~~~~~~~~~~~
CentOS6 创建快照前需要先删除\ ``75-persistent-net-generator.rules``
文件,不然网卡会往上叠加。
可以使用如下方法解决
::
ln -s /dev/null /etc/udev/rules.d/70-persistent-net.rules
关闭防火墙
.. code:: shell
# 先安装工具
sudo apt-get install selinux-utils
# 确认为disabled
getenforce
service firewalld status
service firewalld stop
sudo update-rc.d -f firewalld remove
若有其他要修改的地方,可自行修改。然后关机虚拟机
::
shutdown -h now
8.3.3 修改镜像的文件
--------------------
通过 guestfish 工具可以实现不用创建虚拟机就可以修改镜像里的文件内容。
|image3|
8.3.3 KVM 镜像快照
------------------
参考链接:https://www.cnblogs.com/sammyliu/p/4468757.html
.. code:: shell
$ virsh snapshot-create-as ws_controller01 2.2.7 --disk-only --atomic
$ virsh blockcommit ws_controller01 hda --active --verbose --pivot
|image4|
|image5|
附录:参考文档
--------------
- `OpenStack社区:CentOS
镜像制作示例 `__
- `OpenStack社区:Ubuntu
镜像制作示例 `__
- `OpenStack
虚拟机镜像制作指南 `__
- `OpenStack CentOS
镜像根分区自动扩展 `__
- `CentOS 配置
console登录 `__
--------------
|image6|
.. |image0| image:: http://image.iswbm.com/20200602135014.png
.. |image1| image:: https://i.loli.net/2018/01/27/5a6c34714685d.png
.. |image2| image:: https://i.loli.net/2018/01/27/5a6c34b14c6ec.png
.. |image3| image:: http://image.iswbm.com/20190827200522.png
.. |image4| image:: http://image.iswbm.com/20191211174659.png
.. |image5| image:: http://image.iswbm.com/20191211174956.png
.. |image6| image:: http://image.iswbm.com/20200607174235.png