文章目录
1.实验环境介绍
本文采用的实验环境如下:
主机:Windows7上VMWare12上安装 Ubuntu16.04Server
工具:QEMU+KVM
镜像类型:CentOS7 、Ubuntu16.04
工具:VNC-Client、系统镜像ISO或者IMG格式等,我这里是ubuntu-16.04.5-server-amd64.iso
重要说明:在VMWare上安装Ubuntu16.04Server作为主机时,请打开CPU虚拟化,防止后续使用KVM方式启动时无法启动虚拟机。 在这个位置!
2.制作镜像前准备工作
2.1.虚拟化环境准备
查看是否执行硬件虚拟化,有输出代表支持硬件虚拟化Inter VT-x\ AMD-V,若无输出请关闭主机并打开CPU虚拟化选项。就是前面说的啦。。。
# cat /proc/cpuinfo | egrep 'vmx|svm'
2.2.安装KVM+QEMU虚拟化环境
安装QEMU+KVM 已经Virt系列工具
# apt-get install qemu-kvm libvirt-bin kvm qemu virt-manager bridge-utils
//加载kvm相关的模块
# modprobe kvm
# modprobe kvm_intel
# modprobe kvm_amd
//检测各模块是否正常
# kvm-ok
# lsmod | grep kvm #显示KVM模块是否加载
# virsh -c qemu:///system list
# adduser root kvm #添加用户到KVM组
# service libvirtd restart //启动服务
2.3.网络环境配置
由于在制作系统镜像时,需要安装一些必要的软件包,这个时候就需要确保虚拟机能够连接外网下载更新软件包,或者能够和主机互通。我们这里采用直接让虚拟机可以连接主机所在的局域网即可。网络配置方法如下,对主机网络进行配置,这里以Ubuntu为例创建虚拟机连接时所需要的网桥。
桥接网络(也叫物理设备共享)可以把一个物理设备复制到一台虚拟机。虚拟网桥的网络连接方式可以使虚拟机成为网络中具有独立IP的主机,客户机与子网里面的机器能够相互通信。网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据
//打开配置文件/etc/network/interfaces
//配置如下
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens33 #网卡名以实际为准,有可能是eth0或其它
iface ens33 inet manual
auto virbr0 #虚拟网桥,使用brctl show可查看网桥,不存在可使用brctl addbr 命令创建网桥
iface virbr0 inet static
address 192.168.100.173 #局域网的静态IP地址
#重启网络服务
#/etc/init.d/networking restart
#虚拟网桥virbro将出现IP地址,主机网卡上的IP地址消失
测试Ping www.baidu.com,若不通则检查DNS配置,配置如下。
#vim /etc/resolvconf/resolv.conf.d/base
添加:
nameserver 114.114.114.114
nameserver 8.8.8.8
更多虚拟机和主机间通信方式请参考这里。
3.开始制作镜像
3.1.创建云镜像虚拟机
使用QEMU-IMG生成云镜像的系统盘,这里选用QCOW2格式的磁盘,给定大小40G(目前云厂商基本都是这个大小标准)。注意这里的大小不是占用你当前磁盘的大小而是将要制作的云镜像的系统盘大小。
方法一:
//先生成一个qcow2格式磁盘
# qemu-img create -f qcow2 Ubuntu16.04.qcow2 40G
说明:
该处若提示错误“qemu-kvm: could not open disk image ' ': Permission denied”,则有可能是ACL控制权限的问题导致。
需要将libvirt设置到当前用户的可读写权限下 setfacl -m u:libvirt-qemu:rx /home/“YouUserName”。
//启动该虚拟机
# virt-install --virt-type kvm --name Ubuntu16.04 \ #虚拟机的虚拟化类型及名字
--ram 1024 --vcpus=1 \ #配置CUP及内存大小
--disk Ubuntu16.04.qcow2,format=qcow2 \ #磁盘的文件的位置及格式
--network bridge=virbr0 \ #网络的连接方式这里使用主机的virbr0网桥,上面创建的,确保虚拟机可以联网。
--graphics vnc,listen=0.0.0.0 \ #图形化安装开启VNC连接5901(默认)
--noautoconsole \ #无控制端口输出
--os-type=linux \ #虚拟机操作系统类型(Linux、Windows)
--os-variant=ubuntu16.04 \ #具体的操作系统版本,可以使用命令 “osinfo-query os” 查看支持的选项
--cdrom=ubuntu-16.04.5-server-amd64.iso #使用cdrom的方式进行安装指定ISO镜像位置
QEMU-IMG报错参考链接
关于virt-install命令详细可以使用Man进行查看,或者参考链接。
方法二:
virt-install \ #virt安装命令
--virt-type=kvm \ #类型
--name=centos \ #自己定义
--vcpus=2 \ #cpu数目
--memory=2048 \ #内存
--location=/home/image/ubuntu-16.04.5-server-amd64.iso \ #源镜像文件路径
#目的镜像路径 size为硬盘大小(单位G) format为格式
--disk path=/home/image/Ubuntu16.04.qcow2,size=40,format=qcow2 \
--network bridge=virbr0 \ #网络配置
--graphics none \ #图形化安装
--extra-args='console=ttyS0' \ #--location参数存在时可以有此参数,使用用命令行配置系统
--force #该参数决定是否使用命令行安装,若使用图形化安装请删除
方式一和方式二的主要区别是,是否图像化安装和是否需要提前创建IMG文件,这个在后面将会用到,提前创建和一次性创建的应用。可以修改已经创建好的镜像文件。
说明:
方式一启动需要使用VNC连接,进行图像化安装操作系统步骤,连接大概是这个样子,IP是主机的IP,端口号5901
说明:
方式二的启动是命令行方式进行安装操作系统页面。
3.2安装系统镜像
这里使用方式一启动,图形化方式安装系统。启动后安装界面如下,和正常虚拟化安装步骤一样,直到系统安装完成重启。
安装完成后请重启,此时虚拟机不会自动在VNC重启,需要手动启动一下虚拟机。重启后在主机上进行如下命令操作。
#virsh list //查看当前存在的虚拟机
#virsh shutdown “虚拟机的名字或者ID” //关闭虚拟机
#virsh undefine “虚拟机的名字或者ID” //彻底销毁虚拟机
//重新启动虚拟机,注意本次直接从qcow2磁盘文件启动,不再需要进行安装系统步骤了。命令如下:
virt-install --virt-type kvm --name Ubuntu16.04 \
--ram 1024 --vcpus=1 \
--disk Ubuntu16.04.qcow2,format=qcow2 \
--network bridge=virbr0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--os-type=linux --os-variant=ubuntu16.04 \
--import #跳过安装步骤,直接从磁盘文件启动
至此系统安装完成。
3.3配置云系统
下面开始进行配置,云系统镜像一般需要的配置:
• 安装Cloud-init服务
• 配置主机名hostname
• 配置云镜像用户名和密码
• 配置网卡IP地址、MAC地址
• 配置SSH秘钥对keypair
• 配置ssh(root是否允许登录)、防火墙
• 厂商自定义的的服务等
SSH配置
打开 /etc/ssh/sshd_config
# PermitRootLogin yes #允许root用户登录
如果是CentOS Mininmo可能需要开启允许使用密码登录,默认是只支持公私钥登录
# PasswordAuthentication yes
# GSSAPIAuthentication yes
# GSSAPICleanupCredentials no
配置网络
使用DHCP,开机默认开启网卡连接
安装cloud-init服务
# apt-get install -y cloud-init
验证安装成功没有
# cloud-init init --local
Cloud-init v. 19.1-1-gbaa47854-0ubuntu1~16.04.1 running 'init-local' at Fri, 21 Jun 2019 07:51:44 +0000. Up 873.39 seconds.
注释本地路由防止与OpenStack的metadata服务冲突
#link-local 169.254.0.0
配置内核调试选项
# vim /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"
更新grub配置生效
# grub2-mkconfig -o /boot/grub2/grub.cfg
安装 cloud-utils-growpart。以支持虚拟机系统盘自动扩容。虚拟机制作镜像时指定了根分区大小(比如前面设置的40GB),为了使虚拟机能够自动调整为flavor disk指定的根磁盘大小如50GB,即自动扩容,执行安装命令:
# apt-get install cloud-utils -y
其他配置服务安装配置请参照系统正常安装流程进行测试
关闭虚拟机
history -c
shutdown -h now
至此云镜像系统配置完成!
3.4 清除记录打包压缩镜像
以下操作在主机上进行
关闭虚拟机
#virsh shutdown Ubuntu6.04
#virt-sysprep -d Ubuntu16.04 //清除网络地址信息
#virsh undefine Ubuntu16.04
压缩镜像:
#qemu-img convert -c -O qcow2 <源文件> <目标文件>
#qemu-img convert -c -O qcow2 Ubuntu16.04.qcow2 Ubuntu16.04-hsm.qcow2
#最后将压缩后的镜像上传到OpenStack中的glance服务中,建议使用命令行方式上传服务
至此完成镜像制作所有流程,完!