linux-kvm
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 类似:
- 选择镜像
- 选择存储卷
- 选择内存和 CPU
- 完成安装
三、虚拟机组成
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 活动 是 是
总结
本文参考教程:哔哩哔哩
要点总结:
- 配置文件目录和存储镜像目录都可以做持久化,使用 NFS 或其他存储手段
- 大多数操作可以通过图形界面完成,没有桌面环境可结合 VNC
- qcow2 支持快照,raw 性能更强但不支持快照;镜像格式可相互转换
- 以上操作均为个人实验记录和备忘录
- 涉及知识点较多,建议拆分细嚼慢咽
本文链接:
/archives/linux-kvm
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
Emporer-Linux!
喜欢就支持一下吧