相对于Windows镜像制作,Linux镜像制作略微简单,制作教程较为丰富,Openstack插件也相对成熟,本文主要参考Openstack官网,在Linux图形化环境下,利用virt-manager制作CentOS7.3镜像。
一、镜像及工具准备
CentOS7.3安装镜像:CentOS-7-x86_64-DVD-1611.iso
Acpid、Cloud-init、Cloud-utils-growpart等软件直接yum源安装即可
二、镜像制作
创建一个15GB的CentOS镜像盘
1 |
qemu-img create -f qcow2 centos7.3.qcow2 15G |
利用virt-install加载配置
1 2 3 4 5 6 |
virt-install --virt-type kvm --name CentOS-7.3 \ --ram 2048 –disk centos7.3.qcow2,format=qcow2 \ --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole \ --os-type=linux --os-variant=rhel7 \ --cdrom=CentOS-7-x86_64-DVD-1611.iso |
利用virt-manager安装操作系统
1 |
virt-manager |
选择光盘启动
启动后,进入安装界面
安装位置及分区这里要注意,磁盘分区选择标准磁盘分区,文件系统类型可以是XFS或EXT4,本人在测试了CentOS7 采用LVM磁盘管理方式,制作镜像后创建虚拟机均无法扩展分区,结果详见附录部分。
常规配置完成后进入安装,安装完成后重启,进入操作系统后,设置网卡为DHCP模式。
为保证宿主机能够对虚拟机进行重启、关机等操作,需要在镜像中安装Acpid服务,命令如下:
1 2 |
yum install -y acpid systemctl enable acpid |
为能够获取Openstack的元数据服务,从而对虚拟机进行主机名、SSH等相关配置,安装Cloud-init,如下:
1 |
yum install -y cloud-init |
如果默认允许Root SSH密码访问,需要修改cloud-init配置文件/etc/cloud/cloud.cfg
1 2 |
disable_root: 0 ssh_pwauth: 1 |
此外,如果不允许虚拟机重启后恢复初始的主机名,允许意味着虚拟机重启后会修改已经更改的主机名为初始值,这对某些依赖hostname的应用非常不利,这里需要禁用cloud-init的更新主机名配置,即删除或注释update_hostname配置
1 |
#- update_hostname |
为保证磁盘的根分区能够动态调整大小,安装Cloud-utils-growpart
1 |
yum install -y cloud-utils-growpart |
为保证能够获取元数据服务,需禁止零配置路由
1 |
echo "NOZEROCONF=yes" >> /etc/sysconfig/network |
为保证利用nova console-log命令或在Dashboard中能够获得虚拟机的日志信息,需修改GRUB引导程序配置。编辑/etc/default/grub配置文件,删除rhgb quiet,并增加console=tty0 console=ttyS0,115200n8配置项,配置项如下:
1 2 |
... GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8" |
执行以下命令保存配置项:
1 |
grub2-mkconfig -o /boot/grub2/grub.cfg |
完成配置,关闭系统。
在制作环境服务器上清除镜像制作过程中产生的/etc/sysconfig/network-scripts/ifcfg-eth0、/etc/udev/rules.d/70-persistent-net.rules网卡等信息,这是因为虚拟机创建后都会生成不同的MAC地址。
1 2 |
yum install -y libguestfs-tools-c virt-sysprep -d CentOS-7.3 |
镜像制作完毕,清除libvirt中正在编辑镜像的域名,清除后在virt-manager中不会显示
1 |
virsh undefine CentOS-7.3 |
三、验证操作
格式转换并上传镜像
1 2 |
qemu-img convert -f qcow2 -O raw centos7.3.qcow2 centos7.3.raw openstack image create centos7.3-`eval date +%Y%m%d%H%M%S`.raw --file centos7.3.raw --disk-format raw --container-format bare --public |
创建虚拟机,检查新创建虚拟机的磁盘、网络等是否正常。
在测试镜像时,遇到了一个错误:
1 |
Exceeded maximum number of retries. Exceeded max scheduling attempts 3 for instance 85d47cba-a141-4992-9f80-8815b4ea126b. Last exception: Invalid input for dns_name. Reason: 'centos7.3' not a valid PQDN or FQDN. Reason: TLD '3' must not be all numeric. Ne |
本来以为是镜像制作的问题,后来发现这是一个bug,虚拟机名称需要符合RFC 1123和RFC 952,不允许“.数字”结尾,具体请参考https://bugs.launchpad.net/nova/+bug/1581977。
四、【附】讨论及实用脚本
1、讨论
考虑到LVM磁盘管理比较灵活,另外社区镜像制作文档中也说明LVM磁盘分区没有问题,但本人采用了LVM磁盘分区测试了多个CentOS镜像制作,CentOS7下采用LVM分区方式创建虚拟机后根分区大小均没有自动扩展,测试结果如下:
版本 | 分区方式 | 分区情况 | 根分区自动扩展 | 备注 |
CenOS 6.8 i386 | LVM | /boot、/swap(lvm)、/(lvm) | 成功 | 分区扩展工具为linux-rootfs-resize |
CenOS 7.1 x86_x64 | 标准分区 | / | 成功 | cloud-utils-growpart |
CenOS 7.2 i386 | LVM | /boot、/swap(lvm)、/(lvm) | 失败 | 在epel7中未找到cloud-utils-growpart安装包,安装Fedora 25 for i386安装包 |
/boot、/(lvm) | 失败 | |||
标准分区 | / | 失败 | ||
CenOS 7.2 x86_x64 | LVM | /boot、/swap(lvm)、/(lvm) | 失败 | cloud-utils-growpart |
/boot、/(lvm) | 失败 | |||
标准分区 | / | 成功 | ||
CenOS 7.3 x86_x64 | LVM | /boot、/swap(lvm)、 | 失败 | cloud-utils-growpart |
/(lvm) | 失败 | |||
标准分区 | / | 成功 |
cloud-init源码中resizefs模块中支持多种xfs/ext/btrfs等文件系统的制动扩展,文件系统格式与自动扩展不成功没有关系。 此外,查看了阿里云、腾讯云的CentOS镜像,均未采用LVM分区,cloud-init、cloud-utils-growpart是不支持LVM分区的自动扩展?
(这些文档中有提及No LVM )
https://www.ibm.com/support/knowledgecenter/en/SS4KMC_2.5.0/com.ibm.ico.doc_2.5/c_adding_cloud_init_to_linux_ima.html
https://platform9.com/support/file-system-resize-issues-with-scientific-linux-6-x-cloud-init-0-7-4/)
https://bugzilla.redhat.com/show_bug.cgi?id=1343571
2、实用脚本
镜像配置脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#!/bin/sh ##制定需要配置的网卡 local_nic=eth0 ## 防火墙配置 systemctl disable firewalld.service systemctl stop firewalld.service ## 网卡配置 sed -i -e 's#ONBOOT=no#ONBOOT=yes#g' /etc/sysconfig/network-scripts/ifcfg-$local_nic sed -i -e 's#BOOTPROTO=none#BOOTPROTO=dhcp#g' /etc/sysconfig/network-scripts/ifcfg-$local_nic ifdown $local_nic ifup $local_nic ## 禁用SELinux sed -i -e "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config sed -i -e "s#SELINUXTYPE=targeted#\#SELINUXTYPE=targeted#g" /etc/selinux/config sestatus=$(sestatus -v |grep "SELinux status:"|awk '{print $3}') ## 提示是否重启 flag=unknown if [ $sestatus = "enabled" ];then echo "SELinux is enforce!Reboot now? (yes/no)" read flag else echo "SELinux is disabled!" fi if [ $flag = "yes" ];then echo "Reboot now!" reboot elif [ $flag = "no" ];then echo -e "\033[33mWARNNING:You should reboot manually!------------ \033[0m" fi ## 云套件安装及配置 yum install -y upgrade yum install -y acpid systemctl enable acpid yum install -y cloud-init ## 允许Root SSH密码登录 sed -i -e "s#disable_root: 1#disable_root: 0#g" /etc/cloud/cloud.cfg sed -i -e "s#ssh_pwauth: 0#ssh_pwauth: 1#g" /etc/cloud/cloud.cfg sed -i -e "/update_hostname/d" /etc/cloud/cloud.cfg yum install -y cloud-utils-growpart sed -i -e '/NOZEROCONF=/d' /etc/sysconfig/network echo "NOZEROCONF=yes" >> /etc/sysconfig/network sed -i -e '/GRUB_CMDLINE_LINUX=/d' /etc/default/grub echo "GRUB_CMDLINE_LINUX=\"crashkernel=auto console=tty0 console=ttyS0,115200n8\"" >> /etc/default/grub grub2-mkconfig -o /boot/grub2/grub.cfg |
镜像格式转换、镜像上传、创建虚拟机脚本
1 2 3 4 5 |
#!/bin/sh virt-sysprep -d CentOS-7.2-i386 qemu-img convert -f qcow2 -O raw centos7.2-i386.qcow2 centos7.2-i386.raw openstack image create centos7.2-i386.raw --file centos7.2-i386.raw --disk-format raw --container-format bare --public openstack server create --flavor m1.small --image centos7.2-i386.raw --nic net-id=e416b526-a2cb-4676-a8b0-f32a7c97ece8 --security-group default centos7.2-i386 |
五、参考文档
https://git.launchpad.net/cloud-init
http://www.cnblogs.com/resn/p/6207715.html
https://docs.openstack.org/image-guide/centos-image.html
https://www.rdoproject.org/resources/creating-centos-and-fedora-images-ready-for-openstack/
code
more code
~~~~