Virtman 虚拟机管理工具

容器管理使用 Podman 非常简单方便,但是虚拟机管理目前没有找到比较好用的工具,于是我就自己写了一个脚本来实现单主机上的虚拟机管理,直接调用 QEMU 进行虚拟机管理。

为何不用 Libvirt

Libvirt 是一个很优秀的虚拟化管理库及工具集,但是它依赖了太多软件包,使用及调试比较复杂,我之前曾尝试将其容器化,但是没能完美运行,并且 Libvirt 还在进行架构调整进而把单体拆成多个服务。

Virtman 虚拟机管理工具

刚参加工作时,我写过用脚本来管理部门几台物理机上的虚拟机,将物理机网卡变成 Bridge 进而使得创建出来的虚拟机和物理机处于同一网段。这个脚本是通过 Libvirt 创建的虚拟机,使用起来还算方便。

最近研究了一下,我发现可以直接通过 QEMU 来进行虚拟机管理,反而更简单一些,于是就写了个这个工具。

  • yq 进行 YAML 格式配置文件的解析
  • qemu-img 进行虚拟机磁盘的创建及扩容
  • qemu-nbd 进行虚拟机文件系统扩容及内容修正
  • ip 命令来创建主机 Bridge
  • iptables 来创建主机上的数据包规则
  • virtman 集中管理,虚拟机创建、启动、停止、状态查询等
  • 删除虚拟机为敏感操作,需手动进行虚拟机相关文件的删除

cloud-init 虚拟机初始化

最开始我是考虑创建 IMDS 服务来使用 cloud-init 对虚拟机初始化的,比如配置网络、指定主机名、自动扩容根文件系统、注入 SSH 公钥等,但是 cloud-init 近期才为 NoCloud 类型的数据源添加网络配置功能,当前稳定版本的镜像(Ubuntu/Debian等)都还不支持。

因此我是通过在 virtman 脚本里挂载虚拟机系统盘文件系统进行的网络配置,后面等 cloud-init 的最新版进入各发行版之后,我计划再改为 cloud-init 进行虚拟机初始化,这会让 virtman 更加通用一些,操作系统的差异由 cloud-init 来屏蔽。

Virtman 地址

https://github.com/chenzhiwei/virtman