制作OpenStack云主机映像的指南

简介

什么是云主机映像?

  • 云主机映像是单个文件,其中包含了一个可启动地操作系统;
  • 云主机映像有多种格式,将在下文中一一介绍;

获取

官方提供的云主机映像

Cirros

  • 最小的Linux发行版, 旨在作为云计算平台的测试镜像;
  • 下载链接:Download
  • 登录帐号为cirros,登录密码为cubswin:)

Ubuntu

  • Canonical团队维护了一套基于官方Ubuntu镜像制作而成的云主机映像;
  • 该镜像不支持密码登录,仅支持密钥登录,登录用户为ubuntu
  • 下载连接:Download
  • 国内资源:中科大清华大学

CentOS

  • CentOS官方维护的镜像;
  • 该镜像不支持密码登录,仅支持密钥登录,登录用户为centos
  • 下载链接:CentOS6CentOS7

其他镜像

  • 请查阅OpenStack官网

手动制作云主机映像

制作CentOS系统的映像

  • 检测系统是否支持KVM
1
$ egrep -c '(vmx|svm)' /proc/cpuinfo
  • 更新软件包索引与更新软件:
1
$ yum makecache fast && yum update -y
  • 安装必要的软件:
1
2
3
$ yum install -y virt-install libvirt qemu-kvm
$ systemctl start libvirtd.service
$ systemctl enable libvirtd.service
  • 创建目录,便于合理存储资源:
1
$ mkdir -p /image/{iso,virtual}
  • 创建一块空磁盘:
1
$ qemu-img create -f qcow2 /image/virtual/centos-7.3.qcow2 10G
  • 使用XFtpCentOS的原始镜像上传至服务器中;
  • 使用virt-install创建虚拟机安装操作系统:
1
2
3
4
5
6
7
# 若本机不支持虚拟化,请将<virt-type>选项更改为<qemu>
$ virt-install --name centos-7.3 --virt-type kvm \
--ram 2048 --vcpus=2 \
--network network=default \
--disk /image/virtual/centos-7.3.qcow2,format=qcow2 \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--cdrom=/image/iso/CentOS-7-x86_64-Minimal-1611.iso
  • 获取VNC的端口号:
1
$ virsh vncdisplay centos-7.3
  • 推荐使用的VNCTightvncUltraVNC
  • 在客户端使用VNC连接并安装操作系统即可:

    1. 选择本地时区:Asia/ChongqingAsia/Shanghai
    2. 磁盘分区:
      • 常规分区方式:/bootswap/分区;
      • 可选分区方式:仅/分区;
    3. 安装软件:OpenSSH Server
    4. 安装引导:GRUB boot loader;
    5. 分离CD并重启系统(此处可能需要手动启动虚拟机);
  • 启动虚拟主机:

1
$ virsh start centos-7.3
  • 获取VNC的端口号:
1
$ virsh vncdisplay centos-7.3
  • 在客户端使用VNC连接;

  • 启用网卡:

1
$ vi /etc/sysconfig/network-scripts/ifcfg-ens3
1
2
...
ONBOOT=yes
1
$ systemctl restart network.service
  • 获取虚拟主机的IP地址:
1
$ ip addr
  • 在服务器上使用ssh连接虚拟主机,使用普通用户连接;
1
$ ssh root@192.168.122.126
  • 修改操作系统的软件源:
1
$ vi /etc/yum.repos.d/CentOS-Base.repo
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
# CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  • 更新软件包索引与更新软件:
1
2
$ yum makecache fast && yum update -y
$ yum install -y vim wget bzip2 net-tools
  • 安装acpid软件:
1
2
$ yum install -y acpid
$ systemctl enable acpid
  • 安装cloud-init软件:
1
$ yum install -y cloud-init cloud-utils-growpart
  • 禁用ZeroConf路由:
1
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
1
$ vim /etc/cloud/cloud.cfg
  • 配置GRUB,使日志能被Nova所捕获:
1
$ vim /etc/default/grub
1
GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"
1
$ grub2-mkconfig -o /boot/grub2/grub.cfg
  • 关闭虚拟主机:
1
$ sudo shutdown -h now
  • 清除虚拟机内部的MAC地址信息:
1
$ virt-sysprep -d centos-7.3
  • 使虚拟机脱离libvirt管理:
1
$ virsh undefine centos-7.3
  • 消除映像空洞:
1
$ virt-sparsify -x /image/virtual/centos-7.3.qcow2 --convert qcow2 /image/virtual/centos-7.3.qcow2.tmp
  • 压缩映像:
1
$ qemu-img convert -c -O qcow2 /image/virtual/centos-7.3.qcow2.tmp /image/virtual/centos-7.3.img
  • 此时映像就制作完成了,接下来上传至OpenStack中即可:
