前言
在实际应用中,我们会基于已有镜像文件进行个性化的定制,然后制作出满足实际业务需要的镜像文件。这部分我们介绍如何制作一个镜像文件。
一、制作镜像文件
1. 准备工作
- 安装软件
- 开启libvirtd服务
- 创建链接文件
- 检查网络状态
# 安装基本软件
yum install -y virt-install libvirt qemu-kvm
# 启动libvirtd服务
systemctl start libvirtd
systemctl status libvirtd
systemctl enable libvirtd
# 创建链接文件
ln -sv /usr/libexec/qemu-kvm /usr/bin/
# 检查网络
virsh net-list
如果网络状态不是active,则执行命令virsh net-start default
启动default网络即可。
2. 配置网络
- 开启内核转发
- 关闭NetworkManager服务
- 关闭防火墙
- 禁用selinux
sysctl -w net.ipv4.ip_forward=1
systemctl stop NetworkManager
systemctl status NetworkManager
systemctl disable NetworkManager
systemctl stop firewalld
systemctl disable firewalld
sed -i 's#=enforcing#=disabled#' /etc/selinux/config
3. 创建虚拟机
- 准备下载好的镜像文件
- 下载和安装vnc工具(https://www.tightvnc.org/download.php)
- 创建虚拟磁盘
- 打开vnc软件后,安装虚拟机
- 安装系统
- 关闭虚拟机
# 创建虚拟磁盘,大小为10Gb,类型为qcow2
mkdir /openstack/images -p
qemu-img create -f qcow2 /openstack/images/example-web.qcow2 10G
# 查看磁盘大小
qemu-img info /openstack/images/example-web.qcow2
# 安装虚拟机
virt-install --virt-type kvm --name example-web --ram 2048 \
--disk /openstack/images/example-web.qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--os-type=linux \
--cdrom=/os/CentOS-7-x86_64-Minimal-2009.iso
启动虚拟机后,通过vnc工具连接到虚拟机,并按要求安装系统。
1)不一定要在创建命令执行之前打开,命令执行后,直接连接即可
2)标准分区的时候,只分一个/
3)网卡功能打开,使用dhcp模式
4)主机名指定一个标准的名称:demo
5)安全策略选择关闭
6)设置密码
7)重启vm实例
安装完成后,点击重启,这时候虚拟机会处于关闭状态。所以,需要重启虚拟机。
virsh start example-web
启动后使用vnc连接进去,查看一下ip地址,然后在宿主机上使用ssh连接虚拟机。
4. 修改VM实例配置
- 关闭网络
- 安装acpid以及其他基本工具
- 清空网卡规则
# 关闭NetworkManager
systemctl stop NetworkManager
systemctl status NetworkManager
systemctl disable NetworkManager
# 关闭防火墙
systemctl stop firewalld
systemctl status firewalld
systemctl disable firewalld
# selinux配置
sed -i 's#=enforcing#=disabled#' /etc/selinux/config
# 安装acpid
yum install acpid
systemctl start acpid
systemctl status acpid
systemctl enable acpid
# 安装必备软件
yum install -y net-tools vim tree bash-completion
# 清空网卡规则(如果没有可以不需要清空)
vi /etc/udev/rules.d/70-persistent-ipoib.rules
5. 设置网卡临时模板
因为每次重启虚拟机的时候,网络的配置信息会被重置。所以,我们可以把网络信息保存在一个模板文件中,每次重启VM实例时候将模板文件覆盖网络配置文件。这样用户就无需每次启动VM实例都要重新配置网络。
vim /tmp/ifcfg-eth0-example
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=0.0.0.0
NETMASK=255.255.255.0
GATEWAY=192.168.88.2
DNS1=192.168.88.2
定义完成后,我们需要定义一个脚本文件,让系统启动时候自动执行该脚本文件。
cp /etc/rc.local /tmp/
vim /etc/rc.local
追加一下内容
...
/bin/bash /tmp/get_metadata.sh
# 添加执行权限
chmod +x /etc/rc.d/rc.local
6. 定制启动脚本
vim /tmp/get_metadata.sh
# 定制密钥信息
set_key(){
echo "设置 VM 实例的公钥信息"
if [ ! -d /root/.ssh ]; then
mkdir -p /root/.ssh
chmod 700 /root/.ssh
fi
ATTEMPTS=3
FAILED=0
while [ ! -f /root/.ssh/authorized_keys ]; do
curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/metadata-key 2>/dev/null
if [ "$?" -eq 0 ];
then
cat /tmp/metadata-key >> /root/.ssh/authorized_keys
chmod 0600 /root/.ssh/authorized_keys
restorecon /root/.ssh/authorized_keys
rm -f /tmp/metadata-key
echo "Successfully retrieved public key from instance metadata"
echo "*****************"
echo "AUTHORIZED KEYS"
echo "*****************"
cat /root/.ssh/authorized_keys
echo "*****************"
else
let FAILED=FAILED+1
if [ "${FAILED}" -gt "${ATTEMPTS}" ];
then
echo "Failed"
break
fi
sleep 3
fi
done
}
# 定制网络信息
set_network(){
echo "定制 VM 实例的网卡信息"
if [ -f /etc/sysconfig/network-scripts/ifcfg-eth0 ];
then
rm -f /etc/sysconfig/network-scripts/ifcfg-eth0
mv /tmp/ifcfg-eth0-example /etc/sysconfig/network-scripts/ifcfg-eth0
NETWORK=$(curl http://169.254.169.254/2009-04-04/meta-data/local-ipv4)
sed -i "s/0.0.0.0/${NETWORK}/" /etc/sysconfig/network-scripts/ifcfg-eth0
fi
}
# 定制主机信息
set_hostname(){
echo "定制 VM 实例的主机名信息"
NAME=$(curl http://169.254.169.254/2009-04-04/meta-data/local-hostname)
HOSTNAME="${NAME}".example.com
hostnamectl set-hostname "${HOSTNAME}"
}
# 为了安全起见,最后删除脚本文件
set_delete(){
echo "收尾处理"
rm -f /tmp/get_metadata.sh
mv /tmp/rc.local /etc/rc.d/rc.local
}
# 主函数
main(){
set_key
set_network
set_hostname
set_delete
}
main
脚本定制好后,给脚本文件添加执行权限。
chmod +x /tmp/get_metadata.sh
7. 配置终端
- 关闭 zeroconf route
- 配置终端
- 压缩镜像文件
# 关闭zeroconf配置
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
# 配置终端
vim /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8"
# 使配置生效
grub2-mkconfig -o /boot/grub2/grub.cfg
# 关机
shutdown -h now
完成上面配置后,查看/openstack/images
目录。
ll -h
-rw-r--r-- 1 root root 1.6G 3月 30 19:22 example-web.qcow2
镜像文件大小为1.66Gb。我们可以对镜像文件进行压缩处理。
qemu-img convert -c -O qcow2 example-web.qcow2 example.qcow2
[root@image images]# ll -h
总用量 2.4G
-rw-r--r-- 1 root root 763M 3月 30 19:29 example.qcow2
-rw-r--r-- 1 root root 1.6G 3月 30 19:22 example-web.qcow2
压缩后的镜像文件大小为763M。
二、基于定制的镜像文件创建VM实例
1. 上传镜像文件到控制节点
先启动控制节点,然后执行下面命令。
mkdir -p /openstack/images
cd /openstack/images
scp root@192.168.88.16:/openstack/images/example.qcow2 ./
2. 创建镜像
# 切换admin用户
source openstack-admin.sh
# 上传镜像到openstack中
openstack image create "example-image" --file /openstack/images/example.qcow2 --disk-format qcow2 --container-format bare --public
# 检查
openstack image list
3. 创建实例规格
# 创建实例规则
openstack flavor create --id 1 --vcpus 1 --ram 1024 --disk 10 m2.nano
# 检查
openstack flavor list
4. 创建VM实例
# 切换demo用户
source openstack-demo.sh
# 创建实例
openstack server create --flavor m2.nano --image example-image --nic net-id=d75d1e11-0639-4b63-a463-2e6e4ae0efb3 --security-group default --key-name mykey example-dingzhi
# 检查
openstack server list
5. 验证
- 验证主机名
- 验证公钥
- 验证IP地址
- 验证安全
- 查看rc.local是否有执行权限
# 登录vm实例(启动定制实例速度较慢,可以通过dashboard查看启动过程)
ssh root@实例IP
# 验证公钥
cat .ssh/authorized_keys
# 验证主机名
hostname
# 验证IP地址
cat /etc/sysconfig/network-scripts/ifcfg-eth0
# 验证安全
ls /tmp # 看一下该目录下是否有一些无关紧要的文件
# 查看rc.local是否有执行权限
ll /etc/rc.local
cat /etc/rc.local
总结
这部分介绍了如何定义一个新的镜像文件,以及基于该镜像文件创建一个虚拟机实例。接下来介绍如何定义网络。