制作 OpenStack 的 CentOS6.x 镜像

简介

创建 OpenStack 实例时,我们多数时间是使用 镜像+实例类型 来创建的。那么,制作一个通用的镜像就很重要了。

当用户创建一个实例时,会选择相应的镜像(如centos6.8 或者centos7.3 ),再选择相应的实例类型,如t2.microt2.large, 实际他们对应的可能是2C/2G/20G4C/4G/40G的硬件配置。

因此,对于我们需要使用的镜像,至少要求提供如下功能:

  • 1、合适的操作系统;
  • 2、自动扩容硬件配置;
  • 3、控制台输出日志;
  • 4、带有常用工具;

下面就是CentOS6.8 的镜像制作过程。主流镜像制作请参考官网: create-images-manually

基础环境准备

在控制节点上执行

#安装libvirt相关工具
yum groupinstall Virtualization "Virtualization Client"
yum -y install libvirt

#启动服务
systemctl enable libvirtd; systemctl start libvirtd; systemctl status libvirtd

#下载或从本地上传系统镜像
mkdir /openstack-image
cd /openstack-image
wget http://mirrors.timacloud.cn/centos/6.8/images/CentOS-6.8-x86_64-minimal.iso

制作镜像

#创建`qcow2`格式的镜像文件
chown -R qemu:qemu /openstack-image
qemu-img create -f qcow2 /openstack-image/centos6.8-prod.qcow2 10G

#通过virt-install创建虚拟机
virt-install --virt-type kvm --name centos-6.8-mini \
  --ram 2048 --disk ./centos6.8-prod.qcow2,format=qcow2 \
  --network network=default --graphics vnc,listen=0.0.0.0 \
  --noautoconsole --os-type=linux --os-variant=rhel6 \
  --location=./CentOS-6.8-x86_64-minimal.iso

安装操作系统

安装操作系统,需要通过vnc工具链接到虚拟机终端,在终端内操作。

#查看镜像vnc监听的端口
netstat -ntlp | grep qemu-kvm

查找到虚拟机的vnc端口为5900,使用tigerVNC进行连接,并在控制台完成系统安装。
ip就是服务器的ip,端口默认第一个为5900以此类推,也可以通过命令:virsh vncdisplay vmname查询端口,推荐使用tigervnc来打开。

以这个方式安装操作系统和正常的安装几乎一样,但是有两点需要注意的:

  • 网络: 确保你的网卡eth0是DHCP状态的,而且请务必勾上auto connect的对勾。

  • 分区: 分区的时候选择默认的Use all available space,分区成lvm格式,其他不要设置。

系统安装完毕之后,我们刚才使用的vnc-install命令会自动退出。

配置虚拟机

在控制节点上使用命令启动虚拟机。

#查看所有的虚拟机
virsh list --all

#启动虚拟机
virsh start centos6.8
 
#使用tcpump来抓包发现IP地址
tcpdump -i any 'udp port 67 or port 68'

#远程登录主机
ssh 192.168.122.11

#修改虚拟机网络配置
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
NAME=eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=dhcp
IPV6INIT=no
PEERDNS=no
EOF

#虚拟机常用设置
#设置bash
cat >> ~/.bashrc << EOF
HISTTIMEFORMAT="%F %T "
alias ls='ls --color=auto --time-style +"%T %F"'
alias ll='ls -lrth'
alias vi='vim'
EOF

#设置公共dns
cat > /etc/resolv.conf << EOF
nameserver 223.5.5.5
nameserver 114.114.114.114
EOF

#设置时钟同步
mkdir -pv /var/log/ntpdate
cat >> /etc/crontab << EOF
#每天晚上2:00 定时同步时钟
00 02 * * * root (/usr/sbin/ntpdate ntp1.aliyum.com) >> /var/log/ntpdate/ntpdate_\$(date +\%Y\%m) 2>&1
EOF

#设置vim
cat >> ~/.vimrc << EOF
colorscheme elflord
"highlight search
set hlsearch
"ignorecase
set ignorecase
"Smart Case, work with ignorecase
set smartcase
"Increase search, dynamic search
set incsearch
"Tab size=4 space
set ts=4
EOF

# 设置Selinux为permissive
sed -i '/SELINUX/ s/enforcing/permissive/g' /etc/selinux/config

#设置ssh连接时禁止dns查询
sed -i 's/^#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
sed -i '/PasswordAuthentication s/no/yes/g' /etc/ssh/sshd_config

#设置yum
rm -f /etc/yum.repos.d/* && \
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

#安装常用工具
yum -y install bash-completion bash-completion-extras net-tools telnet \
               mlocate tcpdump gzip unzip bind-utils htop iftop iotop vim \
               rsync lsof wget tree ntpdate

#手动同步一次时钟
ntpdate ntp1.aliyum.com

#删除mac设备配置文件
echo "#" > /etc/udev/rules.d/75-persistent-net-generator.rules
#或者删除已生成的配置文件,重启后会重新生成
rm -f /etc/udev/rules.d/70-persistent-net.rules

#增加如下配置已避免连接实例时出现metadata服务问题
cat >> /etc/sysconfig/network << EOF
NOZERCONF=yes
EOF

#关闭防火墙
service iptables stop && chkconfig iptables off
service ip6tables stop && chkconfig ip6tables off

#安装ACPI服务,能让宿主机对虚拟机进行开关机等电源管理操作
yum -y install acpid
chkconfig acpid on

#安装cloud-init, 使得虚拟机能够自动获取密钥设置主机名等
yum install -y cloud-utils-growpart cloud-init cloud-utils parted
 
#修改cloud_init配置文件,增加dns配置引用,在 cloud_init_modules 下面增加:
vim /etc/cloud/cloud.cfg
cloud_init_modules
 - resolv-conf

#去除cloud-init默认阻止root远程登录并且禁止password认证
vim /etc/cloud/cloud.cfg
users:
– defaults
   disable_root:0  # default 1
   ssh_pwauth:  1  # default 0

#安装linux rootfs resize, 使得实例启动时可以自动扩展根分区
yum -y install git
git clone https://github.com/flegmatik/linux-rootfs-resize.git
cd linux-rootfs-resize
./install
cd ../ && rm -rf linux-rootfs-resize

#开启nova console log日志输出支持,centos6和 centos7有差异
#centos6
vim /etc/grub.conf
console=tty0 console=ttyS0,115200n8 #追加到kernel行末尾

#注:/etc/grub.conf /boot/grub/menu.lst 都是指向 /boot/grub/grub.conf 的软链。

#centos7
vim /etc/default/grub
删除rhgb quiet 并追加 console=tty0 console=ttyS0,115200n8

#重新生成grub.cfg文件
grub2-mkconfig -o /boot/grub2/grub.cfg

#清除yum缓存,然后关机
yum clean all
poweroff

清理和压缩镜像

在宿主机上操作

#清除网络相关硬件生成信息
sudo yum install /usr/bin/virt-sysprep
virt-sysprep -d centos-6.8-mini

#压缩镜像
virt-sparsify --compress ./centos.qcow2 CentOS-6.8-mini-Cloud.qcow2

添加镜像到glance

openstack image create "CentOS-6.8-mini-Cloud" \
  --file ./CentOS-6.8-mini-Cloud.qcow2 \
  --disk-format qcow2 \
  --container-format bare --public 

从virsh删除image模版

确保你制作的镜像已经可用。并且意味着你下次需要重新创建并安装系统。

virsh list --all
virsh undefine centos6.8