Tart 虚拟化工具集全解析:在 Apple Silicon 上用 Virtualization.Framework 构建、运行与管理 macOS/Linux CI 虚拟机 Tart 虚拟化工具集全解析在 Apple Silicon 上用 Virtualization.Framework 构建、运行与管理 macOS/Linux CI 虚拟机【免费下载链接】tartmacOS and Linux VMs on Apple Silicon to use in CI and other automations项目地址: https://gitcode.com/GitHub_Trending/ta/tartTart 是一套面向 CI 与自动化场景、运行于 Apple Silicon 之上的 macOS/Linux 虚拟机工具集它借助苹果自家的 Virtualization.Framework 获得接近原生的性能并把虚拟机镜像以 OCI 标准推拉到任意容器注册表从而让虚拟机像容器一样被克隆、分发与缓存。读完本文你将掌握 Tart 的安装与三命令快速上手、完整的 CLI 命令全景、OCI 注册表认证与推拉原理以及tart run在图形、网络、目录共享等场景下的全部实战参数。项目定位为 CI 而生的 Apple Silicon 虚拟机工具集README 对 Tart 的定义非常精炼A virtualization toolset to build, run and manage macOS and Linux virtual machines (VMs) on Apple Silicon——即一个用于在 Apple Silicon 上构建、运行和管理 macOS 与 Linux 虚拟机的工具集并且强调它 Built by CI engineers for your automation needs由 CI 工程师为自动化需求而构建。围绕这一定位README 列出了四个核心亮点使用苹果官方Virtualization.FrameworkTart 不依赖 QEMU 等第三方虚拟机监控器而是直接构建在 Apple 的虚拟化框架之上README 声称可借此获得**接近原生near-native**的性能表现Push/Pull 任意 OCI 兼容容器注册表虚拟机镜像遵循 Open Container InitiativeOCI标准可以像容器镜像一样分发Tart Packer Plugin可使用 HashiCorp Packer 插件来自动化创建虚拟机镜像轻松集成任何 CI 系统因为 CLI 形态简单、输出可控可嵌入 GitHub Actions、GitLab CI、Buildkite、Cirrus CI 等各类流水线。README 还提到许多公司已在内部生产环境使用 Tart例如 Atlassian、Figma、Mullvad、Krisp、TestingBot、Symflower、Transloadit、Cirrus CI、Expo 等该列表以 README 声明为准。需要强调的是这些信息来自项目 README 的自我陈述本文后续的技术结论均以 README.md、docs/quick-start.md 以及Sources/下的实现源码为准。快速上手三条命令跑起第一个 Tart VM根据 README.md 和 docs/quick-start.md在 Apple Silicon 设备上macOS 13.0 Ventura 或更高版本只需要三步即可体验brew install openai/tools/tart tart clone ghcr.io/cirruslabs/macos-tahoe-base:latest tahoe-base tart run tahoe-base第一条命令通过 Homebrew 安装tart可执行文件第二条命令从 GitHub Container Registry 克隆一份 macOS 26Tahoe基础镜像到本地首次会下载约 25 GB 的镜像第三条命令以图形窗口方式启动虚拟机。如果你不想使用 Homebrew也可以手动安装发布归档见 docs/quick-start.mdcurl -LO https://github.com/openai/tart/releases/latest/download/tart.tar.gz tar -xzvf tart.tar.gz ./tart.app/Contents/MacOS/tart clone ghcr.io/cirruslabs/macos-tahoe-base:latest tahoe-base ./tart.app/Contents/MacOS/tart run tahoe-base文档特别提醒必须使用./tart.app/Contents/MacOS/tart这个二进制路径启动以便 macOS 正确拾取tart.app/Contents/embedded.provisionprofile从而获得 Tart 所需的高权限如创建虚拟网络接口。clone 背后的玄机APFS 写时复制与自动清理tart clone不是简单的文件复制。查看 Clone.swift 的命令说明可以确认两个重要机制APFS 写时复制copy-on-write克隆的虚拟机不会立即占用全部磁盘空间只有对克隆盘产生修改时才会写入并占用新空间因此克隆速度极快、空间开销极低。自动清理automatic pruning默认情况下 Tart 会检查TART_HOME目录的可用容量并尝试回收最小必要空间以容纳克隆镜像可通过设置环境变量TART_NO_AUTO_PRUNE关闭该行为也可用--prune-limit n默认 100单位 GB限制单次自动清理的回收上限见 Clone.swift。此外Clone.swift中还能看到几条实用的边界校验新 VM 名称不能包含/网络并发数--concurrency不能小于 1克隆前若源镜像 manifest 中含 ASIF overlay 层asifOverlayMediaType则会强制校验宿主机是否支持 stacked diskClone.swift。技术底座Apple Virtualization.Framework 与近原生性能Tart 的性能底气来自它直接调用苹果的Virtualization.Frameworkimport Virtualization。以 Run.swift 为例可以看到整套基于VZ*前缀 API 的实现VZVirtualMachine/VZVirtualMachineView虚拟机的核心对象与图形视图Run.swiftVZDiskImageSynchronizationMode/VZDiskImageCachingMode磁盘同步与缓存策略枚举Tart 为它们提供了字符串解析扩展none/fsync/full与automatic/cached/uncachedVZBridgedNetworkInterface桥接网络接口VZLinuxRosettaDirectoryShareRosetta 目录共享用于在 Linux 虚拟机内运行 Intel 二进制VZNetworkBlockDeviceStorageDeviceAttachmentNetwork Block DeviceNBD块设备挂载要求宿主为 macOS 14Run.swift。同时Run.swift 在启动前会做一项重要检查以文件锁保护config.json若发现与运行中 VM 存在MAC 地址冲突会自动重新生成 MAC 地址再启动避免同一网络中出现地址冲突。磁盘同步与缓存模式的取舍tart run的--root-disk-opts参数Run.swift提供了一组在生产环境非常有用的 I/O 调优选项选项含义风险/收益ro根磁盘只读挂载适合以不可变基础镜像运行临时 VMsyncnone关闭数据同步不保证落盘性能最高但宕机丢数据风险最大syncfsync执行fsync但不确认真正写入折中方案syncfull同步并确认真正写入数据最安全性能开销最大cachingautomatic由虚拟化框架自动决定是否启用缓存默认推荐cachingcached/cachinguncached强制启用 / 禁用数据缓存视工作负载取舍命令全景从 Root.swift 看 tart CLI 的完整子命令Tart 的 CLI 基于 Swift 官方swift-argument-parser构建所有子命令在 Root.swift 中注册。当前共包含 19 个基础子命令另有一个按 macOS 版本条件注册的命令子命令作用create从 IPSWmacOS或裸盘Linux创建新 VMclone克隆远程或本地 VM支持--stacked、--insecure、--concurrencyrun运行 VM图形窗口或无头模式set/get修改 / 读取 VM 配置list列出本地与 OCI 缓存中的 VMlogin/logout管理注册表凭据ip查询运行中 VM 的 IP 地址exec在运行中的 VM 内执行命令pull/push从 / 向 OCI 注册表拉取、推送镜像import/export导入 / 导出 VM归档prune回收磁盘空间rename/delete重命名 / 删除 VMstop/suspend停止 / 挂起 VMsuspend仅在 macOS 14 注册见 Root.swiftfqn输出 VM 的完全限定名称其中list支持--source local|oci、--format text|json与--quiet等参数见 List.swift便于 CI 脚本以 JSON 解析 VM 状态。Root.swift还为每个命令自动创建 OpenTelemetry root span 并记录命令行参数这意味着每个命令都可以接入可观测性系统Root.swift。VM 镜像生态现成的 macOS 与 Linux 镜像除了自己从零创建镜像Tart 社区提供了大量开箱即用的预构建镜像见 docs/quick-start.md 的 VM images 一节。macOS 侧覆盖从 Monterey 到 Tahoe 的多个大版本每个版本通常有三种变体vanilla纯净安装无额外工具base含基础开发工具如 Git、编译器等xcode内置特定版本 Xcode适合 iOS/macOS 构建。例如ghcr.io/cirruslabs/macos-tahoe-base:latest、ghcr.io/cirruslabs/macos-sequoia-xcode:latest等。Linux 侧则有Ubuntughcr.io/cirruslabs/ubuntu:latestDebianghcr.io/cirruslabs/debian:latestFedoraghcr.io/cirruslabs/fedora:latest这些 Linux 镜像默认磁盘只有 20 GB文档建议克隆后立即扩容用tart set调整--disk-sizetart clone ghcr.io/cirruslabs/ubuntu:latest ubuntu tart set ubuntu --disk-size 50 tart run ubuntu所有预构建镜像的默认登录凭据统一为用户名admin、密码admin同时适用于 GUI、Linux 控制台与 SSH。SSH 访问与脚本执行VM 运行后用tart ip拿到地址即可 SSH 进入ssh admin$(tart ip tahoe-base)在 CI 流水线中推荐配合 Cirrus CLI 在 Tart VM 内运行脚本并取回产物详见 Cirrus CLI 集成指南不使用 Cirrus CLI 时也可以直接用 sshpass 组合brew install cirruslabs/cli/sshpass sshpass -p admin ssh -o StrictHostKeyChecking no -o UserKnownHostsFile/dev/null admin$(tart ip tahoe-base) uname -a sshpass -p admin ssh -o StrictHostKeyChecking no -o UserKnownHostsFile/dev/null admin$(tart ip tahoe-base) script.sh从零创建自己的 VM 镜像macOS 镜像Tart 可直接从 Apple 的*.ipsw固件文件创建 VM--from-ipswlatest会自动下载最新版本tart create --from-ipswlatest tahoe-vanilla tart run tahoe-vanilla首次启动后需手动完成 macOS 图形安装流程文档建议创建admin/admin用户、开启自动登录与 Remote LoginSSH、关闭锁屏与屏保并执行sudo visudo为admin添加NOPASSWD权限方便 CI 免密执行 sudo。Linux 镜像先创建裸 VM再挂载 ISO 安装Linux 支持要求宿主为 macOS 13# Create a bare VM tart create --linux ubuntu # Install Ubuntu tart run --disk focal-desktop-arm64.iso ubuntu # Run VM tart run ubuntu安装完成后在 VM 内启用 SSHsudo apt update sudo apt install -y openssh-server sudo ufw allow ssh创建后的默认资源配置为2 核 CPU、4 GB 内存、1024x768 显示docs/quick-start.md Configuring a VM 一节均可用tart set调整。深入 OCI把虚拟机像容器一样推拉到任意注册表Tart 的 OCI 能力是它与众不同的核心。需要先明确一个边界Tart 只能运行由 Tart 创建并推送的镜像Docker 等容器引擎构建的镜像无法被tart pull后直接运行docs/quick-start.md Working with a Remote OCI Container Registry。这背后是 Tart 自定义的 OCI artifact 格式含 disk 层、NVRAM、config 等其 manifest 解析逻辑在 Manifest.swift镜像引用语法host/namespace:tag 或 digest由 ANTLR 文法 Reference.g4 生成解析器实现。注册表认证从 401 到 Bearer Token 的完整链路Tart 的认证流程完整实现了 OCI 分布式规范中的 token 认证Registry.swift首次请求未携带凭据注册表返回 HTTP 401 及WWW-Authenticate头解析该头解析器见 WWWAuthenticate.swift对应测试见 WWWAuthenticateTests.swift识别basic或bearer认证方案对bearer方案携带realm、scope、service参数向认证服务器请求 tokenTokenResponse支持token/access_token、expires_in、issued_at字段并缓存到AuthenticationKeepertoken 默认按 60 秒有效期兜底计算见 Registry.swift之后所有请求携带Authorization: Bearer token并附带User-Agent: Tart/version (os; model)。凭据的获取遵循多级供应商链Registry.swiftEnvironmentCredentialsProvider读取TART_REGISTRY_USERNAME/TART_REGISTRY_PASSWORD环境变量可用TART_REGISTRY_HOSTNAME限定只对特定注册表生效DockerConfigCredentialsProvider读取~/.docker/config.json兼容 Docker 凭据助手KeychainCredentialsProvider由tart login写入 macOS 钥匙串。对应地tart login支持 OAuth 场景文档提示用访问令牌作为密码tart logout用于清除凭据。凭据相关的测试覆盖见 DockerConfigTests.swift 与 TokenResponseTests.swift。push一次推送多个 tag 与分块上传tart push支持一条命令同时打多个标签tart push my-local-vm-name acme.io/remoteorg/name:latest acme.io/remoteorg/name:v1.0.0源码层面Push.swift会按host namespace把目标引用分组然后对每组逐个推送。推送前会尝试对本地 VM 目录加锁若 VM 正在运行则拒绝推送VMIsRunning错误从源头避免推送不一致的镜像。两个值得注意的参数--chunk-size默认采用整体上传monolithic方式但部分注册表支持更高效的分块上传——AWS ECR 要求块大于 5 MB、GHCR 要求块小于 4 MB、GCR 不支持分块见 Push.swift 的说明。对应实现是Registry.pushBlob中的PATCH续传PUT收尾分块流程Registry.swift--label keyvalue可为 OCI 镜像配置附加自定义元数据可多次指定。当推送对象本身是缓存中的远程镜像时Tart 还会走一条lightweight push 快路径只把已存在的 registry manifest 复制到新 tag而不再上传 config、disk、NVRAMPush.swift。pull / clone缓存命中、去重与并发拉取tart pull与tart cloneclone 在本地无缓存时会隐式调用 pull共享底层存储逻辑 VMStorageOCI.swift。其拉取流程pull方法包含多个工程细节按 digest 去重拉取 manifest 后以其内容 digestsha256:作为最终缓存目录名tag 只是指向 digest 目录的符号链接VMStorageOCI.swift因此同一镜像的多个 tag 在本地只存一份宿主级文件锁以 host 目录为锁对象防止同一注册表并发拉取互相踩踏FileLock实现见 FileLock.swift断点续传pullBlob通过Range: bytesstart-请求头实现期待 HTTP 206 响应Registry.swift失败重试对URLError自动重试最多 5 次VMStorageOCI.swift层去重LocalLayerCache拉取前扫描本地已有的独立镜像若与目标 manifest 存在超过 1 GB 的公共层则复用本地层文件避免重复下载只有显式--deduplicate时才真正在本地重建去重镜像VMStorageOCI.swift空间预回收根据 manifest 预估所需磁盘提前触发Prune.reclaimIfNeeded以保证拉取中途不会写满磁盘。Stacked Disk不可变基础镜像 独立写入层在 macOS 27 或更新版本上tart clone --stacked可以创建一种特殊的栈式磁盘虚拟机远程独立镜像作为不可变基础本地只保存自己的写入覆盖层tart clone --stacked ghcr.io/cirruslabs/macos-tahoe-base my-local-vm-name这种模式由 DiskImageStack.swift 与 Layerizer 支撑显著节约磁盘与网络同一条镜像谱系lineage中拉取新镜像时已在内容存储ContentStore中的不可变磁盘文件会被直接复用VMStorageOCI.swift。当前--stacked仅支持 macOS 镜像且不能以已含栈式盘的镜像为基础Clone.swift。tart run 详解图形、网络、目录共享与设备参数tart run是参数最丰富的子命令Run.swift以下按场景分类梳理。无头模式与远程访问--no-graphics不打开 UI 窗口适合 CI配合tart ip获取地址后 SSH/VNC 进入--serial/--serial-path打开串行控制台/dev/ttySXX或挂接外部串口常用于调试 Linux 内核--vnc使用 macOS 屏幕共享Screen Sharing代替内置 UI支持复制粘贴、拖拽前提是 VM 内已开启 Remote Login--vnc-experimental使用 Virtualization.Framework 自带的 VNC server在恢复模式与 macOS 安装阶段也可用实验特性--recoverymacOS 14直接启动到恢复模式--graphics即使配置了 VNC 也强制打开 UI 窗口。网络模式共享、桥接、Softnet 与端口转发Tart 默认使用 vmnet 共享NAT网络NetworkShared见 NetworkShared.swift其余模式通过互斥校验Run.swift保证只能二选一参数说明--net-bridgedinterface桥接到宿主物理接口如en0、Wi-Fi可用--net-bridgedlist列出可用接口NetworkBridged.swift--net-softnet启用 Softnet 用户态网络隔离VM 只能从自己的 MAC/IP 发包、只能访问全局可路由 IPv4 与网桥网关可防 ARP 欺骗等同时把 DHCP 租约从默认 86400 秒缩短到 600 秒适配大量短命 VM 场景Softnet.swift--net-softnet-allowCIDR放行额外网段如10.0.0.0/16最长前缀优先0.0.0.0/0可完全关闭目的地址限制--net-softnet-blockCIDR收紧限制如0.0.0.0/0建立默认拒绝策略allow 与 block 冲突时 block 优先--net-softnet-exposeext:int,...端口转发如2222:22,8080:80把宿主出口网卡上的端口转发到 VM 内端口--net-softnet-control-fdfd通过继承的 Unix socket 文件描述符动态更新 Softnet 的 allow/block 列表对应测试见 SoftnetControlFDTests.swift--net-host仅主机host-only网络以上网络参数在代码中会自动联动指定allow/block/expose/control-fd任一参数即隐含启用--net-softnetRun.swift。目录共享与附加磁盘目录共享语法为[name:]path[:options]例如tart run --dirproject:~/src/project vm # 读写挂载 tart run --dirproject:~/src/project:ro vm # 只读挂载 tart run --dirwww1:~/project1/www --dirwww2:~/project2/www # 多目录挂载默认使用com.apple.virtio-fs.automount标签macOS 客户机自动挂载到/Volumes/My Shared FilesLinux 客户机需手动mount -t virtiofs com.apple.virtio-fs.automount /mnt/shared可写入/etc/fstab实现开机自挂载可用tagTAG覆盖挂载标签多目录共用同一标签时要求每个目录都命名宿主与 macOS 客户机均需 macOS 13要求 Linux 客户机侧实现细节见 DirecotryShareTests.swift 的覆盖场景。附加磁盘语法为path[:options]Run.swifttart run --diskubuntu.iso:ro vm # 只读挂载 ISO tart run --disk/dev/disk0 vm # 挂载块设备需先 chown 授权 tart run --disk ghcr.io/cirruslabs/xcode:16.0:ro vm # 挂载远程 VM 的磁盘 tart run --disknbd://localhost:10809/myDisk:syncnone vm # NBD 网络块设备注意如果挂载的是 x86 架构的amd64ISOTart 会直接报错提示改用 arm64 版本。其余实用开关--rosettatag给 Linux 客户机挂载 Rosetta 共享使其能运行 Intel 二进制宿主需 macOS 13 且安装 Rosetta--nested嵌套虚拟化要求宿主 macOS 15 且为 M3 及更新芯片校验见 Run.swift--suspendable启用可挂起模式仅 macOS 客户机配合tart suspend使用要求宿主 macOS 14--no-audio/--no-clipboard/--no-trackpad/--no-pointer/--no-keyboard/--capture-system-keys逐项禁用或调整输入输出设备--provisioning-opts在 macOS 27 上于首次启动时自动配置客户机fullName、username、password、logsInAutomatically、enablesRemoteLogin。本地存储、缓存与磁盘管理所有本地数据集中存放在~/.tart下可用TART_HOME环境变量覆盖见 Config.swift目录用途~/.tart/本地 VM 主目录每个 VM 一个子目录含config.json、disk.img、nvram.bin等~/.tart/cache/OCIs/OCI 镜像缓存host/namespace/referencetag 为符号链接、digest 为实体目录~/.tart/tmp/临时目录每个命令执行前会先做垃圾回收见 Root.swift磁盘空间管理由三部分构成tart prune显式回收本地 VM 或缓存镜像实现见 Prune.swift 与 Prunable.swift自动 GCVMStorageOCI.gc()会清理指向已删除 digest 的 tag 符号链接、无引用且非显式拉取的 digest 缓存以及内容存储ContentStore中无引用的不可变文件VMStorageOCI.swift访问时间AccessDate缓存条目按访问时间排序、最久未用者优先被清理相关工具见 URLAccessDate.swift。此外Tart 还提供tart export/tart import归档导出导入见 VMDirectoryArchive.swift与tart rename、tart delete等管理命令覆盖 VM 全生命周期。面向 CI 的集成生态README 强调轻松集成任何 CI 系统仓库中 docs/integrations/ 目录给出了多份实操指南Cirrus CLI推荐的在 Tart VM 内运行脚本、取回产物的方式GitLab Runner 与 Buildkite把 Tart VM 作为自定义执行器接入流水线Packer使用 Tart Packer Plugin 自动化构建镜像对应 README 的亮点之一。配合无头模式--no-graphics、JSON 输出tart list --format json、环境变量凭据TART_REGISTRY_*以及tart ip/tart execTart 可以完全无交互地嵌入 CI agent。仓库的 integration-tests/ 目录如 test_run.py、test_clone.py、test_oci.py以及 benchmark/ 目录含基于 fio 的磁盘基准与 Xcode 构建基准见 benchmark/README.md进一步展示了面向 CI 场景的验证与性能测量实践可作为团队自建 Runner 时的参考。小结从 README.md 的定位出发Tart 本质上是一条虚拟机即 OCI 制品的自动化链路Virtualization.Framework提供接近原生的执行能力OCI 注册表提供跨机器的分发与缓存简洁的 CLIclone→run→ip→exec则让它能无缝嵌入任何 CI 流水线。无论你是想在本地快速跑一个 macOS 构建机还是为 GitHub Actions / GitLab CI 自建 Apple Silicon Runner 池都可以从brew install openai/tools/tart这条命令开始再依据本文的命令与参数清单逐步深入。【免费下载链接】tartmacOS and Linux VMs on Apple Silicon to use in CI and other automations项目地址: https://gitcode.com/GitHub_Trending/ta/tart创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考