运行环境
- 系统环境:centos7.9
- qemu-kvm版本:1.5.3
镜像软件准备
- 系统版本:Windows server 2016 x64
- virtio驱动:virtio-win-0.1.208.iso
- CloudBase-init:CloudbaseInitSetup_0_9_9_x64.msi
关于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虚拟化技术需要硬件的支持,首先检查服务器(或其它)是否支持虚拟化。执行下面命令只要有输出代表都支持虚拟化
# egrep -o '(vmx|svm)' /proc/cpuinfo
vmx
vmx
安装kvm
[root@localhost iso]# yum -y install qemu-kvm libvirt libvirt-bin virt-install qemu virt-manager bridge-utils
[root@localhost iso]# systemctl start libvirtd
查看kvm是否安装成功
[root@localhost iso]# rpm -qi qemu-kvm
Name : qemu-kvm
Epoch : 10
Version : 1.5.3
Release : 175.el7_9.6
Architecture: x86_64
Install Date: Mon 09 Oct 2023 11:11:50 AM CST
Group : Development/Tools
Size : 6023263
License : GPLv2 and GPLv2+ and CC-BY
Signature : RSA/SHA256, Thu 19 May 2022 09:40:39 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : qemu-kvm-1.5.3-175.el7_9.6.src.rpm
Build Date : Thu 19 May 2022 09:28:45 PM CST
Build Host : x86-02.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.qemu.org/
Summary : QEMU is a machine emulator and virtualizer
Description :
qemu-kvm is an open source virtualizer that provides hardware
emulation for the KVM hypervisor. qemu-kvm acts as a virtual
machine monitor together with the KVM kernel modules, and emulates the
hardware for a full system such as a PC and its associated peripherals.
验证KVM内核是否加载成功
[root@localhost iso]# lsmod | grep kvm
kvm_intel 188740 0
kvm 637289 1 kvm_intel
irqbypass 13503 1 kvm #输出为此内容则为成功。
若KVM内核没加载执行下面命令加载:
解决方法 直接执行下面两条命令:
# modprobe kvm
# modprobe kvm-intel ( or kvm-amd )
确认libvirtld后台服务是否启动
[root@localhost iso]# systemctl status libvirtd.service
● libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-10-18 10:56:26 CST; 27min ago
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 1082 (libvirtd)
Tasks: 19 (limit: 32768)
CGroup: /system.slice/libvirtd.service
├─1082 /usr/sbin/libvirtd
├─1621 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
└─1622 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
Oct 18 10:56:27 localhost.localdomain dnsmasq[1607]: listening on virbr0(#3): 192.168.122.1
Oct 18 10:56:27 localhost.localdomain dnsmasq[1621]: started, version 2.76 cachesize 150
Oct 18 10:56:27 localhost.localdomain dnsmasq[1621]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ips... inotify
Oct 18 10:56:27 localhost.localdomain dnsmasq-dhcp[1621]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h
Oct 18 10:56:27 localhost.localdomain dnsmasq-dhcp[1621]: DHCP, sockets bound exclusively to interface virbr0
Oct 18 10:56:27 localhost.localdomain dnsmasq[1621]: reading /etc/resolv.conf
Oct 18 10:56:27 localhost.localdomain dnsmasq[1621]: using nameserver 192.168.91.2#53
Oct 18 10:56:27 localhost.localdomain dnsmasq[1621]: read /etc/hosts - 2 addresses
Oct 18 10:56:27 localhost.localdomain dnsmasq[1621]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
Oct 18 10:56:27 localhost.localdomain dnsmasq-dhcp[1621]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Hint: Some lines were ellipsized, use -l to show in full.
使用kvm制作镜像
创建虚拟机
- 创建存储系统镜像文件的目录,将Windows系统镜像及virtio镜像放到此目录
[root@localhost iso]# mkdir /data/iso
[root@localhost iso]# ll
total 6575084
-rw-r--r-- 1 qemu qemu 6176450560 Oct 9 11:28 cn_windows_server_2016_x64_dvd_9718765.iso
-rw-r--r-- 1 qemu qemu 556431360 Dec 14 2021 virtio-win-0.1.208.iso
- 创建虚拟机磁盘文件存放目录
- 使用qemu-img命令创建一个qcow2格式的虚拟机磁盘文件
[root@localhost iso]# mkdir /data/kvm
[root@localhost iso]# qemu-img create -f qcow2 /data/kvm/windows2016.qcow2 15G
Formatting '/data/kvm/windows2016.qcow2', fmt=qcow2 size=16106127360 encryption=off cluster_size=65536 lazy_refcounts=off
[root@localhost iso]#
ll /data/kvm/
total 5740232
-rw-r--r-- 1 root root 197120 Oct 18 11:32 windows2016.qcow2
[root@localhost iso]#
- 使用virt-install命令创建虚拟机
[root@localhost iso]# virt-install --name win_server_2016 --ram 4096 --vcpus 4 --network network=default,model=virtio --disk path=/data/kvm/windows2016.qcow2,format=qcow2,device=disk,bus=virtio --cdrom /data/iso/cn_windows_server_2016_x64_dvd_9718765.iso --disk path=/data/iso/virtio-win-0.1.208.iso,device=cdrom --graphics vnc,listen=0.0.0.0 --os-type windows --os-variant win2k16
WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
WARNING No console to launch for the guest, defaulting to --wait -1
Starting install...
Domain installation still in progress. Waiting for installation to complete.
创建的虚拟机启动不了,磁盘启动顺序出现问题,加载顺序错误,导致加载不了,原因是是虚拟机的.xml文件中系统镜像iso标记成了hdb,而驱动文件的iso标记成了hda
[root@localhost iso]# virsh list --all
Id Name State
----------------------------------------------------
2 win_server_2016 running
[root@localhost iso]# virsh destroy win_server_2016
Domain win_server_2016 destroyed #停止虚拟机
[root@localhost iso]# virsh list --all
Id Name State
----------------------------------------------------
- win_server_2016 shut off
[root@localhost iso]# virsh edit win_server_2016
#修改启动顺序添加<boot dev='cdrom'/>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='cdrom'/>
<boot dev='hd'/>
</os>
#..................................
#修改Windows镜像和virtio镜像顺序,镜像iso改成hda,而驱动文件的iso改成hdb
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/data/iso/virtio-win-0.1.208.iso'/>
<target dev='hdb' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/data/iso/cn_windows_server_2016_x64_dvd_9718765.iso'/>
<target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
[root@localhost iso]# virsh start win_server_2016
Domain win_server_2016 started
[root@localhost iso]# virsh list --all
Id Name State
----------------------------------------------------
3 win_server_2016 running
[root@localhost iso]#
调出kvm图形化界面
使用 virt-manager 、virt-viewer 或者VNC客户端(realVNC)连接VM启动 Windows 安装
[root@localhost iso]# virt-manager
按照顺序安装windows系统
加载VirtIO Driver,安装磁盘驱动
选择系统对应版本驱动,然后继续安装。一旦安装完成,VM 将重新启动。
出现提示时设置管理员定义密码
找到 “设备管理器-->以太网设备” 更新网卡驱动(需要选择virtio驱动盘)
安装cloudbase-init
允许 Cloudbase-Init 在实例期间运行脚本 启动时,将 PowerShell 执行策略设置为无限制:
C:\powershell C:\Set-ExecutionPolicy Unrestricted
下载并安装Cloudbase-Init ,在配置选项窗口中, 更改以下设置:
- 用户名:Administrator
- 用于日志记录的串行端口:COM1
- Use metadata password 选项取消勾选
安装完成后,在完成 Cloudbase - 初始化安装向导窗口中, 选中运行系统准备复选框,然后单击完成。
在Cloudbase-Init安装路径下的配置文件“C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\cloudbase-init.conf”中执行以下操作:
1、在配置文件最后一行,增加配置项“netbios_host_name_compatibility=false”,使Windows系统的hostname长度支持到63个字符。
2、选择密码注入方式首次登录时,系统默认强制用户修改登录密码,若用户根据个人意愿,不需要修改首次登录使用的密码时,可关闭此功能。
操作方法:增加配置项“first_logon_behaviour=no”。(实际过程还是需要修改该密码)
在cloudbase-init.conf删除以下三行文件,镜像启动后会直接进入以下界面:
username=Admin
groups=Administrators
inject_user_password=true
OpenStack导入镜像
新创建的镜像磁盘文件比较大需要使用qemu-img命令压缩文件,压缩之后大概6G左右,然后传到OpenStac控制节点(在此操作前可以将镜像启动修改密码再压缩作为初始镜像,避免openstack中作为基础镜像创建虚拟机后还需要再次修改密码)
[root@localhost kvm]# qemu-img convert -c -O qcow2 windows2016.qcow2 Windows_server_2016_x64.qcow2
[root@localhost kvm]# ll -h
total 19G
-rw-r--r-- 1 root root 15G Oct 20 15:32 windows2016.qcow2
-rw-r--r-- 1 root root 5.8G Oct 20 15:41 Windows_server_2016_x64.qcow2
在OpenStack控制节点上使用glance命令导入到OpenStack镜像池中
[root@cn2-test-opctr1 ~]# glance image-create --name "windows_server_2016" --file Windows_server_2016_x64.qcow2 --disk-format qcow2 --container-format bare --visibility public --progress
[=============================>] 100%
+------------------+--------------------------------------+
| Property | Value |
+------------------+--------------------------------------+
| checksum | be58055d8b8a7c60c13599cb713d0d2e |
| container_format | bare |
| created_at | 2023-10-20T08:08:37Z |
| disk_format | qcow2 |
| id | 64779f9b-b4cf-447a-a164-6db5656dae3e |
| min_disk | 0 |
| min_ram | 0 |
| name | windows_server_2016 |
| owner | 316945b648aa4b77a155f4ff9ea936e5 |
| protected | False |
| size | 6503596032 |
| status | active |
| tags | [] |
| updated_at | 2023-10-20T08:10:13Z |
| virtual_size | None |
| visibility | public |
+------------------+--------------------------------------+
查看镜像
[root@cn2-test-opctr1 ~]# glance image-list
+--------------------------------------+------------------------+
| ID | Name |
+--------------------------------------+------------------------+
| 64779f9b-b4cf-447a-a164-6db5656dae3e | windows_server_2016_v5 |
+--------------------------------------+------------------------+
使用上传的镜像就可以创建Windows虚拟机了
VirtIO驱动官网下载地址:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/
openstack 官方文档:https://docs.openstack.org/image-guide/windows-image.html