虚拟机驱动

⚡ 要求Lima >= 2.0

Lima 支持两种类型的驱动:内部外部。这种架构允许扩展性和平台特定的实现。驱动程序不知道它们是内部还是外部的。

💡 另请参见VM 类型了解不同虚拟化后端的用户配置。

内部驱动 vs 外部驱动

内部驱动直接编译到 limactl 二进制文件中,并在启动时通过将驱动对象传递给 registry.Register() 函数并在主 limactl 代码中使用 Go 的空白导入 _ 导入包来自动注册。例如:

构建标签控制哪些驱动被编译为内部驱动 vs 外部驱动(例如,external_qemuexternal_vzexternal_wsl2)。

外部驱动是通过 gRPC 与 Lima 通信的独立可执行文件。它们在运行时从配置的目录中被发现。

⚠️ 注意:外部驱动是实验性的,API 可能在未来版本中发生变化。

将驱动构建为外部驱动

你可以使用 ADDITIONAL_DRIVERS Makefile 变量将现有的内部驱动构建为外部驱动:

# 将 QEMU 构建为外部驱动
make ADDITIONAL_DRIVERS=qemu limactl additional-drivers

# 将多个驱动构建为外部驱动
make ADDITIONAL_DRIVERS="qemu vz wsl2" limactl additional-drivers

这会在 _output/libexec/lima/ 中创建外部驱动二进制文件,命名模式为 lima-driver-<name>(或在 Windows 上为 lima-driver-<name>.exe)。

驱动发现

Lima 从以下位置发现外部驱动:

  1. 标准目录<LIMA-PREFIX>/libexec/lima/,其中 <LIMA_PREFIX> 是 Lima 二进制文件所在的路径
  2. 自定义目录:通过 LIMA_DRIVERS_PATH 环境变量设置外部驱动目录的路径

发现过程由 pkg/registry/registry.go 处理。

创建自定义外部驱动

要创建新的外部驱动:

  1. 实现接口:你的驱动必须实现 driver.Driver 接口:
type Driver interface {
	Lifecycle
	GUI
	SnapshotManager
	GuestAgent

	Info() Info
	Configure(inst *limatype.Instance) *ConfiguredDriver
	FillConfig(ctx context.Context, cfg *limatype.LimaYAML, filePath string) error
	SSHAddress(ctx context.Context) (string, error)
}
  1. 创建 main.go:使用 server.Serve() 来暴露你的驱动:
package main

import (
    "context"
    "github.com/lima-vm/lima/v2/pkg/driver/external/server"
)

func main() {
    driver := &MyDriver{}
    server.Serve(context.Background(), driver)
}
  1. 构建和部署

    • 构建你的驱动:go build -o lima-driver-mydriver main.go
    • 将二进制文件放置在通过 LIMA_DRIVERS_PATH 可访问的目录中
    • 确保二进制文件是可执行的
  2. 使用驱动:在创建实例时显式指定驱动:

limactl create myinstance --vm-type=mydriver template://default

示例

参见现有的外部驱动实现: