KVM安装使用

KVM是开源的虚拟化技术,可通过模块的方式集成在Linux内核。

一、安装

  1. 查看是否支持硬件虚拟化(>0 代表支持)
1
egrep -c '(vmx|svm)' /proc/cpuinfos
  1. 安装

RHEL

1
yum install libvirt virt-install qemu-kvm -y

Debian

1
2
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
  1. 启动,查看状态
1
2
systemctl start libvirtd
systemctl status libvirtd
  1. 验证 kvm 模块是否启用
1
lsmod |grep -i kvm

二、虚拟机管理

虚拟机本质上是

  • 一个存放在 /etc/libvirt/qemu/<虚拟机名称>.xml 的配置文件
  • 一个或多个存放在/var/lib/libvirt/images/* 下的虚拟硬盘文件
  1. 查看运行状态的虚拟机
1
virsh list

查看所有状态的虚拟机

1
virsh list --all
  1. 创建虚拟机(纯命令行)
1
2
3
4
5
6
7
8
9
10
virt-install --connect qemu:///system \
-n win10 \
--memory 4096 \
--vcpus=2 \
--disk path=/var/lib/libvirt/images/win10.qcow2,size=70,format=qcow2,bus=sata \
--os-variant=win10 \
--network bridge=virbr0 \
--cdrom=/opt/Windows10-LTSC2021-ChnSimp-2021-x64.ISO \
--graphics vnc,listen=0.0.0.0,password=123456 \
--noautoconsole
  • --connect :连接到系统级的 KVM 守护进程(libvirtd)
  • -n :给虚拟机起个名字叫 win10
  • --memory :分配 4096 MB (即 4GB) 的内存给虚拟机
  • --vcpus :分配 2 个虚拟 CPU 核心
  • --disk:虚拟磁盘文件存放的路径、大小、格式、硬盘总线接口
  • --os-variant:指定操作系统,osinfo-query os 显示的 Short ID 一列
  • --network:网卡连接到名为 virbr0 的网桥。(这是默认的NAT网卡)
  • --cdrom:指定安装光盘镜像(ISO 文件)的路径
  • --graphics :开启 VNC 图形协议,监听所有端口,设置连接密码
  • --noautoconsole :不要自动尝试在当前终端弹出图形窗口
  1. 查看虚拟机的 VNC 端口
1
virsh vncdisplay <虚拟机名称>
1
virsh vncdisplay win10
1
2
[root@polish-PC ~]# virsh vncdisplay win10
:1
  • 代表 5900 +1 端口
  1. 查看支持安装的操作系统
1
osinfo-query os
  • --os-variant 参数通常应该指定 Short ID 这一列的值。
  1. 删除虚拟机(只删除配置文件,须手动删除硬盘文件)
1
virsh undefine <虚拟机名称>

删除虚拟机,同时删除磁盘文件,ISO镜像文件

1
virsh undefine <虚拟机名称> --remove-all-storage
  1. 启动虚拟机
1
virsh start <虚拟机名称>
  1. 关闭虚拟机
1
virsh shutdown <虚拟机名称>
  1. 强制关闭虚拟机(断电)
1
virsh destroy <虚拟机名称>
  1. (定义|创建|激活)虚拟机

提前准备好配置文件、硬盘。

1
virsh define /etc/libvirt/qemu/<虚拟机名称>.xml

配置文件需要修改的地方:

  • name 虚拟机名称

  • UUID 虚拟机的唯一标识

  • Disk,磁盘的格式、名称,位置(可删除位置 address,让virt 自动分配)

  • MAC,后半段(因为前三段代表厂商)

  • CPU数量、内存大小(可选,实际内存、当前内存尽可能保持一致)

  1. 设置虚拟机开启自启
1
virsh autostart <虚拟机名称>

会在 /etc/libvirt/qemu/autostart 下创建配置文件的软链接

  1. 禁用虚拟机开机自启
1
virsh autostart --disable <虚拟机名称>
  1. 查看开机自启的虚拟机
1
virsh list --all --autostart
  1. 重启虚拟机
1
virsh reboot <虚拟机名称>
  1. 重置虚拟机(断电一瞬间再通电,比重启更快)
1
virsh reset <虚拟机名称>
  1. 暂停虚拟机
1
virsh suspend <虚拟机名称>
  1. 恢复虚拟机
1
virsh resume <虚拟机名称>

三、虚拟机克隆

  1. 克隆虚拟机,小写 O
1
virt-clone -o <旧的虚拟机名称> --auto-clone
1
virt-clone -o node4 --auto-clone
  1. 克隆时指定新的虚拟机名称
1
virt-clone -o <旧的虚拟机名称> -n <新的虚拟机名称> --auto-clone
1
virt-clone -o node4 -n node5 --auto-clone
  1. 克隆时指定新虚拟机的磁盘文件路径
1
virt-clone -o <旧的虚拟机名称> -n <新的虚拟机名称> -f <新的磁盘文件路径>
1
virt-clone -o node4 -n node6 -f /var/lib/libvirt/images/node6.qcow2

<<<<<<< HEAD
查看虚拟机ip地址

1
virsh domifaddr centos7.9

卸载

1
vitsh undefine centos7.9

克隆

1
virt-clone -o vm1 -n vm1-1 --auto-clone

查看linux的模块,正常可以看到 kvm模块。没有的化,说明是软件模拟的,vmware可以 cpu、那里开启。

1
2
3
4
5
6
7
8
lsmod |grep kvm
=======
## 四、磁盘管理

1. 创建磁盘文件

```bash
qemu-img create -f 格式 磁盘文件路径 磁盘文件大小
1
qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.9-1.qcow2 2G
1
qemu-img create -f raw /var/lib/libvirt/images/centos7.9-1.raw 2G
  1. 查看磁盘文件中的系统分区
1
virt-df -h -d <虚拟机名称>
1
2
3
4
5
[root@polish-PC ~]# virt-df -h -d centos7.9
文件系统 大小 已用空间 可用空间 使用百分比%
centos7.9:/dev/sda1 1014M 118M 896M 12%
centos7.9:/dev/centos_centos7/root 17G 1.2G 16G 8%
[root@polish-PC ~]#
  1. 查看磁盘文件中的分区
1
virt-filesystems -d <虚拟机名称>
1
virt-filesystems -d centos7.9
  1. 将磁盘文件中的分区挂载到宿主机
1
guestmount -d <虚拟机名称> -m <磁盘文件中的分区> --rw <宿主机中的挂载点>
1
guestmount -d centos7.9 -m /dev/centos_centos7/root --rw /mnt/c7test
  1. 取消挂载
1
guestunmount <宿主机中的挂载点>
1
guestunmount /mnt/c7test
  1. 创建增量镜像,相当于链接克隆
1
qemu-img create -f <原始磁盘的格式> -b <原始磁盘文件> -F <目标磁盘文件的格式> <目标磁盘文件>
1
qemu-img create -f qcow2 -b /var/lib/libvirt/images/centos7.9.qcow2 -F qcow2 /var/lib/libvirt/images/node5.qcow2
  1. 查看磁盘文件的详细信息

如果是 qcow2 格式的文件,可查看到内部的快照。

1
qemu-img info <磁盘文件>
1
qemu-img info /var/lib/libvirt/images/node5.qcow2
  1. 磁盘文件格式转换,是大写的 o
1
qemu-img convert -O <目标磁盘文件的格式> <转换前的磁盘文件> <转换后的磁盘文件>
1
qemu-img convert -O qcow2 /var/lib/libvirt/images/centos7.9-1.raw /var/lib/libvirt/images/centos7.9-1.qcow2

五、快照管理

raw 格式的磁盘文件不支持快照。

  1. 创建快照
1
virsh snapshot-create-as <虚拟机名称> <快照名称>
1
virsh snapshot-create-as node4 node4.snap
  1. 查看快照
1
virsh snapshot-list <虚拟机名称>
1
virsh snapshot-list node4
  1. 查看快照的树状图
1
virsh snapshot-list <虚拟机名称> --tree
1
virsh snapshot-list node4 --tree
  1. 恢复快照
1
virsh snapshot-revert <虚拟机名称> 快照名
1
virsh snapshot-revert node4 node4-1.snap
  1. 删除快照
1
virsh snapshot-delete <虚拟机名称> <快照名称>
1
virsh snapshot-delete node4 node4-1.snap
  1. 快照的物理位置

快照镜像分为两种,

  • 内部快照,放在磁盘文件内部
  • 外部快照,在原磁盘位置生成增量镜像
1
virsh domblklist <虚拟机名称>
1
virsh domblklist node4

快照元数据(配置文件)

1
/var/lib/libvirt/qemu/snapshot/<虚拟机名称>/<快照名>.xml
  1. 生成快速删除所有的快照的命令(谨慎使用)
1
virsh snapshot-list <虚拟机名称> |awk 'NR>2 && $1{print "virsh snapshot-delete <虚拟机名称>",$1}'
1
virsh snapshot-list node4 |awk 'NR>2 && $1{print "virsh snapshot-delete node4",$1}'

先查看要执行的命令,没问题的传递给 bash ,开机时删除可能有问题。

六、网络管理

  1. 查看所有的KVM网络
1
virsh net-list --all

查看激活的网络

1
virsh net-list
  1. 停止网络
1
virsh net-destroy <网络名称>
1
virsh net-destoy dev-NAT8
  1. (删除|取消定义)网络

本质是删除配置文件,在内存中的网络还会存在。

1
virsh net-undefine <网络名称>
1
virsh net-undefine dev-NAT8
  1. 启动网络
1
virsh net-start <网络名称>
1
virsh net-start dev-NAT8

开机自启

1
virsh net-autostart <网络名称>
1
virsh net-autostart dev-NAT8
  1. (创建|定义)新的网络

创建新的配置文件(任意位置)

1
vim dev-NAT8.xml
1
2
3
4
5
6
7
8
9
10
<network>
<name>dev-NAT8</name>
<forward mode='nat'/>
<domain name='dev.local'/>
<ip address='10.10.10.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.10.100' end='10.10.10.200'/>
</dhcp>
</ip>
</network>

导入网络

1
virsh net-define dev-NAT8.xml
  1. 获取虚拟机的IP地址(需要虚拟机正在运行中)
1
virsh domifaddr <虚拟机名称>
1
virsh domifaddr node4