Openstack学习总结之九(制作镜像文件)

前言

在实际应用中,我们会基于已有镜像文件进行个性化的定制,然后制作出满足实际业务需要的镜像文件。这部分我们介绍如何制作一个镜像文件。

一、制作镜像文件

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网络即可。
Openstack学习总结之九(制作镜像文件)

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

总结

这部分介绍了如何定义一个新的镜像文件,以及基于该镜像文件创建一个虚拟机实例。接下来介绍如何定义网络。

上一篇:完整部署CentOS7.2+OpenStack+kvm 云平台环境(2)--云硬盘等后续配置


下一篇:openstack CLI