KVM-QEMU-Libvirt介绍
前面的基础章节有提到虚拟化技术通常可以分为三大类,即:网络虚拟化、I/O虚拟化、CPU虚拟化。
其中KVM实现了CPU和内存的虚拟化,QEMU模型I/O设备(网卡、磁盘等),因此KVM+QEMU配合使用实现真正意义上的服务器虚拟化。
Libvirt是一个开源 API 和工具集,主要用于管理虚拟化技术 ,它为多种虚拟化技术提供了统一的接口,能够支持网络管理、资源管理、虚拟机管理等能力。
1 QEMU
它通过向Guest OS模拟CPU和其他硬件,让Guest OS认为自己是一台真正的物理机器。Qemu功能强大,能够模拟多种硬件架构和设备,但由于所有的指令都需要Qemu转译给真正的硬件,因此其性能较低。
2 KVM
Linux的内核模块,该功能需要CPU的支持,依赖于硬件辅助虚拟化技术,如:Intel-VT、AMD-V。有了上述技术支持,KVM可以直接使用CPU指令集来运行虚拟机,从而显著提供性能和效率。
内存管理的扩展功能如:EPT、RVI,主要用于提高虚拟机在内存地址转换上的效率,虚拟机可以直接访问内存,无需频繁地进行软件层面的地址转换,减少CPU的开销。
KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问该接口
3 QEMU+KVM
Qemu将Kvm整合进来,通过ioctl调用访问/dev/kvm接口,将有关CPU指令的部分交由内核模块,Kvm负责CPU虚拟化和内存虚拟化。由于Kvm不能模拟其他设备,因此Qemu模拟I/O设备(网卡、磁盘等),同时也衍生出了半虚拟化设备virtio_blk、virtio_net,以及pass through直通技术,进一步提高设备性能。
[架构图]
4 Libvirt
它是目前最为广泛的对KVM虚拟机进行管理的工具和API,Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程virsh调用,用于操作Qemu-Kvm虚拟机。
[架构图]
5 安装&服务状态
- 确认工具安装
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
- 检查服务状态
root@kwephis8419858:/# sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-09-13 14:08:03 CST; 1 weeks 3 days ago
TriggeredBy: ● libvirtd-ro.socket
● libvirtd-admin.socket
● libvirtd.socket
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 135067 (libvirtd)
Tasks: 20 (limit: 32768)
Memory: 65.7M
CGroup: /system.slice/libvirtd.service
├─ 87941 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/li>
├─ 87942 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/li>
└─135067 /usr/sbin/libvirtd
Sep 13 14:51:20 kwephis8419858 dnsmasq-dhcp[87941]: DHCPACK(virbr0) 192.168.122.122 52:54:00:2c:a4:3a vm-node1
Sep 13 15:21:20 kwephis8419858 dnsmasq-dhcp[87941]: DHCPREQUEST(virbr0) 192.168.122.122 52:54:00:2c:a4:3a
倘若没有运行,可以执行以下命令启动它:sudo systemctl status libvirtd
6 创建虚拟机
-
分配磁盘
qemu-img create -f qcow2 /path/to/vm_disk.qcow2 10G- f:指定了创建镜像的格式,如:raw、vmdk、vhd等
qemu-img create -f qcow2 -o backing_file=/path/to/base_image.qcow2,cluster_size=64K /path/to/new_image.qcow2 10G- o:指定特定格式的选项
- backing_file:指定一个基础镜像文件,新的镜像将基于该文件
- cluster_size:磁盘映像中存储数据的基本单位 ,默认为 64K。
-
下载系统镜像
Ubuntu镜像:
https://releases.ubuntu.com/ -
确认KVM支持
root@kwephis8419858:/# egrep -c '(vmx|svm)' /proc/cpuinfo 0 ## 返回值为 0,表示你的 CPU 不支持虚拟化,或虚拟化功能在 BIOS 中被禁用 root@kwephis8419858:/# lsmod | grep kvm root@kwephis8419858:/# ## 没有输出,说明 KVM 模块可能没有加载如果你的 CPU 支持虚拟化,但 KVM 模块未加载,你可能需要启用虚拟化支持
-
创建虚拟机
virt-install --virt-type kvm --name vm-node1 --ram 2048 --cdrom=/data/iso/ubuntu-18.04.6-live-server-amd64.iso --disk=/data/qemu_disk/vm-node1-20G.qcow2,bus=virtio,size=20,format=qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole- virt-type:指定虚拟化技术,kvm、qemu等
- ram:指定内存大小(MB)
- cdrom:指定安装操作系统的ISO文件
- disk:指定虚拟磁盘路径;bus总线使用virtio,大小为20G
- network:虚拟机连接到的虚拟网络
- graphics:启用VNC图形界面,允许任何IP地址连接
- noautoconsole:创建虚拟机后不自动打开控制台
如果不支持KVM,则可以使用QEMU等..
7 常用命令
7.1 Networking
-
查看网络列表
root@kwephis8419858:/# virsh net-list --all Name State Autostart Persistent -------------------------------------------- default active yes yes 安装了
libvirt后,通常会自动创建一个名为default的虚拟网络。这个网络是libvirt的默认虚拟网络,用于虚拟机之间的通信和与宿主机的网络连接。 -
查看详细信息
root@kwephis8419858:/# virsh net-info default Name: default UUID: 8d397a9e-5c04-4505-a970-71b5153f5373 Active: yes Persistent: yes Autostart: yes Bridge: virbr0 -
启动/禁用/自动启动网络
root@kwephis8419858:/# virsh net-destroy default Network default destroyed root@kwephis8419858:/# virsh net-start default Network default started root@kwephis8419858:/# virsh net-autostart ovsbr Network ovsbr marked as autostarted -
定义/删除/修改网络
root@kwephis8419858:/# virsh net-define /etc/libvirt/qemu/networks/default.xml root@kwephis8419858:/# virsh net-undefine default
7.2 虚拟机管理
-
列出虚拟机
root@kwephis8419858:/# virsh list --all Id Name State -------------------------- 7 vm-node1 running -
启动/关闭虚拟机
root@kwephis8419858:/# virsh start vm-node1 Domain vm-node1 started root@kwephis8419858:/# virsh shutdown vm-node1 Domain vm-node1 is being shutdown -
暂停/恢复虚拟机
root@kwephis8419858:/# virsh suspend vm-node1 Domain vm-node1 suspended root@kwephis8419858:/# virsh resume vm-node1 Domain vm-node1 resumed -
修改/导出虚拟机配置
root@kwephis8419858:/# virsh edit vm-node1 Domain vm-node1 XML configuration not changed. root@kwephis8419858:/# virsh dumpxml vm-node1 -
定义/删除虚拟机
root@kwephis8419858:/# virsh define vm-node1 root@kwephis8419858:/# virsh undefine vm-node1
7.3 其他命令
-
查看状态
root@kwephis8419858:/# virsh dominfo vm-node1 Id: 8 Name: vm-node1 UUID: aa42a9e1-ac6d-43c1-a960-e8540b5ee490 OS Type: hvm State: running CPU(s): 2 CPU time: 128.2s Max memory: 2097152 KiB Used memory: 2097152 KiB Persistent: yes Autostart: disable Managed save: no Security model: apparmor Security DOI: 0 Security label: libvirt-aa42a9e1-ac6d-43c1-a960-e8540b5ee490 (enforcing) -
监控性能
root@kwephis8419858:/# virsh domstats vm-node1 Domain: 'vm-node1' state.state=1 state.reason=5 cpu.time=128954121860 cpu.user=119840000000 cpu.system=2880000000 vcpu.current=2 vcpu.maximum=2 ... net.count=1 net.0.name=vnet0 net.0.rx.bytes=0 net.0.tx.bytes=3854 ... block.count=2 block.0.name=vda block.0.path=/data/qemu_disk/vm-node1-10G.qcow21)Domain状态
- state.state: 1 表示虚拟机正在运行
- state.reason: 5 是状态的具体原因,通常用于调试
2)CPU使用情况
- cpu.time: 总 CPU 时间(纳秒)。
- cpu.user: 用户模式下消耗的 CPU 时间(纳秒)。
- cpu.system: 内核模式下消耗的 CPU 时间(纳秒)。
- vcpu.current: 当前虚拟 CPU 数量(2)。
- vcpu.maximum: 最大虚拟 CPU 数量(2)。
3)网络统计
- net.count: 网络接口的数量(1)。
- net.0.rx.bytes: 接收的字节数(0 表示未接收数据)。
- net.0.tx.bytes: 发送的字节数(3854 字节)。
4)磁盘I/O统计
- block.count: 磁盘设备的数量(2)。
- block.0.name: 设备名称(vda)。
- rd.bytes: 读取的字节总数(257787904 字节)。
- wr.bytes: 写入的字节总数(11457536 字节)。
- allocation: 分配的空间(2186018816 字节)。
- capacity: 虚拟磁盘的容量(10GB)。
- physical: 实际物理空间使用(2186063872 字节)。