Linux KVM 基础安装与虚拟机管理

实验环境

角色配置IP 地址
KVM 宿主机CentOS 7.9, 10G 磁盘, 6 vCPU192.168.5.160/24
[root@kvm ~]# uname -a
Linux kvm.example.com 3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

基础知识网上一堆,自己搜一下就有了。KVM(全称:基于内核的虚拟机)。本文单纯记录自己的实验操作,作为备忘录使用。


一、KVM 软件安装

1.1 检查 CPU 是否支持虚拟化

[root@kvm ~]# cat /proc/cpuinfo | grep -E 'vmx|svm'

如果有输出,说明 CPU 支持虚拟化。Intel 显示 vmx,AMD 显示 svm。

1.2 安装软件包

[root@kvm ~]# yum install qemu-kvm qemu-img virt-manager libvirt

软件包说明:

软件包说明
qemu-kvmKVM 主包
libvirtAPI 接口
virt-manager图形管理程序

1.3 启动服务

[root@kvm ~]# systemctl start libvirtd
[root@kvm ~]# systemctl status libvirtd

1.4 加载 KVM 模块

前提条件: 需要开启 CPU 虚拟化。

  • 物理机:在 BIOS 中开启 VT,或找到 Virtual 选项开启
  • 虚拟机:虚拟化引擎全部勾选

二、KVM 安装虚拟机

2.1 使用图形化管理工具

[root@kvm ~]# virt-manager

需要安装桌面环境,也可以使用 VNC 远程连接。

2.2 新建虚拟机

步骤与 VMware 类似:

  1. 选择镜像
  2. 选择存储卷
  3. 选择内存和 CPU
  4. 完成安装

三、虚拟机组成

3.1 默认配置文件目录

[root@kvm ~]# cd /etc/libvirt/qemu/
[root@kvm qemu]# ls
networks  vm1.xml

3.2 默认存储目录

[root@kvm qemu]# cd /var/lib/libvirt/images/

由于我的硬件存储只有 20G,后面新加了一块 100G 磁盘,定义了 /kvm-data 存储池。


四、利用配置文件创建虚拟机

4.1 拷贝虚拟机存储介质

[root@kvm vmfs]# cp vm1.qcow2 vm2.qcow2
[root@kvm vmfs]# pwd
/kvm-data/vmfs

4.2 修改配置文件

拷贝并修改配置文件,主要修改以下内容:

  • 主机名
  • 内存和 CPU(按需修改)
  • UUID(更改一位即可)
  • MAC 地址(只可修改后三段)
  • 存储路径
[root@kvm qemu]# cp vm1.xml vm2.xml
[root@kvm qemu]# vim vm2.xml

关键配置项:

<domain type='kvm'>
  <name>vm2</name>                                    <!-- 虚拟机名称 -->
  <uuid>ca25689c-50d5-4a58-86c1-bd7b39928406</uuid>  <!-- UUID -->
  <memory unit='KiB'>2097152</memory>                 <!-- 内存 -->
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>                   <!-- CPU -->
  
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm-data/vmfs/vm2.qcow2'/>       <!-- 存储目录 -->
      <target dev='vda' bus='virtio'/>
    </disk>
    
    <interface type='network'>
      <mac address='52:54:00:10:92:d8'/>              <!-- MAC 地址 -->
      <source network='default'/>
      <model type='virtio'/>
    </interface>
  </devices>
</domain>

4.3 定义虚拟机并重启服务

[root@kvm ~]# virsh define /etc/libvirt/qemu/vm2.xml
定义域 vm2(从 /etc/libvirt/qemu/vm2.xml)

[root@kvm ~]# systemctl restart libvirtd

这样 vm2 和 vm1 就是完全相同的虚拟机了。


五、利用配置文件添加磁盘

5.1 编辑配置文件

注意: 主机必须为关机状态才能添加磁盘。

在 <devices> 下添加新的 <disk> 配置段:

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>                    <!-- 磁盘类型 -->
  <source file='/kvm-data/vmfs/vm2-1.qcow2'/>           <!-- 磁盘路径 -->
  <target dev='vdb' bus='virtio'/>                      <!-- 设备名 vdb -->
  <address type='pci' domain='0x0000' bus='0x10' slot='0x17' function='0x0'/>
</disk>

5.2 创建空磁盘卷

[root@kvm vmfs]# qemu-img create -f qcow2 /kvm-data/vmfs/vm2-1.qcow2 2G
Formatting '/kvm-data/vmfs/vm2-1.qcow2', fmt=qcow2 size=2147483648 encryption=off cluster_size=65536 lazy_refcounts=off

5.3 重新定义虚拟机

