CentOS镜像

资源下载地址

制作镜像

准备环境

1
2
3
4
5
6
7
8
# ----------------
# 宿主机
# ----------------
# 基础环境准备
yum install -y qemu-kvm qemu-img virt-manager virt-install libvirt

# kvm内核支持(宿主机为虚机时需要开启CPU嵌套虚拟化)
lsmod | grep kvm

命令方式创建虚机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 基础准备
mkdir -p /data/kvm/disk
mkdir -p /data/kvm/image

NAME=centos
DISK=/data/kvm/disk/centos.qcow2
CDROM=/data/kvm/image/CentOS-7-x86_64-Minimal-7.8.2003.iso

# 创建空镜像文件
qemu-img create -f qcow2 /data/kvm/image/centos.qcow2 10G

# 创建虚机
virt-install --virt-type kvm --name $NAME \
--ram 1024 --disk $DISK,format=qcow2 \
--network network=default --graphics vnc,listen=0.0.0.0 \
--noautoconsole --os-type=linux --os-variant=rhel7 --location=$CDROM

# 查看vnc端口
virsh vncdisplay $NAME
# :0 0代表是5900,大于0的从5900之后递增。例如,显示:1,则代表5901

图形方式创建虚机

参考下文章节:windows镜像 - 图形方式创建虚机。需注意以下几点:

  • CPU Model 选择 Hypervisor Default
  • Disk、NIC 类型均选择 VirtIO
  • Display 选择 VNC
  • Video 选择 Cirrus

基础设置

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
# ----------------
# 虚机
# ----------------
# 1. 配置192.168.122.0/24网段ip,即可通过宿主机的virbr0网桥,与宿主机通讯
# 2. 外网通讯,需配置网关:192.168.122.1,DNS:114.114.114.114
#

# ACPID
# PS:
# 如果虚机安装系统重启没有成功,可以在宿主机执行virsh reboot centos命令
# 再连接,安装acpi。acpid服务是用于可以让hypervisior可以重启或关闭虚拟机
yum install -y acpid
systemctl start acpid.service
systemctl enable acpid.service

# SSH
# 修改/etc/ssh/sshd_config如下参数后,重启sshd服务:
PermitRootLogin yes
PasswordAuthentication yes
UseDNS no

# qemu guest agent
yum -y install qemu-guest-agent

# 防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

sed -i 's/enforcing/disabled/' /etc/selinux/config

# 优化Linux句柄数
# vi /etc/security/limits.conf 文件尾加
* soft nofile 65535
* hard nofile 65535

# 关闭zeroconf route
echo "NOZEROCONF=yes" >> /etc/sysconfig/network

# 配置控制台(可选)
# 如果希望在仪表盘界面查看nova控制台的日志,需要做以下配置:
# vi /etc/default/grub,修改GRUB_CMDLINE_LINUX为以下内容
GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"

# 更新grub(若更新grub后执行)
grub2-mkconfig -o /boot/grub2/grub.cfg

# 清除缓存
yum clean all && rm -rf /var/cache/yum

配置Cloud-init

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
# 安装cloud-init相关工具
# - epel-release: yum源
# - cloud-init: 云镜像初始化工具
# - cloud-utils-growpart: 支持虚拟机磁盘扩容
yum install -y epel-release cloud-init cloud-utils-growpart

# 配置cloud-init
vi /etc/cloud/cloud.cfg

# 1. 配置agent访问OpenStack数据源
# 在“/etc/cloud/cloud.cfg”最后一行添加如下内容,配置agent访问OpenStack数据源。
datasource_list: [ OpenStack ]
datasource:
OpenStack:
metadata_urls: ['http://169.254.169.254']
max_wait: 120
timeout: 5

# 2. (可选)在“/etc/cloud/cloud.cfg”中配置“apply_network_config”为“false
# 对于使用Cloud-Init 18.3及以上版本的用户,需执行本操作。
datasource_list: [ OpenStack ]
datasource:
OpenStack:
metadata_urls: ['http://169.254.169.254']
max_wait: 120
timeout: 5
apply_network_config: false

# 3. 设置开放root密码远程登录并开启root用户的ssh权限。
# 以CentOS 6.7系列操作系统为例,配置文件参数含义如下:
# “disable_root”字段为“1”表示为禁用,为“0”表示不禁用(部分OS的Cloud-Init配置使用“true”表示禁用,“false”表示不禁用)。
# 设置“disable_root”值为“0”,“ssh_pwauth”为“1”,“lock_passwd”设置为“false”,“false”表示不锁住用户密码。
users:
- name: root
lock_passwd: False

disable_root: 0
ssh_pwauth: 1

# 4. 在配置文件“/etc/cloud/cloud.cfg”中禁用Cloud-Init接管网络。
# 当Cloud-Init版本等于或高于0.7.9版本时,在配置文件“/etc/cloud/cloud.cfg”中增加如下内容,禁用Cloud-Init接管网络。
network:
config: disabled

# 5. 防止启动云服务器时,系统长时间卡在“Waiting for cloudResetPwdAgent”状态。
manage_etc_hosts: localhost

# 6. 自动扩容vda2,并扩容至/目录
growpart:
mode: auto
devices: [/dev/vda2]
ignore_growroot_disabled: false
runcmd:
- [pvresize,/dev/vda2]
- [lvextend,-l,+100%FREE,/dev/mapper/centos-root]
- [xfs_growfs,/dev/mapper/centos-root]

# 7. 检查Cloud-Init工具相关配置是否成功
# 执行以下命令,无错误发生,说明Cloud-Init配置成功。
cloud-init init --local
# 正确安装的Cloud-Init会显示Cloud-Init的版本详细信息,并且无任何错误信息。

CentOS 官方镜像Cloud-init配置

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
users:
- default

disable_root: 1
ssh_pwauth: 0

mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys: 1
ssh_genkeytypes: ~
syslog_fix_perms: ~
disable_vmware_customization: false

cloud_init_modules:
- disk_setup
- migrator
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- rsyslog
- users-groups
- ssh

cloud_config_modules:
- mounts
- locale
- set-passwords
- rh_subscription
- yum-add-repo
- package-update-upgrade-install
- timezone
- puppet
- chef
- salt-minion
- mcollective
- disable-ec2-metadata
- runcmd

cloud_final_modules:
- rightscale_userdata
- 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:
default_user:
name: centos
lock_passwd: true
gecos: Cloud User
groups: [adm, systemd-journal]
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/bash
distro: rhel
paths:
cloud_dir: /var/lib/cloud
templates_dir: /etc/cloud/templates
ssh_svcname: sshd

# vim:syntax=yaml

镜像清理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 清理用户登录记录
echo > /var/log/wtmp
echo > /var/log/btmp

