运行环境
镜像软件准备
关于virtio:
kvm因为使用了硬件虚拟化,所以其cpu方面的运行效率是很高的。不过,kvm在I/O虚拟化方面,传统的方式是利用QEMU纯软件的方式来模拟I/O设备,
这样每次虚机发起I/O请求的时候,KVM内核模块会捕获这次请求,然后处理后将其放入I/O共享页,并通知用户空间中运行的QEMU程序。
QEMU获得I/O操作,交由硬件模拟代码(Emulation)来模拟出本次I/O操作之后,将结果放回I/O共享页,同时通知KVM内核模块读取I/O共享页的操作结果,把结果返回给虚机。
由于这种方式每次I/O操作经过的路径很复杂,其效率很低。所以就提出了virtio这种方案,virtio其实就是一个运行于Hypervisor之上的api接口,
让客户机知道自己运行于虚拟化环境中,进行I/O操作的时候通过virtio与Hypervisor通信,从而是虚机有更好的性能。
CloudBase-init简介
cloudbase-init 是 Windows 和其他系统的云初始化程序,可以设置主机名、创建用户、设置静态ip、设置密码等。对应的linux初始化程序是cloudinit,都是开源的Python项目。官方文档:http://cloudbase-init.readthedocs.io/en/latest/index.html
实现功能:
初始化ip
初始化主机名
初始化用户
自动扩展磁盘
配置文件路径: C:\Program Files or C:\Program Files (x86) as Cloudbase Solutions\Cloudbase-Init目录中. 其中目录结构如下所示:
bin - 可执行文件和其他二进制文件.
conf - 配置文件
log - cloudbase-init相关日志.
LocalScripts - 用户提供的脚本
安装完成之后, cloudbase-init 作为一个使用服务和通过插件去执行的两个步骤的服务, 通过这种方式去支持所有的配置. 根据平台不同的插件可能需要重启.
安装kvm环境
安装准备
kvm虚拟化技术需要硬件的支持,首先检查服务器(或其它)是否支持虚拟化。执行下面命令只要有输出代表都支持虚拟化
1 2 3 # egrep -o '(vmx|svm)' /proc/cpuinfo vmx vmx
安装kvm
1 # sudo apt-get install qemu-kvm libvirt-bin qemu virt-manager bridge-utils
测试kvm是否安装成功
1 2 3 # kvm --version QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.38) #输出版本信息则为成功 Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
验证KVM内核是否加载成功
1 2 3 4 # lsmod | grep kvm kvm_intel 237568 0 kvm 626688 1 kvm_intel irqbypass 16384 1 kvm #输出为此内容则为成功。
若KVM内核没加载执行下面命令加载:
解决方法
直接执行下面两条命令: # sudo modprobe kvm # sudo modprobe kvm-intel ( or kvm-amd )
证实KVM正常运行
1 2 3 # virsh -c qemu:///system list Id Name State ---------------------------------------------------- #输出为此内容则为正常。
如果提示你没权限操作,则需要将当前操作账户添加进libvirtd组
添加命令
# sudo usermod -G libvirtd -a fdc
确认libvirtld后台服务是否启动
1 2 3 4 5 6 7 8 9 10 # systemctl status libvirt-bin ● libvirtd.service - Virtualization daemon Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-12-16 18:34:19 CST; 18h ago Docs: man:libvirtd(8) https://libvirt.org Main PID: 13143 (libvirtd) Tasks: 20 (limit: 32768) CGroup: /system.slice/libvirtd.service ├─13143 /usr/sbin/libvirtd #输出为此内容则为正常运行。
调出kvm图形化界面
通过vnc远程Ubuntu在终端输入下面命令调出kvm图形化界面
使用kvm制作镜像
创建虚拟机
创建存储系统镜像文件的目录
用上面提供的连接下载 好系统 镜像和virtio 镜像,然后传入到ubuntu系统里面
1 2 3 4 5 6 7 8 9 10 # mkdir -p /data/iso/ # cd /data/iso # wget http://hudisk.tpddns.cn:8090/Ubuntu/ubuntu-18.04.3-desktop-amd64.iso # wget http://hudisk.tpddns.cn:8097/openstack_image/virtio-win-0.1.208.iso # ll 总用量 7814704 drwxr-xr-x 2 root root 4096 12月 16 18:48 ./ drwxr-xr-x 4 root root 4096 12月 16 18:46 ../ -rwx------ 1 libvirt-qemu kvm 7445807104 12月 16 18:47 cn_windows_server_2016_vl_x64_dvd_11636695.iso* -rw-r--r-- 1 root root 556431360 12月 16 20:53 virtio-win-0.1.208.iso
创建虚拟机磁盘文件存放目录
使用qemu-img命令创建一个qcow2格式的虚拟机磁盘文件
1 2 # mkdir /data/kvm # qemu-img create -f qcow2 /data/kvm/windows2016.qcow2 15G
1 # virt-install --name winserver2022 --memory 8192 --vcpus 4 --network network=default,model=virtio --disk path=/data/kvm/windows2022.qcow2,format=qcow2,device=disk,bus=virtio --cdrom /data/iso/SERVER_EVAL_x64FRE_zh-cn.iso --disk path=/data/iso/virtio-win-0.1.221.iso,device=cdrom --graphics vnc,listen=0.0.0.0 --virt-type kvm --os-type windows --os-variant win2k16 --boot cdrom
上面的–os-type windows --os-variant win2k16 可以使用osinfo-query os 命令查看对应版本的–os-variant值
创建的虚拟机启动不了,磁盘启动顺序出现问题,加载顺序错误,导致加载不了,原因是是虚拟机的.xml文件中系统镜像iso标记成了hdb,而驱动文件的iso标记成了hda。
解决办法
# 在虚拟机的.xml文件中调整设备启动顺序即可 <os> <type arch=x86_64 machine=pc-i440fx-bionic>hvm</type> <boot dev=hdb/> #系统iso <boot dev=hda/> #驱动iso </os>
加载VirtIO Driver,安装磁盘驱动
默认情况下Windows检测不到可用的安装磁盘,我们需要先安装磁盘驱动。
安装Win2k12R2时,选择【手动加载磁盘驱动】
浏览D:\viostor\2k8R2\amd64\viostor.inf
添加选中文件,点击【下一步】进行安装
注意:我们也可以在此步骤安装其他驱动,但是不推荐,
因为有些驱动系统检测不到,会被隐藏,需要去掉【隐藏与系统硬件不匹配的驱动】的对勾,
才能看到相应的.inf文件进行安装
装其他virtio驱动、启动balloon服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 PCI简易通信控制器-安装vioserial驱动 内存控制器-安装Balloon驱动 网络适配器-安装NetKVM驱动 存储控制器-安装vioscsi驱动 #各个驱动安装操作一致, cd C:\Windows\System32 pnputil.exe -i -a D:\NetKVM\2k16\amd64\netkvm.inf pnputil.exe -i -a D:\vioscsi\2k16\amd64\vioser.inf pnputil.exe -i -a D:\vioserial\2k16\amd64\vioser.inf pnputil.exe -i -a D:\viostor\2k16\amd64\vioser.inf 安装guest-agent 进入驱动D:\guest-agent\ ,双击安装64bit的qemu-ga即可。 之后需要启动balloon服务(ceilometer采集虚拟机内存监控信息所用) 将virtio中的 balloon文件夹放到, c:\Program Files下(和qemu-ga安装目录位置相同即可),在命令行或者图形界面运行次程序, 在服务里面查看有个 Balloon Service 确保服务启动和开机自启动
安装cloudbase-init
从上面提供的连接下载 安装包,然后拷贝到虚拟机里面直接双击安装。
配置文件如下:C:\Program Files\Cloudbase Solutions\Cloudbase-Init下两个文件。
Cloudbase-init.conf
Cloudbash-init-unattend.conf
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 [DEFAULT] # 创建什么用户以及用户属于什么组. username=Admin #一般都是改为Administrator groups=Administrators inject_user_password=true # 从元数据中获取密码 (非随机). # 那个设备是可能的配置驱动 (元数据). config_drive_raw_hhd=true config_drive_cdrom=true # 与ubuntu中功能相同的tar命令默认路径. bsdtar_path=C:\Program Files (x86)\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe # 日志等级. verbose=true debug=true # 日志存放路径. logdir=C:\Program Files (x86)\Cloudbase Solutions\Cloudbase-Init\log\ logfile=cloudbase-init-unattend.log default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN logging_serial_port_settings= # 启用最大传输单元和时间同步服务. mtu_use_dhcp_config=true ntp_use_dhcp_config=true # 存放用户用于执行的脚本的路径. local_scripts_path=C:\Program Files (x86)\Cloudbase Solutions\Cloudbase-Init\LocalScripts\ # 服务将会检测以下驱动直到某个能够成功获取元数据. metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService, #可以开启ConfigDrive和httpservice(Openstack) 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.extendvolumes.ExtendVolumesPlugin, cloudbaseinit.plugins.windows.userdata.UserDataPlugin, cloudbaseinit.plugins.windows.setuserpassword.SetUserPasswordPlugin, cloudbaseinit.plugins.windows.localscripts.LocalScriptsPlugin # 其他配置. allow_reboot=false # allow the service to reboot the system stop_service_on_exit=false
建议将两个文件中下面三行内容删掉,这样每次新建实例就不需要更改密码,使用安装系统的时候设置的密码进系统。 username=Admin
groups=Administrators
inject_user_password=true
OpenStack导入镜像
现在镜像磁盘文件比较大需要使用qemu-img命令压缩文件,压缩之后大概6G左右,然后传到OpenStac控制节点。
1 2 # cd /data/kvm/ # qemu-img convert -c -O qcow2 windows2016.qcow2 Windows_server_2016_x64.qcow2
在OpenStack控制节点上使用glance命令导入到OpenStack镜像池中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # glance image-create --name "Windows_server_2016_x64_2021-12-16" --file /root/Windows_server_2016_x64.qcow2 --disk-format qcow2 --container-format bare --visibility public --progress [=============================>] 100% +------------------+--------------------------------------+ | Property | Value | +------------------+--------------------------------------+ | checksum | f6c1ed7911f488f2a0e7439b2e9d78ac | | container_format | bare | | created_at | 2021-12-17T03:57:12Z | | disk_format | qcow2 | | id | 38357c53-fbac-4848-b6f5-aa7f2fd567e9 | | min_disk | 0 | | min_ram | 0 | | name | Windows_server_2016_x64_2021-12-16 | | owner | 463600ca3a754a1a8eda96d2adf875ef | | protected | False | | size | 5935333376 | | status | active | | tags | [] | | updated_at | 2021-12-17T03:57:44Z | | virtual_size | None | | visibility | public | +------------------+--------------------------------------+
1 2 3 4 5 6 7 8 9 10 11 12 13 # glance image-list +--------------------------------------+------------------------------------+ | ID | Name | +--------------------------------------+------------------------------------+ | b03f6ada-594f-4e5d-bb3c-3dbdbced6fe8 | Centos7-2019-03-21 | | 64ad4b9a-e8cc-442e-870c-198ec01dd423 | Centos7-2020-03-06 | | c2b7c8a7-3ae6-4c11-9c48-50b28e3c00da | Centos7-2021-08-10 | | 55949724-bc48-409b-9d60-e6aa650fbd01 | Centos7-2021-11-26 | | b66ae266-297c-41c2-9d8d-c01de9fe5b11 | Centos7-2021-11-27 | | d2b5c6bc-f270-4391-80dd-fb653808c9e6 | cirros-qcow2 | | f7bd732d-8637-41ee-9b61-3c34deac1028 | Windows_server_2012_r2_x64 | | 38357c53-fbac-4848-b6f5-aa7f2fd567e9 | Windows_server_2016_x64_2021-12-16 | #有了 +--------------------------------------+------------------------------------+
下载镜像命令
1 # glance image-download --file windows_2016.qcow2 38357c53-fbac-4848-b6f5-aa7f2fd567e9
最后就可以开机器了 😎