[root@kvm vmfs]# virsh define /etc/libvirt/qemu/vm2.xml
定义域 vm2(从 /etc/libvirt/qemu/vm2.xml)

5.4 启动虚拟机验证

[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   10G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0    9G  0 part
  ├─centos-root 253:0    0    8G  0 lvm  /
  └─centos-swap 253:1    0    1G  0 lvm  [SWAP]
vdb             252:16   0    2G  0 disk

六、创建存储池

默认存储池:/var/lib/libvirt/images

6.1 挂载裸磁盘

[root@kvm ~]# mount /dev/sdb1 /kvm-data/
[root@kvm ~]# df -Th
文件系统                类型    容量  已用  可用  已用% 挂载点
devtmpfs                devtmpfs 4.8G     0  4.8G    0% /dev
tmpfs                   tmpfs   4.8G     0  4.8G    0% /dev/shm
tmpfs                   tmpfs   4.8G   13M  4.8G    1% /run
tmpfs                   tmpfs   4.8G     0  4.8G    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs      17G  9.7G  7.4G   57% /
/dev/sda1               xfs    1014M  238M  777M   24% /boot
tmpfs                   tmpfs   982M   36K  982M    1% /run/user/0
/dev/sr0                iso9660 4.4G  4.4G     0  100% /run/media/root/CentOS 7 x86_64
/dev/sdb1               ext4    69G   53M   66G    1% /kvm-data

6.2 定义存储池

[root@kvm ~]# virsh pool-define-as vmdisk --type dir --target /kvm-data/vmfs
定义池 vmdisk

6.3 构建存储池

[root@kvm ~]# virsh pool-build vmdisk
构建池 vmdisk

6.4 启动并设置开机自启

[root@kvm ~]# virsh pool-list --all
 名称     状态     自动开始
---------------------------
 default  活动     是
 vmdisk   不活跃   否

[root@kvm ~]# virsh pool-start vmdisk
池 vmdisk 已启动

[root@kvm ~]# virsh pool-autostart vmdisk
池 vmdisk 标记为自动启动

6.5 创建存储卷

[root@kvm ~]# virsh vol-create-as vmdisk vm1.qcow2 10G --format qcow2
创建卷 vm1.qcow2

6.6 存储池删除命令

# 删除存储卷
virsh vol-delete --pool 池名 卷名

# 取消激活存储池
virsh pool-destroy 池名

# 删除存储池目录
virsh pool-delete 池名

# 取消定义存储池
virsh pool-undefine 池名

七、磁盘镜像管理

7.1 磁盘镜像格式

格式特点
raw性能强,即刻分配空间,不支持快照
qcow性能不如 raw
qcow2性能不如 raw,但支持快照,按需分配空间

7.2 创建磁盘文件

[root@kvm vmfs]# qemu-img create -f qcow2 123.qcow2 1G

参数说明:

  • -f:文件格式(raw / qcow2)

7.3 镜像格式转换

示例:raw 转换为 vmdk

qemu-img convert -f raw -O vmdk 源文件 目标文件
[root@rysnc-server 下载]# qemu-img convert -f raw -O vmdk \
  bleach-mini-20230328-openwrt-x86-64-generic-squashfs-combined-efi.img \
  bleach-mini-20230328-openwrt-x86-64-generic-squashfs-combined-efi.vmdk

[root@rysnc-server 下载]# ls
bleach-mini-20230328-openwrt-x86-64-generic-squashfs-combined-efi.img
bleach-mini-20230328-openwrt-x86-64-generic-squashfs-combined-efi.vmdk

八、guestmount 磁盘挂载

如果 KVM 虚拟机崩溃,可以使用 libguestfs-tools 将系统盘挂载到本地,取出重要数据。

8.1 安装软件包

[root@kvm ~]# yum install libguestfs-tools

8.2 查看磁盘分区详情

[root@kvm ~]# virt-df -h -d vm1
文件系统           大小  已用空间  可用空间  使用百分比%
vm1:/dev/sda1     1014M     151M     863M         15%
vm1:/dev/centos/root  8.0G     4.7G     3.3G         59%

8.3 挂载磁盘镜像

# 查看可用分区
[root@kvm ~]# virt-filesystems -d vm1
/dev/sda1
/dev/centos/root

# 挂载系统分区
[root@kvm ~]# guestmount -d vm1 -m /dev/centos/root --rw /mnt/ -o nonempty

# 进入挂载目录
[root@kvm ~]# cd /mnt/
[root@kvm mnt]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

8.4 卸载

[root@kvm ~]# guestunmount /mnt/

如果报错,使用 fusermount -zu /mnt 解决。注意不能在挂载目录内执行卸载操作。


九、KVM 基础命令

9.1 虚拟机管理

# 查看运行中的虚拟机
[root@kvm ~]# virsh list
 Id    名称    状态
------------------------
 9     vm1     running
 13    vm2     running

# 查看所有虚拟机(包括关机的)
[root@kvm ~]# virsh list --all

9.2 常用操作命令

命令说明
virsh shutdown vm1关闭虚拟机
virsh reboot vm1重启虚拟机
virsh suspend vm1挂起虚拟机
virsh resume vm1恢复虚拟机
virsh reset vm1重置虚拟机
virsh undefine vm1删除虚拟机(仅删除配置文件)
virsh autostart vm1设置开机自启
virsh autostart --disable vm1关闭开机自启

注意:virsh undefine 只删除配置文件,磁盘文件需手动删除。开机状态下无法删除。


十、KVM 虚拟机克隆

10.1 安装软件包

yum install virt-clone virt-viewer

10.2 克隆虚拟机

# 自动克隆(自动生成磁盘文件名)
[root@kvm ~]# virt-clone -o vm1 -n vm3 --auto-clone

# 指定磁盘文件路径
[root@kvm ~]# virt-clone -o vm1 -n vm3 --auto-clone -f /kvm-data/vmfs/vm3.qcow2

参数说明:

  • -o:源虚拟机
  • -n:新虚拟机名称
  • -f:指定磁盘文件路径

10.3 验证克隆结果

[root@kvm qemu]# diff vm1.xml vm3.xml
4c4
< virsh edit vm1
---
> virsh edit vm3
9,10c9,10
< <name>vm1</name>
< <uuid>ca25689c-50d5-4a38-86c1-bd7b39928406</uuid>
---
> <name>vm3</name>
> <uuid>9976446b-f72d-4f7e-8ce6-e0a5c0ac33a9</uuid>
42c42
< <source file='/kvm-data/vmfs/vm1.qcow2'/>
---
> <source file='/kvm-data/vmfs/vm3.qcow2'/>
75c75
< <mac address='52:54:00:10:90:d8'/>
---
> <mac address='52:54:00:db:74:47'/>

# 磁盘大小一致
[root@kvm vmfs]# du -h vm1.qcow2 vm3.qcow2
5.1G  vm1.qcow2
5.1G  vm3.qcow2

十一、增量镜像

基于一个基础镜像创建增量镜像,虚拟机操作变化存储在增量镜像中,节约磁盘空间,可快速新建虚拟机。

11.1 创建增量镜像

[root@kvm vmfs]# qemu-img create -b vm1.qcow2 -f qcow2 vm4.img
Formatting 'vm4.img', fmt=qcow2 size=10737418240 backing_file='vm1.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off

[root@kvm vmfs]# qemu-img info vm4.img
image: vm4.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: vm1.qcow2
Format specific information:
    compat: 1.1
    lazy refcounts: false

11.2 创建配置文件

[root@kvm vmfs]# cd /etc/libvirt/qemu/
[root@kvm qemu]# cp vm1.xml vm4.xml

修改 vm4.xml 中的:

  • 虚拟机名称
  • UUID
  • 磁盘路径(指向 vm4.img)
  • MAC 地址

11.3 磁盘空间对比

[root@kvm vmfs]# du -h vm1.qcow2 vm4.img
5.3G  vm1.qcow2
14M   vm4.img

增量镜像仅 14M,大大节约空间。


十二、KVM 虚拟机快照

12.1 创建快照

[root@kvm vmfs]# virsh snapshot-create-as vm3 vm3.snap
已生成域快照 vm3.snap

[root@kvm vmfs]# virsh snapshot-list vm3
 名称       生成时间                  状态
------------------------------------------------------------
 vm3.snap   2023-01-05 15:47:47 +0800  shutoff

12.2 删除快照

[root@kvm vmfs]# virsh snapshot-delete --snapshotname vm3.snap vm3
已删除域快照 vm3.snap

[root@kvm vmfs]# virsh snapshot-list vm3
 名称  生成时间  状态
------------------------------------------------------------

十三、KVM 网络

13.1 网络模式概述

模式说明类比 VMware
NAT默认模式,支持主机和虚拟机互访,可访问外网VMnet8
Isolated仅主机模式,主机和虚拟机互访,不能访问外网VMnet1
Bridge桥接模式,虚拟机直接连接物理网络Bridge

网络接口说明:

  • virbr0:虚拟交换机管理接口
  • virbr0-nic:虚拟交换机管理网卡

网桥管理命令:

# 查看网桥信息
brctl show

# 从交换机删除网卡
brctl delif virbr0 vnet0

# 添加网卡到交换机
brctl addif virbr0 vnet0

13.2 配置桥接网络

创建桥接网卡配置文件:

[root@kvm network-scripts]# cat ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT="yes"
BOOTPROTO=static
IPADDR=192.168.5.160
GATEWAY=192.168.5.2
NETMASK=255.255.255.0
DNS1=192.168.5.2
DNS2=8.8.8.8

修改物理网卡配置:

[root@kvm network-scripts]# cat ifcfg-ens33
DEVICE="ens33"
ONBOOT="yes"
BRIDGE=br0

重启服务:

systemctl restart libvirtd
systemctl restart network

13.3 配置 NAT 网络

复制并修改配置文件:

[root@kvm networks]# cd /etc/libvirt/qemu/networks/
[root@kvm networks]# cp default.xml nat1.xml
[root@kvm networks]# vim nat1.xml
<network>
  <name>nat1</name>                                          <!-- 名字修改 -->
  <uuid>6fb33a58-0185-4a23-928c-8a831a952890</uuid>         <!-- UUID 修改 -->
  <forward mode='nat'/>
  <bridge name='virbr1' stp='on' delay='0'/>                <!-- 接口修改 -->
  <mac address='52:54:00:53:b9:4e'/>                         <!-- MAC 修改 -->
  <ip address='192.168.125.1' netmask='255.255.255.0'>      <!-- IP 地址修改 -->
    <dhcp>
      <range start='192.168.125.2' end='192.168.125.254'/>  <!-- DHCP 地址池 -->
    </dhcp>
  </ip>
</network>

重启服务:

systemctl restart libvirtd
systemctl restart network

13.4 配置 Isolated 网络(仅主机)

复制并修改配置文件:

[root@kvm networks]# cp default.xml isolated2.xml
[root@kvm networks]# vim isolated2.xml
<network>
  <name>isolated2</name>
  <uuid>6fb33a58-0185-4a23-918c-8a831a953890</uuid>
  <bridge name='virbr2' stp='on' delay='0'/>
  <mac address='52:54:00:53:b9:9e'/>
  <ip address='192.168.126.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.126.2' end='192.168.126.254'/>
    </dhcp>
  </ip>
</network>

启动网络:

[root@kvm networks]# virsh net-start isolated2
网络 isolated2 已开始

[root@kvm networks]# virsh net-autostart isolated2
网络 isolated2 标记为自动启动

[root@kvm networks]# virsh net-list
 名称        状态    自动开始  持久
-------------------------------------------
 default     活动    是        是
 isolated2   活动    是        是
 nat1        活动    是        是

13.5 开机状态主机如何使用virsh 获取IP地址

[root@kvm networks]# virsh domifaddr  vm1--source agent
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 lo         00:00:00:00:00:00    ipv4         127.0.0.1/8
 -          -                    ipv6         ::1/128
 eth0       52:54:00:66:34:bc    ipv4         10.126.xxx.52/24
 -          -                    ipv6         fe80::5054:ff:fe66:34bc/64

[root@kvm networks]# virsh qemu-agent-command vm1 \
> '{"execute":"guest-network-get-interfaces"}'
{"return":[{"name":"lo","ip-addresses":[{"ip-address-type":"ipv4","ip-address":"127.0.0.1","prefix":8},{"ip-address-type":"ipv6","ip-address":"::1","prefix":128}],"statistics":{"tx-packets":4865,"tx-errs":0,"rx-bytes":1140006,"rx-dropped":0,"rx-packets":4865,"rx-errs":0,"tx-bytes":1140006,"tx-dropped":0},"hardware-address":"00:00:00:00:00:00"},{"name":"eth0","ip-addresses":[{"ip-address-type":"ipv4","ip-address":"10.126.xxx.21","prefix":24},{"ip-address-type":"ipv6","ip-address":"fe80::8235:8b1a:eae2:3846","prefix":64}],"statistics":{"tx-packets":31887350003,"tx-errs":0,"rx-bytes":16152451491898,"rx-dropped":33409673,"rx-packets":32632065312,"rx-errs":0,"tx-bytes":4350578862934,"tx-dropped":0},"hardware-address":"52:54:00:7a:e9:ef"}]}

总结

本文参考教程:哔哩哔哩

要点总结:

  1. 配置文件目录和存储镜像目录都可以做持久化,使用 NFS 或其他存储手段
  2. 大多数操作可以通过图形界面完成,没有桌面环境可结合 VNC
  3. qcow2 支持快照,raw 性能更强但不支持快照;镜像格式可相互转换
  4. 以上操作均为个人实验记录和备忘录
  5. 涉及知识点较多,建议拆分细嚼慢咽
文章作者: emporer
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Emporer-Linux!
linux kvm
喜欢就支持一下吧