Administrator
Administrator
发布于 2024-11-18 / 10 阅读
0
0

使用C语言libvirt实现kvm自动化

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 虚拟机已挂起至磁盘

示例使用场景

  1. 启动虚拟机并获取状态

    if (virDomainCreate(dom) == 0) {
        printf("Virtual machine started successfully.\n");
        int state, reason;
        virDomainGetState(dom, &state, &reason, 0);
        printf("Current state: %d\n", state);
    }
    
  2. 动态调整虚拟机内存

    if (virDomainSetMemory(dom, 2048000) == 0) { // 设置为 2GB 内存
        printf("Memory resized successfully.\n");
    }
    
  3. 挂载磁盘设备

    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 虚拟机的全面管理。


评论