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

实验环境

角色 配置 IP 地址
KVM 宿主机 CentOS 7.9, 10G 磁盘, 6 vCPU 192.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-kvm KVM 主包
libvirt API 接口
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        活动    是        是

总结

本文参考教程:哔哩哔哩

要点总结:

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