ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Lima Krunkit 驱动实战指南:在 Apple Silicon 上运行 GPU/Vulkan 加速的超轻量虚拟机

Lima Krunkit 驱动实战指南:在 Apple Silicon 上运行 GPU/Vulkan 加速的超轻量虚拟机 Lima Krunkit 驱动实战指南在 Apple Silicon 上运行 GPU/Vulkan 加速的超轻量虚拟机【免费下载链接】limaLinux virtual machines, with a focus on running containers项目地址: https://gitcode.com/GitHub_Trending/lim/lima本文围绕 Lima 仓库官方文档 website/content/en/docs/config/vmtype/krunkit.md 展开结合 pkg/driver/krunkit 驱动源码与构建脚本系统讲解 krunkit 驱动的架构、安装、配置约束以及如何在 macOS/ARM64 上用 GPU 加速运行本地大语言模型LLM。读完本文你将掌握 krunkit 驱动的完整使用链路宿主安装、驱动发现与构建、VM 配置、容器化与非容器化两种 GPU 推理方案以及底层 virtio 设备与启动脚本的工作原理。一、Krunkit 是什么Krunkit 是一个面向 macOS/ARM64 的轻量级虚拟机运行器核心定位是在超轻量 VM 中提供 GPU 访问能力。它构建在 libkrun 之上——libkrun 是一个内嵌 VMMVirtual Machine Monitor的库应用可以在硬件隔离的 VM 中直接启动进程macOS 上使用 HVFLinux 上使用 KVM。Krunkit 最突出的特性是客户机内 GPU 支持通过 Mesa 的 Venus Vulkan 驱动venusVM 内部可以直接运行 Vulkan 工作负载例如基于 Vulkan 后端编译的llama.cpp推理引擎。这一特性使得 Lima 用户可以在 macOS 上以接近原生性能体验 GPU 加速的本地 AI 推理。在 Lima 中krunkit 以**外部驱动external driver**形式接入。Lima 的驱动架构分为 internal 与 external 两类internal 驱动编译进limactl二进制如 qemu、vzexternal 驱动则是独立可执行文件通过 gRPC 与 Lima 通信。完整的驱动架构说明见 Virtual Machine Drivers。⚠️实验性特性krunkit 驱动当前标记为实验性experimentalAPI 与行为在未来版本中可能发生变化详见 experimental 发布说明。环境要求需求要求Lima 2.0macOS 14Sonoma原文档标注源码校验要求 macOS 13硬件Apple Siliconarm64二、在宿主机安装 krunkitkrunkit 本体是独立于 Lima 的二进制需要先通过 Homebrew 安装brew tap slp/krun brew install krunkit安装后krunkit命令必须出现在PATH中。这一点是驱动启动前的硬性校验源码 pkg/driver/krunkit/krunkit_driver_darwin_arm64.go 中validateConfig会执行exec.LookPath(krunkit)找不到时直接返回错误并提示上述两条安装命令。此外驱动还要求 krunkit 版本不低于1.2.1checkKrunkitVersion通过执行krunkit --version解析语义化版本号进行判断该版本引入了 vsock forwarder 功能低于此版本会拒绝启动。三、在 Lima 中使用 krunkit 驱动3.1 驱动发现与验证krunkit 驱动通常随 Lima 以外部驱动形式分发。安装 Lima 后可以用limactl info查看当前已注册的 VM 类型确认 krunkit 是否可用$ limactl info | jq .vmTypesEx { krunkit: { location: /opt/homebrew/Cellar/lima/2.0.1/libexec/lima/lima-driver-krunkit }, qemu: { location: internal }, vz: { location: internal } }输出中location为具体路径的即为外部驱动krunkit值为internal的则是内置于limactl的驱动。Lima 通过 pkg/registry/registry.go 的discoverDrivers完成发现扫描顺序为环境变量LIMA_DRIVERS_PATH指定的自定义目录可包含多个路径也可直接指向单个可执行文件标准目录LIMA-PREFIX/libexec/lima/即 Lima 二进制所在位置对应的 libexec 目录。外部驱动二进制按lima-driver-name命名如lima-driver-krunkit扫描目录中满足该命名且可执行的文件都会被注册。3.2 手动构建并安装驱动如果limactl info中没有出现 krunkit可以从源码构建并安装外部驱动。Lima 的 Makefile 提供了additional-drivers目标通过ADDITIONAL_DRIVERS变量指定要额外构建的驱动git clone https://github.com/lima-vm/lima cd lima # 将 vX.Y.Z 替换为实际版本号 git checkout vX.Y.Z make ADDITIONAL_DRIVERSkrunkit additional-drivers # 将 /usr/local 替换为实际安装前缀 cp -a _output/libexec/lima/lima-driver-krunkit /usr/local/libexec/lima/构建产物输出到_output/libexec/lima/lima-driver-krunkit将其复制到上节所述的任一驱动发现目录即可。外部驱动的入口代码位于 cmd/lima-driver-krunkit/main_darwin_arm64.go其核心只有一行server.Serve(context.Background(), krunkit.New())——即将 pkg/driver/krunkit 中实现的LimaKrunkitDriver通过 gRPC 服务暴露给limactl。该驱动实现的是driver.Driver接口接口契约定义见 pkg/driver/external/driver.proto。3.3 驱动配置约束源码级校验在启动实例前Lima 会调用驱动Configure内部执行fillConfig与Validate执行validateConfig相关逻辑位于 krunkit_driver_darwin_arm64.go需要注意以下约束宿主版本macOS 必须为 13.0Ventura或更高架构仅支持原生架构Apple Silicon 上为 aarch64指定非原生架构如 amd64会报krunkit requires native archkrunkit 版本不低于 1.2.1mountType仅允许virtiofs或revsshfs其他取值直接报错TPMkrunkit 驱动不支持tpm: true配置即报错嵌套虚拟化nestedVirtualization: true要求 macOS 15Sequoia或更新版本Windows 客户机krunkit 目前不支持 Windows guestcurrently Windows guest OS is only supported on QEMU。同时fillConfig会为未显式配置的字段填充默认值这一点对用户透明但值得了解mountType默认设为virtiofsarch默认设为aarch64ssh.overVsock默认设为false——源码注释指出自 Fedora 44 起 overVsock 已知不可用Lima issue #5085若用户显式开启会收到警告日志。从上述约束可以看出krunkit 与 QEMU/VZ 在能力边界上差异明显主要面向 GPU 推理场景而非通用 Windows 支持或 TPM 需求。各 VM 类型的选型对比可参考 VM types。四、快速开始在 krunkit VM 中运行本地 AI 模型krunkit 驱动最有代表性的落地场景是在 macOS 上本地运行大语言模型。官方文档给出了两条路径容器方式最快上手任意发行版均可直接使用预构建镜像无容器方式硬核路径选择 Fedora 镜像从源码构建带 Vulkan 支持的llama.cpp。无论哪条路径都需要先在宿主下载一个小模型以便快速验证。官方示例使用Qwen3.5-2B-Q8_0mkdir -p models curl -LO --output-dir models https://huggingface.co/unsloth/Qwen3.5-2B-GGUF/resolve/main/Qwen3.5-2B-Q8_0.gguf模型文件位于宿主机目录将通过挂载方式共享进 VM/容器容器路径示例为/models。挂载机制的配置说明可参考 mount。4.1 方式一容器化运行最简单启动一个使用默认模板的 krunkit VMlimactl start --vm-typekrunkit limactl shell default进入 VM 后用nerdctl启动带 GPU 设备映射的推理容器nerdctl run --rm -ti \ --device /dev/dri \ -v $(pwd)/models:/models \ ghcr.io/unsuman/fedora-vgpu-llama关键参数说明--device /dev/dri把 VM 内的 DRM 渲染节点/dev/dri/renderD*、/dev/dri/card*映射进容器这是容器内应用访问 Venus Vulkan 的前提-v $(pwd)/models:/models将宿主下载的模型目录挂载进容器。进入容器后即可与模型对话llama-cli -m /models/Qwen3.5-2B-Q8_0.gguf -b 512 -ngl 99 -p Introduce yourself参数含义-m指定 GGUF 模型文件-b 512设置 batch size-ngl 99表示将 99 层神经网络层卸载到 GPU配合--device /dev/dri使用-p为初始提示词。容器化方案的优势在于镜像已预装好 GPU/Vulkan 运行时任意 Linux 发行版均可直接使用。4.2 方式二无容器运行硬核路径该路径需要在 VM 内从源码构建llama.cpp耗时较长。提示构建前建议为 VM 分配更多 CPU 与内存例如limactl start --cpus 8 --memory 8或在 YAML 中配置cpus/memory字段完整启动参数参考 参考文档 中的limactl start说明。此路径必须使用 Fedora 镜像因为 Venus 支持的 Mesa 补丁包通过 Fedora COPR 仓库提供。命令行方式启动limactl start --vm-typekrunkit template:fedora limactl shell fedoraYAML 方式启动等价配置vmType: krunkit base: - template:_images/fedora - template:_default/mounts mountType: virtiofs其中template:_images/fedora对应仓库镜像模板 templates/_images/fedora.yamltemplate:_default/mounts提供默认挂载配置见 templates/_default/mounts.yamlmountType: virtiofs则明确使用 virtio-fs 共享目录krunkit 支持的类型之一。进入 VM 后执行以下脚本安装 GPU/Vulkan 支持并从源码构建llama.cpp#!/bin/bash # SPDX-FileCopyrightText: Copyright The Lima Authors # SPDX-License-Identifier: Apache-2.0 set -eu -o pipefail # 安装所需基础包 dnf install -y dnf-plugins-core dnf-plugin-versionlock llvm18-libs # 安装 Vulkan 与 Mesa 基础包 dnf install -y \ mesa-vulkan-drivers \ vulkan-loader-devel \ vulkan-headers \ vulkan-tools \ vulkan-loader \ glslc # 启用提供 Venus 补丁 Mesa 的 COPR 仓库 dnf copr enable -y slp/mesa-libkrun-vulkan # 降级到 COPR 仓库中打过补丁的 Mesa 版本 REPOIDcopr:copr.fedorainfracloud.org:slp:mesa-libkrun-vulkan MESA_VERSION$(dnf repoquery -q --available --repoid$REPOID --latest-limit1 --qf %{evr} mesa-vulkan-drivers 2/dev/null) dnf downgrade -y mesa-vulkan-drivers-${MESA_VERSION} # 锁定 Mesa 版本防止自动升级破坏 Venus 支持 dnf versionlock add mesa-vulkan-drivers-${MESA_VERSION} # 清理 dnf clean all echo Installing llama.cpp with Vulkan support... # 构建并安装带 Vulkan 支持的 llama.cpp。 dnf install -y \ git \ cmake \ clang \ curl-devel \ spirv-headers-devel \ spirv-tools-devel \ vulkan-devel \ virglrenderer # 在临时目录外构建避免构建失败或中断留下过期检出目录影响下次尝试。 SRC_DIR$(mktemp -d) trap rm -rf $SRC_DIR EXIT git clone --depth 1 https://github.com/ggml-org/llama.cpp $SRC_DIR cmake -S $SRC_DIR -B $SRC_DIR/build \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/usr \ -DGGML_VULKANON \ -DGGML_CCACHEOFF \ -DGGML_NATIVEOFF cmake --build $SRC_DIR/build --config Release -j$(nproc) cmake --install $SRC_DIR/build echo Successfully installed llama.cpp with Vulkan support. Use llama-cli app with .gguf models.脚本执行的关键动作拆解安装 Vulkan 工具链mesa-vulkan-drivers、vulkan-loader、vulkan-tools内含vulkaninfo等启用并降级到 COPR 补丁 Mesaslp/mesa-libkrun-vulkan仓库提供支持 Venus 的 Mesa 构建通过dnf downgrade覆盖官方版本并用versionlock锁定防止后续dnf upgrade破坏 GPU 支持从源码构建 llama.cppCMake 配置中-DGGML_VULKANON是关键开关启用 Vulkan 计算后端-DGGML_NATIVEOFF保证二进制在 VM 内可移植构建目录使用mktemp -d并在退出时清理。构建完成后运行llama-cli -m models/Qwen3.5-2B-Q8_0.gguf -b 512 -ngl 99 -p Introduce yourself即可开始与模型对话。Tip如果模型加载过慢或出现性能问题尝试调低-ngl卸载到 GPU 的层数的值例如从 99 降到 32 或更低观察加载时间与生成速度的变化。五、底层原理krunkit 驱动的实现细节5.1 命令行参数映射启动 VM 时Lima 会在 pkg/driver/krunkit/krunkit_darwin_arm64.go 的Cmdline函数中把实例配置翻译为 krunkit 命令行参数Lima 配置krunkit 参数说明memory--memory MiB内存大小按 MiB 换算cpus--cpus nvCPU 数量—--device virtio-serial,logFilePath...串口日志输出到实例目录的serial.log—--krun-log-level 3krun 日志级别—--restful-uri none://关闭 RESTful 管理接口启动磁盘--device virtio-blk,path...,formatraw首个 virtio-blk 设备即启动盘格式为 rawcloud-init--device virtio-blk,pathcidata.isocidata ISO 作为第二块 virtio-blkGuest agent--device virtio-vsock,port2222,...vsock 端口 2222 连接 guest agent socketSSH over vsock--device virtio-vsock,port22,...ssh.overVsock: true时启用additionalDisks--device virtio-blk,path...,formatraw附加数据盘挂载前先加锁并转换为 raw 格式mountType: virtiofs--device virtio-fs,sharedDir...,mountTag...每个挂载点一个 virtio-fs 设备挂载点目录不存在时自动创建nestedVirtualization--nested仅 macOS 15 可用5.2 网络与 usernet网络配置由buildNetworkArgs与startUsernet共同完成krunkit_darwin_arm64.go未配置 Lima 网络networks为空时Lima 会启动进程内 gvisor-tap-vsock 用户态网络usernet.StartGVisorNetstack并把 fd 通过virtio-net,typeunixgram,fd...传给 krunkitMAC 地址由实例目录确定性派生配置了user-v2网络时通过 usernet 的 QEMU socket 桥接配置shared/bridged网络时要求系统已安装socket_vmnet守护进程否则报错socket_vmnet is not installed。5.3 vsock 转发与 SSH驱动在启动时尝试探测 guest 内的 SSH 是否监听 vsock 端口startVsockForwarderkrunkit_darwin_arm64.go若探测成功则在宿主 TCP 端口与 vsock socket 之间建立代理这正是 krunkit 1.2.1 引入的能力否则回退到 usernet 端口转发。由于ssh.overVsock默认关闭常规场景走 usernet 转发即可。5.4 GPU 设备权限与启动脚本krunkit 驱动内置了两段 Linux 启动脚本嵌入于 pkg/driver/krunkit/boot.Linux专门为 GPU 访问准备环境00-add-user-to-video-render-group.sh创建render、video组并把 Lima 用户加入确保容器能访问 GPU 设备节点01-gpu-device-perms.sh写入 udev 规则70-lima-drm.rules将/dev/dri/renderD*与/dev/dri/card*的权限设为0666世界可读写并立即重载 udev、对已有节点赋权。值得一提的细节BootScripts方法对 Fedora 镜像做了特殊处理krunkit_driver_darwin_arm64.go——将00-reboot-if-required.sh替换为空操作以加快 Fedora 的启动时间。5.5 磁盘格式与快照能力krunkit 驱动创建磁盘时使用raw 格式driverutil.EnsureDisk(..., raw.Type)源码注释说明krunkit 也支持 qcow2但 raw 创建与使用更快。相应地驱动对外声明SupportedImageFormats: [raw]。同时快照snapshot相关接口全部返回unimplemented by the krunkit driver即当前不支持快照功能GUI、显示密码、显示连接等接口同样未实现说明 krunkit 驱动是纯命令行/无头运行导向的。六、注意事项与故障排查macOS 版本要求 macOS Ventura13或更新版本在 Apple Silicon 上运行官方文档标注为 macOS 14Sonoma建议以 Sonoma 及以上版本为准验证 GPU/Vulkan在 guest 容器或 VM 内使用vulkaninfo --summary检查 Vulkan 实例、设备与 Venus 支持是否就绪若输出异常先确认/dev/dri设备存在且权限为 0666发行版选择容器化推理可在任意 Linux 发行版运行无容器路径必须使用 FedoraVenus 补丁 Mesa 依赖 Fedora COPR 仓库模型性能-ngl值过大导致加载慢或生成卡顿时逐步降低该值llama-cli用法更多参数说明参见 llama.cpp 项目 README查看运行日志krunkit 进程的 stderr 写入实例目录下的krunkit.log启动异常时可据此排查参见 krunkit_driver_darwin_arm64.goVM 类型不可变vmType只能在创建实例时指定已创建实例无法更改见 VM types驱动架构参考external driver 的接口实现、生命周期与调用顺序详见 Virtual Machine DriversGPU 相关配置的总览见 GPU。【免费下载链接】limaLinux virtual machines, with a focus on running containers项目地址: https://gitcode.com/GitHub_Trending/lim/lima创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表