一. workstdtion/ vsphere 制作openstack镜像

note:

演示windows-server2016版本 / 配置时需要至少给C盘50G空间

前言:

因为 windows 默认不支持 virtio 驱动,而通过 openstack 管理的虚拟机是需要 virtio 驱动的,所以需要给 windows 安装驱动,包括硬盘驱动和网卡驱动另外还需要安装CloudbaseInitSetup和qemu-ga (qemu-guest-agent) https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/ 以上地址可下载最新稳定版的 virtio-win-x.x.xxx.iso 文件,该文件包含了硬盘驱动和网卡驱动以及

参考:

命令参考:

安装必备软件

1
2
# 安装必备软件
yum install -y qemu-kvm libvirt virt-install bridge-utils

1.下载Cloudbase-Init工具 下载Cloudbase-Init工具安装包。

根据Windows操作系统的不同位数,您需要下载不同版本的Cloudbase-Init工具安装包。

Cloudbase官网:

http://www.cloudbase.it/cloud-init-for-windows-instances/

Cloudbase-Init分为稳定版本和Beta版本两种。 稳定版本获取路径:

64位:

https://www.cloudbase.it/downloads/CloudbaseInitSetup_Stable_x64.msi
https://cloudbase.it/downloads/CloudbaseInitSetup_0_9_11_x64.msi
https://cloudbase.it/downloads/CloudbaseInitSetup_0_9_9_x64.msi

32位:

https://www.cloudbase.it/downloads/CloudbaseInitSetup_Stable_x86.msi

Beta版本获取路径:

64位:https://www.cloudbase.it/downloads/CloudbaseInitSetup_x64.msi

32位:https://www.cloudbase.it/downloads/CloudbaseInitSetup_x86.msi

virtio-win驱动下载:

https://github.com/virtio-win/kvm-guest-drivers-windows

https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/

windows-iso镜像下载地址:

https://msdn.itellyou.cn/


首先开启vcenter/vmware虚拟化:

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_c7a56db15460c4c9ec3337ba89289ef2.png

注意事项: 目录建议根目录下创建一个新目录 不能在/root目录执行创建工作目录 会报错 权限错误

下载完成截图:共3软件

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_29087c9168c1688bc91ff2c661a017a6.png

2. 网卡配置(物理机/ vmware / vcenter创建)

1
2
# 备份网卡
cp ifcfg-ens33 ifcfg-br0
修改ifcfg-ens33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2、BOOTPROTO="dhcp" # 改为 BOOTPROTO="static"
3、BRIDGE=br0       # 调整为网桥模式 其他不做更改
# 保留如下配置其他配置通通删除
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
BRIDGE=br0
UUID=01d75770-3b87-47e3-bbc3-bebaed2293e3
DEVICE=ens33
ONBOOT=yes

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_6372d21fbb18fb333f61a84f13eed939.png

修改ifcfg-br0

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
1、TYPE="Ethernet"   # 修改为TYPE="Bridge"
2、BOOTPROTO="dhcp"  # 改为 BOOTPROTO="static"
3、NAME="ens33"      # 修改为 NAME="br0"  及 DEVICE="ens33"  修改为 DEVICE="br0"
4、注释 UUID         # UUID="a8d78ec6-485c-4d14-aae1-1908bc6b9a61"
5、配置静态IP
IPADDR=10.0.0.20
PREFIX=24
GATEWAY=10.0.0.220
DNS1=223.5.5.5
# 完整网卡配置 -------------------------------
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
# UUID=01d75770-3b87-47e3-bbc3-bebaed2293e3
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.20
PREFIX=24
GATEWAY=10.0.0.220
DNS1=223.5.5.5
# 重启网卡
systemctl restart network.service

如果采用(云主机)创建需要修改网卡( 强烈建议不要使用云主机可能会出现各种抽风现象 )配置 如下配置 如下:

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
[root@images network-scripts]# cat ifcfg-br0
# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=static      # 改
DEVICE=br0            # 改
HWADDR=fa:16:3e:90:a8:67
MTU=1500
ONBOOT=yes
STARTMODE=auto
TYPE=Bridge           # 改
USERCTL=no            
IPADDR=10.0.0.76      # 改
PREFIX=24             # 改
GATEWAY=10.0.0.1      # 改
DNS1=223.5.5.5        # 改
#-------------------------------------------------------------------------
[root@images network-scripts]# cat ifcfg-eth0
# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=static
DEVICE=eth0
#HWADDR=fa:16:3e:90:a8:67     # 改
MTU=1500
ONBOOT=yes
STARTMODE=auto
TYPE=Ethernet                 # 改
USERCTL=no
BRIDGE=br0                    # 改

3. 查看是否支持虚拟化 (支持)

1
2
# 查看是否支持虚拟化
grep -E '(vmx|svm)' /proc/cpuinfo

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_a37f9f1aa2fc3773a217aed3042a7fdf.png

4. 创建镜像文件包

文件存放目录必须为根目录下新建一个目录 切记不能在root目录否则会报错

各个目录存放文件概览:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 关于文件存放目录必须为根目录下新建一个目录 此处如下:
mkdir -p /data/windows/data
mkdir -p /data/windows/CloudbaseInitSetup

# /data/windows目录存放:
[root@cpe-172-100-70-251 windows]# ls -lh
总用量 101M
-rw-r--r--. 1 root root 101M 3月  22 13:52 CloudbaseInitSetup.iso
drwxr-xr-x. 2 root root  124 3月  22 13:49 data
-rw-r--r--. 1 root root 193K 3月  22 13:51 windows_server_2016_x64.qcow2

#/data/windows/data
[root@cpe-172-100-70-251 data]# ll
总用量 6801916
-rw-r--r--. 1 qemu qemu 6302720000 3月  22 10:43 cn_windows_server_2016_vl_x64_dvd_11636695.iso
-rw-r--r--. 1 qemu qemu  534818816 3月  22 09:18 virtio-win-0.1.229.iso

# /data/windows/CloudbaseInitSetup目录存放
-rw-r--r--. 1 root root 40M 3月  20 2017 CloudbaseInitSetup_0_9_11_x64.msi   (本教程使用版本)
-rw-r--r--. 1 qemu qemu 61M 3月  22 09:18 CloudbaseInitSetup_1_1_4_x64.msi   (稳定版)

执行创建镜像文件包:

1
2
3
4
5
6
7
8
# 创建镜像文件包 :/data/windows/ 目录执行
qemu-img create -f qcow2 windows_server_2016_x64.qcow2 50G
# 将CloudbaseInitSetup_1_1_4_x64.msi 配置放在CloudbaseInitSetup.iso中 (执行目录:/data/windows/)
note: 此步骤不执行通过vnc细化配置时将无法找到win2k16目录下网卡驱动
# 基于目录CloudbaseInitSetup制作iso镜像命名为CloudbaseInitSetup.iso
mkisofs -o CloudbaseInitSetup.iso CloudbaseInitSetup/      
# 查看镜像文件包
qemu-img info windows_server_2016_x64.qcow2

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_57235b7e44eacb3280aa8ad3117a09f1.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_6594c419f60291d68cc7c6093c655a86.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_8dc76fd0808704d1163b1a63b168b02d.png

创建镜像虚拟机

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
73
74
75
76
77
78
79
# 参数
--name windows_server_2016_x64                     #系统命名
--ram 4096 \                                       #内存大默认M
--vcpu=4 \                                         #CPU核数
--os-type=windows \                                 #系统类型
--os-variant=win2k16 \                             #系统版本
--disk windows_server_2016_x64.qcow2,bus=virtio \  #创建系统盘镜像   格式qcow2  总成
# windows ISO镜像路径 类型为CDROM sata盘
--disk path=/data/cn_windows_server_2016_x64_dvd_9327743.iso,device=cdrom,bus=sata \   
# windows 驱动 ISO镜像 路径 类型
--disk path=/data/virtio-win-0.1.190.iso,device=cdrom,bus=sata \   
--bridge=br0,model=virtio \                    #网络桥接模式
--graphics vnc,listen=0.0.0.0 \                    #vnc 
--noautoconsole
# 云主机创建
# --(需要至少60G空间)--------------------------------------------------------------------------------------------
# 执行创建windows镜像 (windows2016)
# workstdtion / 云主机 创建方式均可采用 (方式1)
virt-install --connect qemu:///system --name windows_server_2016_x64 --vcpus=2 --memory 1024 --os-type=windows --os-variant=win2k16 \
--disk windows_server_2016_x64.qcow2,bus=virtio --disk size=50 \
--disk path=./data/cn_windows_server_2016_x64_dvd_9718765.iso,device=cdrom,size=5 \
--disk path=./data/virtio-win-0.1.229.iso,device=cdrom,bus=sata \
--bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --check all=off

# 云主机 创建(参考)(方式2)
sudo virt-install --connect qemu:///system --name windows_server_2016_x64 --vcpus=2 --memory 1024 --os-type=windows --os-variant=win2k16 \
--disk windows_server_2016_x64.qcow2,bus=virtio --disk size=50 \
--disk path=./data/cn_windows_server_2016_x64_dvd_9718765.iso,device=cdrom,size=5 \
--disk path=./data/virtio-win-0.1.229.iso,device=cdrom,bus=sata \
--network network=default,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
# -----------------------------------------------------------------------------------------------------------
# vsphere创建
# -----------------------------------------------------------------------------------------------------------
# windows2016新增驱动(本教程执行命令)
参数:bus=stat >> bus=ide
virt-install --connect qemu:///system --name windows_server_2016_x64 --vcpus=2 --memory 2048 --os-type=windows --os-variant=win2k16 \
--disk windows_server_2016_x64.qcow2,bus=virtio --disk size=50 \
--disk path=./data/cn_windows_server_2016_vl_x64_dvd_11636695.iso,device=cdrom,size=5,bus=ide \
--disk path=./data/virtio-win-0.1.229.iso,device=cdrom,bus=ide \
--disk path=./CloudbaseInitSetup.iso,device=cdrom,bus=ide \ # 新增驱动
--bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --check all=off

# windows2012r2
qemu-img create -f qcow2 windows_server_2012r2_x64.qcow2 30G

mkisofs -o CloudbaseInitSetup.iso CloudbaseInitSetup/

virt-install --connect qemu:///system --name windows_server_2012r2_x64 --vcpus=2 --memory 4096 --os-type=windows --os-variant=win2k12r2 \
--disk windows_server_2012r2_x64.qcow2,bus=virtio --disk size=30 \
--disk path=./data/cn_windows_server_2012_r2_vl_x64_dvd_2979220.iso,device=cdrom,size=5,bus=ide \
--disk path=./data/virtio-win-0.1.229.iso,device=cdrom,bus=ide \
--disk path=./CloudbaseInitSetup.iso,device=cdrom,bus=ide --bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --check all=off

# windows2019
virt-install --connect qemu:///system --name windows_server_2019_x64 --vcpus=2 --memory 2048 --os-type=windows --os-variant=win2k19 \
--disk windows_server_2019_x64.qcow2,bus=virtio --disk size=50 \
--disk path=./data/cn_windows_server_2019_x64_dvd_4de40f33.iso,device=cdrom,size=5,bus=ide \
--disk path=./data/virtio-win-0.1.229.iso,device=cdrom,bus=ide \
--disk path=./CloudbaseInitSetup.iso,device=cdrom,bus=ide \
--bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --check all=off

# -----------------------------------------------------------------------------------------------------------
# 查看刚通过镜像启动的虚拟机虚拟机 / 查看--os-variant支持的类型
virsh list --all # 列出所有虚机
osinfo-query os # 查看支持的类型
virsh shutdown ubuntu # 正常关闭虚拟机
virsh undefine name # 删除虚机
virsh start name # 启动指定虚机
virsh reboot name # 重启指定虚机

[root@localhost windows]# osinfo-query os
Short ID | Name | Version | ID
----------------------+----------------------------------------------------+----------+---
alpinelinux3.5 | Alpine Linux 3.5 | 3.5 |
alpinelinux3.6 | Alpine Linux 3.6 | 3.6 |
alpinelinux3.7 | Alpine Linux 3.7 | 3.7 |
alpinelinux3.8 | Alpine Linux 3.8 | 3.8 |
alt.p8 | ALT p8 StarterKits | p8 |
alt.p9 | ALT p9 StarterKits | p9 |
参考:

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_66220ca6a8e52c12bfe4526cba82dbb3.png

出现下方回显则说明windows镜像创建成功:

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_d46cb89118adb196c752bfeefb854b09.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_49e8c464d4892bd3ca53f4cc2a3e94d9.png

5. virt-install常用命令:

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
# 查看刚通过镜像启动的虚拟机虚拟机 / 查看--os-variant支持的类型
virsh list # 列出正在运行的虚拟机
osinfo-query os # 查看支持的类型
# virt-install常用命令
virsh list --all # 列出所有虚机
virsh start web01 # 启动指定虚机
virsh reboot web01 # 重启指定虚机(关闭状态无法重启)
virsh console name # 连接虚拟机
virsh destroy name # 拔掉电源(很少用)

virsh undefine web01 # 删除虚机文件即删除虚拟机(不会删除磁盘文件)


virsh domblklist web01 # 查看虚拟机磁盘信息
virsh dominfo web01 # 查看虚拟机配置信息
virsh domiflist web01 # 查看虚拟网卡信息
virsh dumpxml web01 # 以 xml格式查看虚拟机
virsh define file-name # 导入虚拟机
virsh edit name # 编辑虚拟机配置(一般是在刚定义完虚拟机之后)自带语法检测
virsh domrename old-name new-name # 虚拟机重命名
virsh vncdisplay web01 # 查看vnc端口
virsh autostart name # 虚拟机随机重启
virsh autostart --disable name # 取消虚拟机随机重启

# 图形界面:
通过执行名virt-manager,启动libvirt的图形界面,在图形界面下可以一步一步的创建虚拟机,管理虚拟机,还可以直接控制虚拟机的桌面。
# 命令行:
virsh list # 显示本地活动虚拟机
virsh list –all # 显示本地所有的虚拟机(活动的+不活动的)
virsh define ubuntu.xml # 通过配置文件定义一个虚拟机(这个虚拟机还不是活动的)
virsh start ubuntu # 启动名字为ubuntu的非活动虚拟机
virsh create ubuntu.xml # 创建虚拟机(创建后,虚拟机立即执行,成为活动主机)
virsh suspend ubuntu # 暂停虚拟机
virsh resume ubuntu # 启动暂停的虚拟机
virsh shutdown web01 # 正常关闭虚拟机
virsh destroy ubuntu # 强制拔掉电源关闭虚拟机(很少使用)

virsh domname 2 # 显示id号为2的虚拟机名
virsh domid ubuntu # 显示虚拟机id号
virsh domuuid ubuntu # 显示虚拟机的uuid
virsh domstate ubuntu # 显示虚拟机的当前状态
virsh dumpxml ubuntu # 显示虚拟机的当前配置文件(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给# 虚拟机分配id号、uuid、vnc端口号等等)
virsh setmem ubuntu 512000 # 给不活动虚拟机设置内存大小
virsh setvcpus ubuntu 4 # 给不活动虚拟机设置cpu个数

配置snat使镜像可以访问internet( 在宿主机执行 )

1
2
3
4
5
6
7
# 开启
--参数:
-s 172.100.70.241 # 镜像ip (或 其他虚拟机)
--to-source 172.100.70.251 # 宿主机ip(或 本虚拟机)
sysctl net.ipv4.ip_forward=1
sysctl -p
iptables -t nat -A POSTROUTING -s 172.100.70.241 -j SNAT --to-source 172.100.70.251

二. vnc细化配置 qemu-img ( 见下章 )

qemu-img命令参考:

https://zhuanlan.zhihu.com/p/623104229

https://support.huaweicloud.com/bestpractice-ims/ims_bp_0030.html

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_e552b52db5a6700f7e86be4d1ee01215.png

11.配置完成后处理镜像(压缩镜像)

参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 参数
-c,表示必须压缩目标镜像(仅限qcow格式)。
-f,第一种镜像格式。
-o, options:选项,是以逗号分隔的格式特定选项列表,格式为name=value格式。使用“-o?”有关使用的格式支持的选项的概述,或参阅下面的格式说明了解详细信息。
++++++++++++++++++++++++++++++++++
#--sparse=always稀疏拷贝,忽略全0数据
cp --sparse=always ws2012r2.qcow2 ws2012r2-new.qcow2 #--sparse=always稀疏拷贝,忽略全0数据
# raw和qcow2需要转换,这里原本用的qcow2,所以未转换。
# 案例:
qemu-img convert -c -f raw -O qcow2 centos7-new.raw centos7-new.qcow2
qemu-img convert -c -O qcow2 centos7-new.qcow2 centos7-mini.qcow2
# 实际操作
qemu-img convert -c -O qcow2 windows_server_2016_x64_new.qcow2 windows_server_2016_x64_min.qcow2
++++++++++++++++++++++++++++++++++

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_ea53daa63d24ff564cde1f936d3d4e0f.png

实际操作:

1
2
3
4
5
6
# raw和qcow2需要转换,这里原本用的qcow2,所以未转换。
# 案例:
qemu-img convert -c -f raw -O qcow2 centos7-new.raw centos7-new.qcow2
qemu-img convert -c -f qcow2 -o raw centos7-new.qcow2 centos7-mini.raw
# 实际操作
qemu-img convert -c -f raw -O qcow2 windows_server_2016_x64_new.raw windows_server_2016_x64_min.qcow2

上传到openstack—skyline:

参数:--property os_distro=windows --property os_version=2012 --property os_admin_user=Administrator

1
2
3
4
# qcm2格式
openstack image create --disk-format qcow2 --public --property hw_qemu_guest_agent=yes --property os_distro=windows --property os_version=2012 --property os_admin_user=Administrator --file windows_server_2016_x64.qcow2 windows_server_2016_x64.qcow2
# raw格式
openstack image create --disk-format raw --public --property hw_qemu_guest_agent=yes --property os_distro=windows --property os_version=2012 --property os_admin_user=Administrator --file windows_server_2019_x64.raw windows_server_2019_x64.raw

使用命令行创建云主机:

1
2
# 此命令必须要先将镜像上传到openstack
openstack server create --config-drive true --image windows2016min.qcow2 --flavor 9 --password ******20! --network demo-net windows2016_test

注: 此时配置完成 集成可修改密码

效果:

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_d0e78dd049d08305a4192234429c341d.png

扩展: 旧面板 windows 重置密码:

更新云主机元数据,添加change_passwd=True, 软重启云主机。重启完之后,虚机密码为 admin_pass 指定的密码。密码重置后再将元数据 change_passwd 删掉,或者改为其他值

添加后 >> 软重启 || 软重启之后 >> 删除change_passwd=True 此时密码变为创建云主机时设置的密码即****023!

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/2/image_65022b246096b0295461a22397c72313.png

教程结束。