1
2
3
4
$ openstack image create "centos-7.3" \
--public \
--disk-format qcow2 --container-format bare \
--file /image/virtual/centos-7.3.img
  • 转换镜像格式为raw
1
$ qemu-img convert -f qcow2 /image/virtual/centos-7.3.img -O raw /image/virtual/centos-7.3.raw

制作Ubuntu系统的映像

  • 检测系统是否支持KVM
1
$ egrep -c '(vmx|svm)' /proc/cpuinfo
  • 更新软件包索引与更新软件:
1
$ apt update && apt dist-upgrade -y
  • 安装必要的软件:
1
$ apt install -y qemu libvirt-bin virtinst libguestfs-tools
  • 创建目录,便于合理存储资源:
1
$ mkdir -p /image/{iso,virtual}
  • 创建一块空磁盘:
1
$ qemu-img create -f qcow2 /image/virtual/xenial.qcow2 10G
  • 使用XFtpUbuntu的原始镜像上传至服务器中;
  • 使用virt-install创建虚拟机安装操作系统:
1
2
3
4
5
6
7
# 若本机不支持虚拟化,请将<virt-type>选项更改为<qemu>
$ virt-install --name xenial --virt-type kvm \
--ram 2048 --vcpus=2 \
--network network=default \
--disk /image/virtual/xenial.qcow2,format=qcow2 \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--cdrom=/image/iso/ubuntu-16.04.3-server-amd64.iso
  • 获取VNC的端口号:
1
$ virsh vncdisplay xenial
  • 推荐使用的VNCTightvncUltraVNC
  • 在客户端使用VNC连接并安装操作系统即可:

    1. 选择本地时区:Asia/ChongqingAsia/Shanghai
    2. 磁盘分区:
      • 常规分区方式:/bootswap/分区;
      • 可选分区方式:仅/分区;
    3. 安装软件:OpenSSH Server
    4. 安装引导:GRUB boot loader;
    5. 分离CD并重启系统(此处可能需要手动启动虚拟机);
  • 启动虚拟主机:

1
$ virsh start xenial
  • 获取VNC的端口号:
1
$ virsh vncdisplay xenial
  • 在客户端使用VNC连接;

  • 获取虚拟主机的IP地址:

1
$ ifconfig
  • 在服务器上使用ssh连接虚拟主机,使用普通用户连接;
1
$ ssh handge@192.168.122.126
  • 修改操作系统的软件源:
1
$ sudo vim /etc/apt/sources.list
1
2
3
4
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
  • 更新软件包索引与更新软件:
1
$ sudo apt update && sudo apt dist-upgrade -y
  • 安装cloud-init软件:
1
$ sudo apt install -y cloud-init
1
$ sudo vim /etc/cloud/cloud.cfg
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
users:
- default

# 禁用root登录
disable_root: true

preserve_hostname: false

cloud_init_modules:
- migrator
- seed_random
- growpart
- resizefs
- set_hostname
- update_hostname
- users-groups
- ssh

cloud_config_modules:
- emit_upstart
- locale
- set-passwords
- grub-dpkg
- apt-configure
- timezone

cloud_final_modules:
- rightscale_userdata
- scripts-vendor
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- ssh-authkey-fingerprints
- keys-to-console
- phone-home
- final-message
- power-state-change


system_info:
distro: ubuntu
default_user:
name: handge
lock_passwd: True
gecos: Handge
groups: [adm, audio, cdrom, dialout, dip, floppy, netdev, plugdev, sudo, video]
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/bash
paths:
cloud_dir: /var/lib/cloud/
templates_dir: /etc/cloud/templates/
upstart_dir: /etc/init/
ssh_svcname: ssh
apt:
preserve_sources_list: false
disable_suites: [$RELEASE-proposed]
primary:
- arches: [amd64, i386, default]
uri: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
search:
- https://mirrors.tuna.tsinghua.edu.cn/ubuntu
search_dns: true
security:
uri: https://mirrors.ustc.edu.cn/ubuntu
sources_list: |
deb $MIRROR $RELEASE main restricted universe multiverse
deb $UPDATES $RELEASE-updates main restricted universe multiverse
deb $BACKPORTS $RELEASE-backports main restricted universe multiverse
deb $SECURITY $RELEASE-security main restricted universe multiverse
migrate: true
timezone: "Asia/Shanghai"
1
$ sudo vim /etc/cloud/cloud.cfg.d/90_dpkg.cfg
1
datasource_list: [ OpenStack ]
  • 配置GRUB,使云主机日志能被Nova所捕获:
