虚拟机驱动
⚡ 要求 | Lima >= 2.0 |
---|
Lima 支持两种类型的驱动:内部和外部。这种架构允许扩展性和平台特定的实现。驱动程序不知道它们是内部还是外部的。
💡 另请参见:VM 类型了解不同虚拟化后端的用户配置。
内部驱动 vs 外部驱动
内部驱动直接编译到 limactl
二进制文件中,并在启动时通过将驱动对象传递给 registry.Register()
函数并在主 limactl 代码中使用 Go 的空白导入 _
导入包来自动注册。例如:
构建标签控制哪些驱动被编译为内部驱动 vs 外部驱动(例如,external_qemu
、external_vz
、external_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 从以下位置发现外部驱动:
- 标准目录:
<LIMA-PREFIX>/libexec/lima/
,其中<LIMA_PREFIX>
是 Lima 二进制文件所在的路径 - 自定义目录:通过
LIMA_DRIVERS_PATH
环境变量设置外部驱动目录的路径
发现过程由 pkg/registry/registry.go
处理。
创建自定义外部驱动
要创建新的外部驱动:
- 实现接口:你的驱动必须实现
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)
}
- 创建 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)
}
构建和部署:
- 构建你的驱动:
go build -o lima-driver-mydriver main.go
- 将二进制文件放置在通过
LIMA_DRIVERS_PATH
可访问的目录中 - 确保二进制文件是可执行的
- 构建你的驱动:
使用驱动:在创建实例时显式指定驱动:
limactl create myinstance --vm-type=mydriver template://default
示例
参见现有的外部驱动实现: