创建KVM虚拟机

使用qemu-kvm在CentOS8上通过GUI创建虚拟机。

1、安装系统组件

首先我们需要安装epel源和相应的虚拟机工具

1
2
3
4
5
6
7
8
9
10
11
12
13
yum install epel-release -y
yum install qemu-kvm qemu-img libvirt virt-manager virt-top.x86_64 virtio-win.noarch virt-viewer.x86_64 virt-install.noarch -y

virt-install
libvirt #安装libvirt会将libvirt-client作为依赖进行安装,libvirt-client即libvirt的客户端,最重要的功能之一就是就在宿主机关机时可以通知虚拟机也关机,使虚拟机系统正常关机,而不是被强制关机,造成数据丢失
ipxe-roms-qemu #虚拟机iPXE的启动固件,支持虚拟机从网络启动
qemu-kvm #KVM在用户空间运行的程序
virt-manager #基于 Libvirt 的图像化虚拟机管理软件
libvirt #用于管理虚拟机,它提供了一套虚拟机操作API
virt-viewer #显示虚拟机的控制台console
virt-top #类似于top命令,查看虚拟机的资源使用情况
virt-what #在虚拟机内部执行,查看虚拟机运行的虚拟化平台
qemu-img #用于操作虚拟机硬盘镜像的创建、查看和格式转化

一些主要组件的功能介绍如下:

  • virt-install

    Description : Package includes several command line utilities, including virt-install

             : (build and install new VMs) and virt-clone (clone an existing virtual
             : machine).
  • virt-who

    Description : Agent that collects information about virtual guests present in the system and

             : report them to the subscription manager.
  • virt-top

    Description : virt-top is a ‘top(1)’-like utility for showing stats of virtualized

             : domains.  Many keys and command line options are the same as for
             : ordinary 'top'.
             : 
             : It uses libvirt so it is capable of showing stats across a variety of
             : different virtualization systems.
  • virt-viewer

    Description : Virtual Machine Viewer provides a graphical console client for connecting

             : to virtual machines. It uses the GTK-VNC or SPICE-GTK widgets to provide
             : the display, and libvirt for looking up VNC/SPICE server details.
  • virt-manager

    Description : Virtual Machine Manager provides a graphical tool for administering virtual

             : machines for KVM, Xen, and LXC. Start, stop, add or remove virtual devices,
             : connect to a graphical or serial console, and see resource usage statistics
             : for existing VMs on local or remote machines. Uses libvirt as the backend
             : management API.
  • libvirt

    Description : Libvirt is a C toolkit to interact with the virtualization capabilities

             : of recent versions of Linux (and other OSes). The main package includes
             : the libvirtd server exporting the virtualization support.
  • qemu-kvm

    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.

2、创建虚拟机

2.1 配置虚拟机存储目录

这里我们直接开启宿主机Linux系统上面的GUI模式并且使用xrdp远程到桌面,然后使用virt-manager来进行GUI模式的创建虚拟机。

这里需要注意的是因为我们使用的是ISO镜像文件来进行虚拟机系统的安装,因此必须需要一个GUI界面来进行最开始的系统安装,等待系统安装完成之后,我们可以直接使用命令行操作来克隆虚拟机,就不用每次都打开GUI模式安装系统这么麻烦了。

接着我们创建一个目录专门用来存放虚拟机相关的镜像和文件,同时我们还需要注意权限的问题:

1
2
sudo mkdir -p /kvm/iso
sudo chmod tinychen:tinychen /kvm -R

接着我们把相应的系统安装镜像复制进去(对应的系统安装镜像文件均可直接在对应的官网下载),然后打开Virtual Machine Manager(以下简称VMM)来创建虚拟机

首先我们在Edit→Preferences里面开启XML文件编辑功能,XML模式可以最大程度的控制虚拟机的所有配置,一些特殊的配置或者组件操作无法通过VMM的GUI界面完成的我们可以直接编辑对应的XML文件块来实现。

2.2 创建虚拟机

直接点击加号或者上面的File→New Virtual Machine然后选择使用本地媒体创建虚拟机(这里我们使用刚刚复制进去的ISO镜像文件)

接着我们可以看到有四种创建虚拟机的方式:

  • 从本地的媒体资源安装(iso文件或者CD光盘)
  • 通过网络协议获取安装的镜像文件然后进行安装
  • 通过PXE进行安装
  • 导入已有的虚拟机硬盘镜像文件

我们选择第一种方式进行新建虚拟机操作。

由于是第一次创建虚拟机,我们需要先在VMM中添加一个池(pool),把先前创建的存放iso镜像文件的目录作为一个池添加到VMM中。

添加完成之后我们就可以看到里面的镜像文件,这里我们选择CentOS7的版本进行安装。

选择镜像之后VMM会自动检测镜像文件内包含的操作系统。

接下来是设定CPU和内存,注意这里的内存单位是MB,而CPU的单位是个,即并不是我们常说的CPU核心数量或者是超线程的线程数量,而是虚拟设定的多少个CPU,这里选择4即为4个CPU而不是一个4核CPU,这个选项我们后面需要再进行修改