# 清理相应目录下的临时文件
rm -rf /var/log/cloud-init*
rm -rf /var/lib/cloud/*
rm -rf /var/log/network-config.log

# 执行下面命令,清理残留配置信息
# - SUSE操作系统:查看“/etc/sysconfig/network/”文件夹下有哪些以“ifcfg”开头的文件,删除除了“ifcfg-lo及ifcfg.template”以外的以“ifcfg”开头的文件。
查看文件命令:ll /etc/sysconfig/network/
删除文件命令:rm -rf /etc/sysconfig/network/ifcfgxxx

# - RedHat/CentOS/Oracle/Euler操作系统:查看“/etc/sysconfig/network-scripts/”文件夹下有哪些以“ifcfg”开头的文件,删除除了“ifcfg-lo”以外的以“ifcfg”开头的文件。
查看文件命令:ll /etc/sysconfig/network-scripts/
删除文件命令:rm -rf /etc/sysconfig/network-scripts/ifcfgxxx

# - Ubuntu操作系统:
rm -rf /etc/network/interfaces.d/50-cloud-init.cfg

# 清除历史操作记录
history -w;echo > /root/.bash_history;history -c;history -c;history -c;

镜像压缩

1
2
3
4
# ----------------
# 宿主机
# ----------------
qemu-img convert -c -O qcow2 mongodb_4.2.qcow2.bak mongodb_4.2_cloudimg.qcow2

Red Hat镜像

资源下载地址

制作镜像

准备环境

参考CentOS流程

基础设置

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
# 由于Red Hat官方源需要激活才可以使用,这里使用USTC的CentOS yum源
# yum repo内容从如下地址获取:
# - base源:http://mirrors.ustc.edu.cn/help/centos.html
sed -i 's/$releasever/7/g' /etc/yum.repos.d/*

# 获取CentOS RPM-GPG-KEY
wget http://mirrors.ustc.edu.cn/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7
rpm -import RPM-GPG-KEY-CentOS-7

# 设置主机名
hostnamectl set-hostname rhel7

# 创建默认登录用户
useradd rhel

# ACPID
# PS:
# 如果虚机安装系统重启没有成功,可以在宿主机执行virsh reboot centos命令
# 再连接,安装acpi。acpid服务是用于可以让hypervisior可以重启或关闭虚拟机
yum install -y acpid
systemctl start acpid.service
systemctl enable acpid.service

# SSH
# 修改/etc/ssh/sshd_config如下参数后,重启sshd服务:
PermitRootLogin yes
PasswordAuthentication yes
UseDNS no

# qemu guest agent
yum -y install qemu-guest-agent

# 允许ttyS0登录系统(virsh console)
echo "ttyS0" >> /etc/securetty
grubby --update-kernel=ALL --args="console=ttyS0"
reboot

# 优化Linux句柄数
# vi /etc/security/limits.conf 文件尾加
* soft nofile 65535
* hard nofile 65535

# 关闭zeroconf route
echo "NOZEROCONF=yes" >> /etc/sysconfig/network

# 清除缓存
yum clean all && rm -rf /var/cache/yum

配置Cloud-init

1
2
3
4
5
# 安装cloud-init相关工具
# - epel-release: yum源
# - cloud-init: 云镜像初始化工具
# - cloud-utils-growpart: 支持虚拟机磁盘扩容
yum install -y epel-release cloud-init cloud-utils-growpart

镜像清理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 清理用户登录记录
echo > /var/log/wtmp
echo > /var/log/btmp

# 清理相应目录下的临时文件
rm -rf /var/log/cloud-init*
rm -rf /var/lib/cloud/*
rm -rf /var/log/network-config.log

# 执行下面命令,清理残留配置信息
# - SUSE操作系统:查看“/etc/sysconfig/network/”文件夹下有哪些以“ifcfg”开头的文件,删除除了“ifcfg-lo及ifcfg.template”以外的以“ifcfg”开头的文件。
查看文件命令:ll /etc/sysconfig/network/
删除文件命令:rm -rf /etc/sysconfig/network/ifcfgxxx

# - RedHat/CentOS/Oracle/Euler操作系统:查看“/etc/sysconfig/network-scripts/”文件夹下有哪些以“ifcfg”开头的文件,删除除了“ifcfg-lo”以外的以“ifcfg”开头的文件。
查看文件命令:ll /etc/sysconfig/network-scripts/
删除文件命令:rm -rf /etc/sysconfig/network-scripts/ifcfgxxx

# - Ubuntu操作系统:
rm -rf /etc/network/interfaces.d/50-cloud-init.cfg

# 清除历史操作记录
history -w;echo > /root/.bash_history;history -c;history -c;history -c;

镜像压缩

1
2
3
4
# ----------------
# 宿主机
# ----------------
qemu-img convert -c -O qcow2 rhel7.9.qcow2 rhel-7-x86_64-GenericCloud-7.9.qcow2

Window镜像

资源下载地址

PS:新版本的virtio需要下载iso文件,内部驱动全面

制作镜像

1
2
# 注意事项
1. 创建虚机时,磁盘要尽可能的小,减小镜像的虚拟空间大小。

准备环境

1
2
3
4
5
6
7
8
9
# 基础环境准备
yum install -y qemu-kvm qemu-img virt-manager virt-install libvirt

# 下载所需文件
# 系统镜像:
# - windows10 (cn_windows_10_business_editions_version_1903_updated_july_2019_x64_dvd_68b4eeaa.iso)
# - windows server 2016 (cn_windows_server_2016_vl_x64_dvd_11636695.iso)
# virtio驱动:
# - virtio-win-0.1.190.iso

命令方式创建虚机

1
2
3
4
5
6
7
8
9
10
11
# 创建链接
ln -sv /usr/libexec/qemu-kvm /usr/bin/

# 创建磁盘
qemu-img create -f qcow2 cn_windows_server_2016_vl_x64_cloud_11636695.qcow2 15G

# 创建虚机
qemu-kvm -m 1024 -cdrom cn_windows_server_2016_vl_x64_dvd_11636695.iso -drive file=cn_windows_server_2016_vl_x64_dvd_11636695.qcow2,if=virtio,boot=on -fda virtio-win_amd64.vfd -boot d -nographic -vnc :3

# VNC连接虚机
# 连接方式:`<server ip>:3

图形方式创建虚机

  • 虚机规格:4c 8g 20G(磁盘要尽可能的小,以减小镜像的虚拟大小)

  • 设备类型:VirtIO

  • Spice Server:VNC Server

  • Video:Cirrus

  • 新增CDROM,挂载 vfio.iso 驱动

  • 调整引导顺序,系统ISO的CDROM调整为第一

  • 流程截图参考如下:

OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作

系统安装

需要注意以下两点:

  1. 系统安装时,初始无法识别硬盘,需要加载安装存储驱动后,方可识别出存储盘。
  2. 系统安装完成后,部分设备驱动需要手动安装,如:网卡驱动。

安装流程截图参考如下:

OpenStack使用:镜像制作

OpenStack使用:镜像制作

OpenStack使用:镜像制作

OpenStack使用:镜像制作

OpenStack使用:镜像制作

OpenStack使用:镜像制作

OpenStack使用:镜像制作

OpenStack使用:镜像制作

OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作 OpenStack使用:镜像制作

基础设置

  • 关闭防火墙
  • 开启远程桌面

windows系统配置-6.png

windows系统配置-7.png

安装Cloudbase-init(1.1.2)

cloudbase-init-1.png cloudbase-init-2.png cloudbase-init-3.png cloudbase-init-4.png cloudbase-init-5.png

配置Cloudbase-init(1.1.2)

修改 C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf 目录下的 cloudbase-init.confcloudbase-init-unattend.conf 配置文件

  1. cloudbase-init.conf 末尾添加如下字段

    1
    2
    3
    4
    5
    6
    7
    metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService,cloudbaseinit.metadata.services.httpservice.HttpService,cloudbaseinit.metadata.services.ec2service.EC2Service,cloudbaseinit.metadata.services.maasservice.MaaSHttpService

    plugins=cloudbaseinit.plugins.common.mtu.MTUPlugin,cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.windows.setuserpassword.SetUserPasswordPlugin

    allow_reboot=false
    stop_service_on_exit=false
    check_latest_version=false
  2. cloudbase-init.confcloudbase-init-unattend.conf 中增加以下配置:

    1
    2
    3
    4
    5
    6
    # 配置获取metadata的重试次数和间隔
    retry_count=40
    retry_count_interval=5

    # 不需要修改首次登录使用的密码时,可关闭此功能
    first_logon_behaviour=no
  3. cloudbase-init.confcloudbase-init-unattend.conf 中plugins字段替换成以下配置

    1
    2
    3
    4
    cloudbaseinit.plugins.common.mtu.MTUPlugin, cloudbaseinit.plugins.windows.ntpclient.NTPClientPlugin, cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin, cloudbaseinit.plugins.windows.createuser.CreateUserPlugin, cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin, cloudbaseinit.plugins.windows.licensing.WindowsLicensingPlugin, cloudbaseinit.plugins.common.sshpublickeys.SetUserSSHPublicKeysPlugin, cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin, cloudbaseinit.plugins.common.userdata.UserDataPlugin, cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin, cloudbaseinit.plugins.windows.winrmlistener.ConfigWinRMListenerPlugin, cloudbaseinit.plugins.windows.winrmcertificateauth.ConfigWinRMCertificateAuthPlugin, cloudbaseinit.plugins.common.localscripts.LocalScriptsPlugin

    # cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin为密码注入插件
    # cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin为磁盘扩展插件
  4. 修改SAN策略为OnlineAll类型否则可能导致使用镜像创建云服务器时磁盘处于脱机状态。

    1
    2
    3
    4
    5
    6
    7
    # 查询服务器当前san策略:
    cmd命令行执行diskpart,执行san

    # 如果SAN策略为OnlineAll,请执行exit命令退出DiskPart

    # 执行以下命令修改云服务器SAN策略为OnlineAll。
    san policy=onlineall

安装Guest tools

  1. 安装Virtio-win-guest-tools
guest-tools-1
  1. 安装完成后查看进程QEMU Guest Agent服务已经启动
guest-tools-2

执行sysprep

  1. 进入Cloudbase-Init工具安装路径。

    以Cloudbase-Init工具安装在“C:\Program Files\Cloudbase Solutions\”目录下为例。请切换至C盘根目录下,执行以下命令,进入安装目录。

    cd C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf

  2. 执行以下命令,对Windows系统进行封装。

    C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /unattend:Unattend.xml

    注意:

    • 请务必在执行该命令时,包含“/unattend:Unattend.xml”,否则您当前云服务器的用户名密码等重要配置信息会被重置,后续使用该Windows私有镜像创建的云服务器启动后仍然需要手动执行操作系统设置。
    • 执行完该命令后,云服务器会自动关机。请在关机后使用该云服务器创建镜像,可以保证后续使用该镜像创建的云服务器SID唯一。如果重新启动已经执行过Sysprep操作的Windows云服务器,则执行的Sysprep操作仅对当前云服务器生效,创建镜像前需要重新执行Sysprep操作。
    • 对于Windows Server 2012以及Windows Server 2012 R2操作系统,当云服务器执行完Sysprep操作后,云服务器的Administrator帐号密码会被清除,请您登录云服务器后重新手动设置Administrator帐号的密码,此时在管理控制台界面中设置的云服务器密码将无效,请您妥善保管重新设置的密码。
    • 使用的Windows操作系统需要采用域帐号登录时,请务必在创建私有镜像前执行Sysprep操作。执行Sysprep操作带来的影响请参考“Windows操作系统制作私有镜像为什么要执行Sysprep操作?”。
    • Windows云服务器中的Cloudbase-Init帐户为Cloudbase-Init代理程序的内置帐户,用于云服务器启动的时候获取元数据并执行相关配置。如果用户修改、删除此帐户或者卸载Cloudbase-Init代理程序会导致由此云服务器创建的Windows私有镜像所生成新的云服务器初始化的自定义信息注入失败。因此,不建议修改或删除Cloudbase-Init帐户。

sysprep-1.png

镜像压缩

1
qemu-img convert -c -O qcow2 winserver2016.qcow2 cn_windows_server_2016_vl_x64.qcow2

镜像上传

1
2
3
4
5
6
7
8
# PS:
# 1. 镜像image元数据已经设置hw_qemu_guest_agent为yes,并且QEMU Guest Agent服务正在云主机中运行
# 2. 镜像image元数据设置了os_admin_user。例如,“Administrator”,如果未设置,则nova可能把一个windows guest的管理员误认为是root
# 3. libvirt版本不低于1.2.16
openstack image create --disk-format qcow2 --public \
--property hw_qemu_guest_agent=yes \
--property os_admin_user=Administrator \
--file /root/cn_windows_server_2016_vl_x64.qcow2 windows2016

参考文档

cloud-init

cloudbase-init

官方文档

实践

常见问题