1
$ sudo vim /etc/default/grub
1
2
3
4
5
6
7
GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="text console=tty1 console=ttyS0,115200n8"
GRUB_CMDLINE_LINUX=""
1
$ sudo update-grub
  • 配置SSH服务:
1
$ sudo vim /etc/ssh/sshd_config
1
2
3
4
5
# 允许root用户远程登录
PermitRootLogin yes

# 关闭SSH服务的密码认证
PasswordAuthentication no
  • 重启SSH服务:
1
$ sudo systemctl restart sshd.service
  • 删除handge用户的密码并锁定登录
1
2
$ sudo passwd -d handge
$ sudo passwd -l handge
  • 关闭虚拟主机:
1
$ sudo shutdown -h now
  • 清除虚拟机内部的MAC地址信息:
1
$ virt-sysprep -d xenial
  • 使虚拟机脱离libvirt管理:
1
$ virsh undefine xenial
  • 消除映像空洞:
1
$ virt-sparsify -x /image/virtual/xenial.qcow2 --convert qcow2 /image/virtual/xenial.qcow2.tmp
  • 压缩映像:
1
$ qemu-img convert -c -O qcow2 /image/virtual/xenial.qcow2.tmp /image/virtual/xenial.img
  • 此时映像就制作完成了,接下来上传至OpenStack中即可:
1
2
3
4
$ openstack image create "xenial" \
--public \
--disk-format qcow2 --container-format bare \
--file /image/virtual/xenial.img

制作Windows系统的映像

1
$ qemu-img create -f qcow2 /image/virtual/windows-server-2016.qcow2 10G
  • 使用XFtpWindows-Server-2016的原始镜像上传至服务器中;
  • 使用virt-install创建虚拟机安装操作系统:
1
2
3
4
5
6
7
# 若本机不支持虚拟化,请将<virt-type>选项更改为<qemu>
$ virt-install --name windows-server-2016 --ram 2048 --vcpus 2 \
--network network=default,model=virtio \
--disk path=/image/virtual/windows-server-2016.qcow2,format=qcow2,device=disk,bus=virtio \
--cdrom /image/iso/cn_windows_server_2016_x64_dvd_9718765.iso \
--disk path=/image/iso/virtio-win-0.1.141.iso,device=cdrom \
--graphics vnc,listen=0.0.0.0 --noautoconsole
  • 获取VNC的端口号:
1
$ virsh vncdisplay windows-server-2016
  • 推荐使用的VNCTightvncUltraVNC
  • 在客户端使用VNC连接并安装操作系统即可:

    1. 选择Windows Server 2016 Standard (桌面体验)
    2. 选择自定义:仅安装Windows(高级)
    3. Windows安装程序默认未检测到磁盘, 单击加载驱动程序浏览文件系统;
    4. 选择E:/virtio-win-0.1.1/viostor/2k16/amd64文件夹, 加载驱动完成后, 就可以检测到磁盘了;
    5. 直接选择磁盘即可,不需要格式化为多个分区,直接安装系统即可。
  • 启动虚拟主机:

1
$ virsh start windows-server-2016
  • 获取VNC的端口号:
1
$ virsh vncdisplay windows-server-2016
  • 在客户端使用VNC连接;

  • 默认虚拟主机无法连接到互联网,需要更新驱动:

    1. 服务器管理器工具中选择计算机管理
    2. 计算机管理中选择设备管理器更新驱动;
    3. 更新PCI设备,文件夹选择E:\Balloon\2k16\amd64即可;
    4. 更新以太网控制器,文件夹选择E:\NetKVM\2k16\amd64即可;
  • 安装cloudbase-init软件,在CMD(命令行提示符)中运行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
# 更改策略,允许执行脚本
C:\ powershell
C:\ Set-ExecutionPolicy Unrestricted

# 下载cloudbase-init
# 官网
C:\ Invoke-WebRequest -UseBasicParsing https://cloudbase.it/downloads/CloudbaseInitSetup_Stable_x64.msi -OutFile cloudbaseinit.msi
# 备用
C:\ Invoke-WebRequest -UseBasicParsing http://handge.cn:10080/img/iso/windows/CloudbaseInitSetup_0_9_11_x64.msi -OutFile cloudbaseinit.msi

# 安装cloudbase-init
C:\ .\cloudbaseinit.msi
  • 安装过程中的选择项:

    1. UsernameAdministrator
    2. Serial port for loggingCOM1
    3. 勾选Run Cloudbase-init service as LocalSystem
    4. 耐心等待安装完成,勾选Run SysprepShutdown,点击Finish
  • 使虚拟机脱离libvirt管理:

1
$ virsh undefine windows-server-2016
  • 消除映像空洞:
1
$ virt-sparsify -x /image/virtual/windows-server-2016.qcow2 --convert qcow2 /image/virtual/windows-server-2016.qcow2.tmp
  • 压缩映像:
1
$ qemu-img convert -c -O qcow2 /image/virtual/windows-server-2016.qcow2.tmp /image/virtual/windows-server-2016.img
  • 此时映像就制作完成了,接下来上传至OpenStack中即可:
1
2
3
4
$ openstack image create "Windows-Server-2016" \
--public \
--disk-format qcow2 --container-format bare \
--file /image/virtual/windows-server-2016.img

快速充电

  • 列出所有的虚拟主机:
1
$ virsh list --all
  • 启动虚拟主机:
1
$ virsh start NAME
  • 关闭虚拟主机:
1
$ virsh shutdown NAME
  • 强制关闭虚拟主机:
1
$ virsh destroy NAME

修改镜像

方式一
  • 获取镜像的分区表:
1
$ virt-list-partitions /image/virtual/xenial.img
  • 挂载镜像:
1
$ guestfish --rw -a /image/virtual/xenial.img
  • 加载镜像:
1
><fs> run
  • 挂载根分区/
1
><fs> mount /dev/sda1 /
  • 此时即可对映像进行修改了;
方式二
  • 将映像重新加入libvirt管理
1
2
3
4
5
6
7
8
$ virt-install --name xenial \
--virt-type kvm \
--ram 2048 \
--vcpus=2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--import \
--disk /image/virtual/xenial.img,format=qcow2
  • 获取VNC的端口号:
1
$ virsh vncdisplay xenial
  • 由于安装了cloud-init,故在启动时会等待很长时间;

映像格式

AKI/AMI/ARI

  • Amazon EC2(亚马逊)所支持的映像格式,该映像由三种文件组成;

AKI

  • Amazon Kernel Image:引导映像的内核文件,相当于一个vmlinuz文件;

AMI

  • Amazon Machine Imageraw格式的云主机映像;

ARI

  • Amazon Ramdisk Image:启动时可选的ramdisk文件,相当于一个initrd文件;

ISO

  • ISO格式为只读的ISO 9660文件系统格式,通常被用于CD/DVD

QCOW2

  • QEMU推出的copy-on-write(写时复制)的第2个版本,通常与KVM虚拟机管理程序一起使用;
  • raw格式的映像相比: 使用更小的磁盘占用量并且支持快照;

RAW

  • 最为原始的映像格式,并且原生KVMXen的虚拟机管理程序都支持这一格式;
  • OpenStack的后端使用Ceph作为块存储,则映像格式必须选择raw格式,因为Ceph不支持qcow2格式的映像引导;

VDI

  • VirtualBox支持的映像格式,此格式在OpenStack中无法直接使用,需要转换;

VHD/VHDX

  • Microsoft Hyper-V使用的映像格式,VHDX为增强版,支持更大的磁盘大小和其他功能;

VMDK

  • VMware ESXi虚拟机管理程序使用的映像格式;

磁盘格式

RAW

  • 非结构化的磁盘镜像格式,默认格式;

QCOW2

  • QEMU仿真器支持的磁盘格式,可以动态扩展并支持写时拷贝(copy-on-write);

AKI/AMI/ARI

AKI

  • Amazon Kernel Image:引导映像的内核文件,相当于一个vmlinuz文件;

AMI

  • Amazon Machine Imageraw格式的云主机映像;

ARI

  • Amazon Ramdisk Image:启动时可选的ramdisk文件,相当于一个initrd文件;

ISO

  • ISO格式通常被用于CD/DVD等数据内容的归档格式;

VDI

  • VirtualBoxQEMU仿真器支持的磁盘格式;

VHD/VHDX

  • VMwareXenMicrosoftVirtualBox或其他虚拟机监视器所使用的通用磁盘镜像格式;
  • VHDX为增强版,支持更大的磁盘大小和其他功能;

VMDK

  • 许多常见虚拟机监视器支持的另一种磁盘格式,如:VMware ESXi

容器格式

  • 容器格式被用于指示云主机映像是否包含云主机元数据的文件格式;

AKI/AMI/ARI

AKI

  • Amazon Kernel Image:引导映像的内核文件,相当于一个vmlinuz文件;

AMI

  • Amazon Machine Imageraw格式的云主机映像;

ARI

  • Amazon Ramdisk Image:启动时可选的ramdisk文件,相当于一个initrd文件;

BARE

  • 映像中未包含元数据,默认值;

OVA

  • OVAtar归档文件;

Docker

  • Docker容器的格式;

OVF

  • OVF容器的格式;

有你就有世界,感谢有你,昕!
0%