接下来便是进行虚拟机的硬盘参数设置,我们这里选择手动创建一个硬盘。

和之前一样我们再创建一个池专门用来存放虚拟机的系统镜像文件。

接着在对应的池中新建一个qcow2磁盘文件。

这里我们可以看到硬盘的格式主要有raw和qcow2两种。qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:

  • 更小的空间占用,即使文件系统不支持空洞(holes);
  • 支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
  • 支持快照(snapshot),镜像文件能够包含多个快照的历史;
  • 可选择基于 zlib 的压缩方式
  • 可以选择 AES 加密

qcow2最大的特点就是可以节省硬盘空间,只有在虚拟机实际占用了磁盘空间时,其文件才会增长。比如这里我们创建了一个40G的硬盘镜像文件,但是实际占用并没有40G,只有在虚拟机实际使用了硬盘空间之后,qcow2格式的镜像文件才会增大。

最后需要设置的就是虚拟机的网卡,这里我们要勾选Customize configuration before install,在系统开始安装之前进行一些参数的设置。

2.3 配置虚拟机其他参数

首先我们看到Overview中的ChipsetFirmware两个参数,它们分别相当于物理机电脑主板的芯片组和固件模式(BIOS或UEFI),如果有新版本的需求(如虚拟机KVM直通GPU)可以选择UEFI(OVMF)来进行启动,需要注意VMM中的快照(snapshot)功能不支持UEFI(OVMF)固件的虚拟机,因此这里我们选择默认的Q35和BIOS即可。

接下来我们需要对前面设定的CPU参数进行更改。这里我们编辑对应的XML文件将CPU模式修改为host-passthrough以便将CPU的全部特性传递到虚拟机中,同时修改CPU个数为1,核心数为4,每个核心的线程数为1。

1
2
3
<cpu mode="host-passthrough">
<topology sockets="1" cores="4" threads="1"/>
</cpu>

设定安装系统的ISO为只读,保证ISO文件不会被修改,同时设置数据总线方式为SATA保证最好的兼容性。

配置两个网卡,分别为桥接宿主机的网卡和NAT模式,其中桥接网卡使用e1000e型号保证最好的兼容性,NAT模式的网卡使用VirtIO型号可以达到最大100G的传输速度。

其他还会默认添加一些常用的组件,我们根据自己的需求进行修改,这里我只保留了常用的USB重定向设备,声卡、网卡、串行总线等基本设备,如果不清楚具体需求,建议保留。

最后整个完整的xml文件如下:

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
<domain type="kvm">
<name>centos7_demo</name>
<uuid>2e80a698-c4f9-464b-bb3e-28c4987cbe9a</uuid>
<metadata>
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
<libosinfo:os id="http://centos.org/centos/7.0"/>
</libosinfo:libosinfo>
</metadata>
<memory>8388608</memory>
<currentMemory>8388608</currentMemory>
<vcpu current="4">4</vcpu>
<os>
<type arch="x86_64" machine="q35">hvm</type>
<boot dev="hd"/>
</os>
<features>
<acpi/>
<apic/>
<vmport state="off"/>
</features>
<cpu mode="host-passthrough">
<topology sockets="1" cores="4" threads="1"/>
</cpu>
<clock offset="utc">
<timer name="rtc" tickpolicy="catchup"/>
<timer name="pit" tickpolicy="delay"/>
<timer name="hpet" present="no"/>
</clock>
<pm>
<suspend-to-mem enabled="no"/>
<suspend-to-disk enabled="no"/>
</pm>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/kvm/vm/centos7_demo.qcow2"/>
<target dev="vda" bus="virtio"/>
</disk>
<disk type="file" device="cdrom">
<driver name="qemu" type="raw"/>
<source file="/kvm/iso/centos7.7.iso"/>
<target dev="sda" bus="sata"/>
<readonly/>
</disk>
<interface type="network">
<source network="default"/>
<mac address="52:54:00:83:cc:6d"/>
<model type="virtio"/>
</interface>
<console type="pty"/>
<channel type="unix">
<source mode="bind"/>
<target type="virtio" name="org.qemu.guest_agent.0"/>
</channel>
<channel type="spicevmc">
<target type="virtio" name="com.redhat.spice.0"/>
</channel>
<input type="tablet" bus="usb"/>
<graphics type="spice" port="-1" tlsPort="-1" autoport="yes">
<image compression="off"/>
</graphics>
<video>
<model type="qxl"/>
</video>
<memballoon model="virtio"/>
<rng model="virtio">
<backend model="random">/dev/urandom</backend>
</rng>
<interface type="direct">
<source dev="enp6s0" mode="bridge"/>
<mac address="52:54:00:31:ad:1d"/>
<model type="e1000e"/>
</interface>
</devices>
</domain>

2.4开始安装

接下来的安装就和正常的物理机安装操作系统一样,这里我们就不再赘述了,由于是CentOS的虚拟机,为了节约系统资源,我选择了最小化安装(Minimal Install)、关闭了KDUMP功能,并且使用LVM来设定分区以便后期扩容

最后可以通过virsh命令来查看虚拟机的状态