1. 安装libvirt开发库
在 Ubuntu/Debian 系统:
apt update
apt install libvirt-dev
在 CentOS/RHEL 系统:
yum install libvirt-devel
检查安装是否成功:
运行以下命令,确认 libvirt
开发库的路径:
pkg-config --cflags --libs libvirt
虚拟机操作完整表:涵盖常用函数及参数
功能 | 函数 | 说明 | 常用参数 |
---|---|---|---|
启动虚拟机 | virDomainCreate |
启动已定义的虚拟机 | 无 |
定义并启动虚拟机 | virDomainCreateXML |
定义新的虚拟机并立即启动 | xmlDesc : 虚拟机定义的 XML 描述;flags : 通常为 0 |
定义虚拟机 | virDomainDefineXML |
定义一个持久化虚拟机,但不启动 | xmlDesc : 虚拟机的 XML 描述 |
安全关机 | virDomainShutdown |
正常方式关机,通过 ACPI 触发 | 无 |
强制关机 | virDomainDestroy |
强制断电方式关闭虚拟机 | 无 |
暂停虚拟机 | virDomainSuspend |
暂停正在运行的虚拟机 | 无 |
恢复虚拟机 | virDomainResume |
恢复已暂停的虚拟机 | 无 |
重启虚拟机 | virDomainReboot |
重新启动虚拟机 | flags : 通常为 0 |
删除虚拟机 | virDomainUndefine |
删除虚拟机配置,但不删除磁盘文件 | 无 |
查询虚拟机状态 | virDomainGetState |
获取虚拟机的运行状态和原因 | state : 存储状态值;reason : 存储状态原因 |
挂起虚拟机到硬盘 | virDomainManagedSave |
保存虚拟机状态到磁盘,释放内存资源 | 无 |
恢复挂起状态 | virDomainCreate |
从挂起状态恢复虚拟机 | 无 |
获取虚拟机名称 | virDomainGetName |
获取虚拟机名称 | 无 |
获取虚拟机UUID | virDomainGetUUIDString |
获取虚拟机的 UUID 字符串 | uuid : 用于存储 UUID |
获取虚拟机XML定义 | virDomainGetXMLDesc |
获取虚拟机的 XML 定义 | flags : 通常为 0 |
获取虚拟机内存用量 | virDomainMemoryStats |
获取虚拟机的内存统计信息 | stats : 内存统计数组;maxStats : 数组大小 |
调整虚拟机内存 | virDomainSetMemory |
设置虚拟机的内存大小 | memory : 内存大小(以 KiB 为单位) |
调整虚拟机CPU数 | virDomainSetVcpus |
设置虚拟机的虚拟 CPU 数量 | vcpu : CPU 数量 |
挂载磁盘 | virDomainAttachDevice |
将磁盘或设备挂载到虚拟机 | xml : 磁盘或设备的 XML 描述 |
卸载磁盘 | virDomainDetachDevice |
从虚拟机中卸载磁盘或设备 | xml : 磁盘或设备的 XML 描述 |
创建虚拟机快照 | virDomainSnapshotCreateXML |
为虚拟机创建快照 | xmlDesc : 快照的 XML 描述;flags : 通常为 0 |
恢复快照 | virDomainRevertToSnapshot |
恢复到某个快照 | snapshot : 指向快照的指针;flags : 通常为 0 |
删除快照 | virDomainSnapshotDelete |
删除一个快照 | snapshot : 指向快照的指针;flags : 删除方式 |
迁移虚拟机 | virDomainMigrate |
将虚拟机迁移到另一个主机 | dconn : 目标连接;flags : 迁移选项 |
获取虚拟机磁盘I/O | virDomainBlockStats |
获取虚拟机磁盘的 I/O 统计信息 | path : 磁盘路径;stats : 用于存储统计信息 |
获取虚拟机网络流量 | virDomainInterfaceStats |
获取虚拟机网络接口的流量统计 | path : 网络接口名称;stats : 用于存储统计信息 |
启动虚拟机控制台 | virDomainOpenConsole |
启动虚拟机的控制台 | devName : 设备名称;flags : 控制台选项 |
删除挂起状态 | virDomainManagedSaveRemove |
删除虚拟机的挂起状态文件 | 无 |
启动虚拟机时自动恢复挂起状态 | virDomainManagedSaveDefine |
设置虚拟机启动时自动恢复挂起状态 | 无 |
启用虚拟机自动启动 | virDomainSetAutostart |
设置虚拟机开机自动启动 | autostart : 1 表示启用,0 表示禁用 |
获取虚拟机CPU统计 | virDomainGetCPUStats |
获取虚拟机的 CPU 使用统计信息 | nparams : 统计参数个数;flags : 通常为 0 |
销毁虚拟机CPU状态 | virDomainPinVcpu |
将虚拟机的虚拟 CPU 绑定到物理 CPU | cpumap : CPU 掩码 |
常见状态码(virDomainGetState
返回值)
状态 | 描述 |
---|---|
VIR_DOMAIN_NOSTATE |
虚拟机未定义状态 |
VIR_DOMAIN_RUNNING |
虚拟机正在运行 |
VIR_DOMAIN_BLOCKED |
虚拟机被阻塞(等待 I/O) |
VIR_DOMAIN_PAUSED |
虚拟机已暂停 |
VIR_DOMAIN_SHUTDOWN |
虚拟机正在关闭 |
VIR_DOMAIN_SHUTOFF |
虚拟机已关闭 |
VIR_DOMAIN_CRASHED |
虚拟机崩溃 |
VIR_DOMAIN_PMSUSPENDED |
虚拟机已挂起至磁盘 |
示例使用场景
启动虚拟机并获取状态:
if (virDomainCreate(dom) == 0) { printf("Virtual machine started successfully.\n"); int state, reason; virDomainGetState(dom, &state, &reason, 0); printf("Current state: %d\n", state); }
动态调整虚拟机内存:
if (virDomainSetMemory(dom, 2048000) == 0) { // 设置为 2GB 内存 printf("Memory resized successfully.\n"); }
挂载磁盘设备:
const char *disk_xml = "<disk type='file' device='disk'>" "<driver name='qemu' type='qcow2'/>" "<source file='/var/lib/libvirt/images/new-disk.qcow2'/>" "<target dev='vdb' bus='virtio'/>" "</disk>"; if (virDomainAttachDevice(dom, disk_xml) == 0) { printf("Disk attached successfully.\n"); }
此表和示例涵盖了大部分 libvirt
的核心功能,方便开发者实现对 KVM 虚拟机的全面管理。