跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

Barn 文档

安装 Barn 1.2.0,创建第一台 Linux 或 macOS 虚拟机,并按任务查找指南与参考手册。

Barn 为开发和测试提供本地虚拟机。本文档对应 Barn 1.2.0,1.2.0 发布说明汇总了相对 1.1.0 的变化。请按任务选择入口:

  • 安装 Barn 1.2.0 — 在 macOS 或 Linux 上通过 Homebrew、发布安装脚本或原生软件包安装 CLI。
  • Linux 快速上手 — 在 macOS(HVF)或 Linux(KVM)上基于 Ansible YAML 清单启动单节点或多节点固定 IP 实验集群。
  • 原生 macOS 虚拟机 — 在 Apple Silicon 上运行相互隔离的 macOS 27+ 虚拟机,提供原生桌面窗口、SSH、VirtioFS 共享目录与剪贴板同步。

逐命令用法、全部选项与示例见命令参考;相对 1.1.0 的新增选项见版本基线。

常见任务

  • 日常操作 — 查看状态、启停节点、通过 plan 预览配置变更,以及重建或销毁虚拟机。
  • 存储与服务访问 — 挂载持久化测试数据盘、配置 Virtio-9p 宿主共享目录与访问客机端口。
  • 镜像与仓库 — 从 9 个 Linux 发行版系中选择镜像、更新镜像目录或导入自定义 qcow2 镜像。
  • 脚本与自动化 — 使用 --yes、--json 与结构化退出码在脚本或 CI 中驱动 Barn。
  • 故障排查 — 使用 barn doctor 诊断宿主就绪状态、网络、SSH 与中断的生命周期操作。
  • 1.2.0 版本更新 — 了解规格覆盖、根盘扩容、并发、服务名与升级步骤。

按栏目浏览

1 - 使用指南

安装 Barn,启动 Linux 或 macOS 虚拟机,再按需管理机器、文件、镜像与自动化。

本章节指南面向 Barn 1.2.0;变更内容与从 1.1.0 升级的步骤见 Barn 1.2.0 发布说明。你可以在同一台 Apple Silicon Mac 上同时使用 Linux 实验环境与 macOS 虚拟机,两套流程在 ~/.barn 下各自独立管理虚拟机。

快速上手

  • 安装 Barn — 在 macOS 或 Linux 上安装稳定版 CLI,核对宿主软硬件要求并了解版本升级方式。
  • Linux 快速上手 — 启动单节点 Ubuntu 24.04 虚拟机,通过 SSH 登录,并用一份 barn.yml 扩展为多节点固定 IP 实验环境。
  • macOS 虚拟机 — 在 Apple Silicon 上创建和管理 macOS 27 虚拟机,使用原生桌面、SSH、共享目录与剪贴板同步。

Linux 实验环境日常运维

  • 日常管理 — 查看状态、启停节点、用 plan 预览清单差异,以及按需执行 recreate 或 destroy。
  • 存储与访问 — 配置持久测试数据盘、通过 SSH 传输文件与转发端口,或挂载 Virtio-9p 宿主共享目录。
  • 镜像仓库 — 选择 9 大发行版家族镜像、切换中国镜像站、构建静态镜像仓库或导入本地 qcow2 镜像。
  • 自动化 — 执行无人值守宿主初始化、用 jq 校验 --json 结果、通过 barn provision 批量运行脚本并配合 Pigsty 使用。

故障排查、源码构建与清理

  • 故障排查 — 针对宿主依赖、私网修复、客机阶段警告、SSH 密钥与中断恢复的排查手册。
  • 从源码构建 — 从 v1.2.0 标签编译 CLI、barn-hosts-helper 与原生应用包 Barn.app,并运行贡献者检查。
  • 卸载与清理 — 按序销毁 Linux 与 macOS 虚拟机、清理镜像缓存、卸载宿主网络并移除 Barn 程序。

1.1 - 下载与安装 Barn

在 macOS 或 Linux 上安装 Barn 1.2.0,检查系统要求,并了解升级方式。

Barn 1.2.0 提供 macOS 与 Linux 的 arm64 和 amd64 归档包,以及 Linux DEB 和 RPM 软件包。请始终以普通 Unix 用户身份运行 barn;安装完成后,可继续阅读 Linux 快速上手或 macOS 虚拟机教程。

说明

Barn 1.2.0 是当前稳定版,通过 GitHub 正式发布频道发布:releases/latest、不带 BARN_VERSION 的安装脚本与 Homebrew 配方都会选择此版本;需要固定版本时设置 BARN_VERSION=1.2.0。Apple Silicon 归档包含配套的 barn、barn-hosts-helper 与 macOS 原生应用包 Barn.app,均经过 Developer ID 签名与 Apple 公证。只有从源码构建时才需要 Go 和 Xcode。

组件 用途 1.2.0 发行包是否包含
barn 管理 Linux 实验环境与 macOS 虚拟机生命周期的 Go CLI 四种平台归档及 Linux 软件包均包含
barn-hosts-helper 负责 /etc/hosts 主机名集成的受限辅助程序 与同版本 CLI 配套打包
Barn.app 基于 Virtualization.framework 的原生运行器与 macOS 客机桌面 Darwin arm64 归档与 Apple Silicon Homebrew 安装包含;仅 macOS 客机需要

安装发行版本

运行 Barn 的电脑称为 宿主。请按宿主操作系统选择安装方式:macOS 推荐使用 Homebrew,Linux 推荐使用安装脚本。

在普通用户终端中使用 Homebrew 安装 Barn 及 QEMU 依赖:

brew install pgsty/infra/barn
barn version

在 Apple Silicon 上,Homebrew Formula 还会将 Barn.app 安装至 libexec,CLI 会自动找到它。macOS 27+ 用户可运行 barn mac doctor,随后按 Mac 指南创建客机。Intel Mac 使用 CLI 与 helper 运行 Linux 客机。

下载并运行 install.sh。未设置 BARN_VERSION 时,脚本安装最新稳定版;设置 BARN_VERSION=1.2.0 可固定为本版本。脚本会自动识别 amd64 或 arm64 架构,校验归档 SHA-256,并将 CLI 与配套的 barn-hosts-helper 安装到 ~/.local/bin(无需 sudo):

curl -fLO https://github.com/pgsty/barn/releases/latest/download/install.sh
bash install.sh
export PATH="$HOME/.local/bin:$PATH"
barn version

请将 export PATH="$HOME/.local/bin:$PATH" 加入 ~/.bashrc 或 ~/.zshrc 等 Shell 启动文件,并保留 .barn-releases/ 下的版本化目录结构。如果你在 macOS 上不想使用 Homebrew,也可以直接运行这段安装命令,后续再通过 barn setup 配置 QEMU 与宿主网络依赖。

首次交互式执行 barn up 时,Barn 会检查 Linux 客机所需的宿主依赖与私有网络,展示宿主准备计划,并在安装任何内容前询问一次;只有具体步骤需要时才请求管理员权限(sudo)。没有终端时,barn up 只报告缺少的条件,无人值守准备请执行 barn setup --yes。你也可以先运行 barn setup --dry-run 预览宿主准备计划。

系统要求

客机 宿主 运行时依赖
Linux macOS(Apple Silicon 或 Intel) QEMU 8.2.1+、HVF
Linux Linux(arm64 或 amd64) QEMU 6.2+、可用的 KVM、NetworkManager 或 systemd-networkd
macOS 27 Apple Silicon、macOS 27+、已登录图形桌面会话 原生应用包 Barn.app(无需 QEMU)

一台默认规格的 Linux 虚拟机分配 1 vCPU 与 2 GiB 内存,搭配按需增长的 qcow2 稀疏磁盘(64 GiB 根盘与 128 GiB 测试数据盘)。

首次创建 macOS 虚拟机约需 65 GiB 可用磁盘空间,用于存放 Apple 恢复镜像(约 25 GiB)、已安装的基础镜像(约 27 GiB)以及初始写入数据。Mac 虚拟机默认分配 4 vCPU、8 GiB 内存和 100 GiB APFS 克隆磁盘;后续新建虚拟机除非通过 --disk 另行指定,否则默认沿用已有基础镜像的磁盘容量。各客机的具体约束见平台与限制。

下载 Barn 1.2.0

正式版发布于 2026-11-12,请按宿主系统与处理器架构选择文件:

宿主系统 架构 归档 Debian / Ubuntu RHEL / Fedora
macOS Apple Silicon (arm64) tar.gz — —
macOS Intel (amd64) tar.gz — —
Linux x86-64 (amd64) tar.gz DEB RPM
Linux ARM64 (arm64) tar.gz DEB RPM

SHA-256 校验表 · 发行元数据 · 安装脚本

每个归档和软件包均提供同名的 .spdx.json 依赖清单,见 GitHub Release。Darwin arm64 归档包含签名并公证的 Barn.app。

其他安装方式

Linux 软件包

DEB 与 RPM 软件包已声明 QEMU、UEFI 固件和 OpenSSH 依赖。ARM64 宿主请将文件名中的 amd64 替换为 arm64:

Debian / Ubuntu
barn_release=https://github.com/pgsty/barn/releases/download/v1.2.0
curl -fLO "$barn_release/barn_1.2.0_linux_amd64.deb"
curl -fLO "$barn_release/checksums.txt"
sha256sum --check --ignore-missing checksums.txt
sudo apt install ./barn_1.2.0_linux_amd64.deb
barn version
RHEL / Fedora
barn_release=https://github.com/pgsty/barn/releases/download/v1.2.0
curl -fLO "$barn_release/barn_1.2.0_linux_amd64.rpm"
curl -fLO "$barn_release/checksums.txt"
sha256sum --check --ignore-missing checksums.txt
sudo dnf install ./barn_1.2.0_linux_amd64.rpm
barn version

手动安装归档

从 GitHub Barn 1.2.0 发布页下载对应宿主系统的 barn_1.2.0_<os>_<arch>.tar.gz(darwin 或 linux,arm64 或 amd64)与 checksums.txt,解压前先校验 SHA-256:

barn_release=https://github.com/pgsty/barn/releases/download/v1.2.0
curl -fLO "$barn_release/barn_1.2.0_darwin_arm64.tar.gz"
curl -fLO "$barn_release/checksums.txt"
shasum -a 256 -c checksums.txt --ignore-missing

校验通过后解压归档,将其中的 bin/ 目录加入 PATH。请保持发行包目录结构完整:barn 与 barn-hosts-helper 必须配套,Darwin arm64 归档还包含 bin/Barn.app。CLI 调用 helper 前会核对其内嵌的 SHA-256 摘要,并自动发现旁边的 App。

从源码构建

如需参与开发或自行编译 macOS 原生应用包 Barn.app,请参阅从源码构建。

升级 Barn

从 1.1.0 升级到 1.2.0 会保留 ~/.barn 下的虚拟机磁盘、SSH 密钥、状态和配置。先停止正在运行的 Mac 虚拟机,再通过原安装渠道一起替换 CLI、barn-hosts-helper 与 Barn.app。未指定 CPU/内存的 Linux 清单现在默认使用 1 vCPU / 2 GiB;如需保留旧默认值,请显式设置 vm_cpu: 2、vm_mem: 4GiB 并检查 barn plan。已应用 VM 的资源会保留到显式执行资源变更操作为止。详见 1.2.0 发布说明。

请沿用最初的安装方式执行升级。macOS Homebrew 用户可直接运行:

brew update
brew upgrade pgsty/infra/barn
command -v barn
barn version

Linux 用户可重新运行 install.sh(未设置 BARN_VERSION 时选择最新稳定版),或安装新版 .deb / .rpm 软件包,随后通过 command -v barn 和 barn version 确认当前生效的二进制路径。 若用户目录和系统包/Homebrew 中都安装了 Barn,请更新当前 PATH 选中的安装,或调整 PATH 后再次核验版本。

Barn 将程序升级与客机镜像更新解耦,避免升级工具时意外改动现有虚拟机的系统版本:

更新对象 命令 对现有虚拟机的影响
Barn CLI、helper 与随包 App 重新安装或 brew upgrade 保留所有现有虚拟机磁盘与状态
Linux 镜像目录 barn update(或 barn update --mirror) 仅对新建或显式 recreate 的节点生效
macOS 基础镜像 barn mac image update 准备新基础镜像;已有虚拟机需执行 barn mac recreate NAME --update 才会切换

如遇下载代理或 PATH 问题,请参阅故障排查;如需移除程序与宿主状态,请参阅卸载与清理。

1.2 - Linux 快速上手

启动 Ubuntu 虚拟机,通过 SSH 连接,再用同一份主机清单扩展为固定 IP 的 Linux 实验环境。

在 Mac 或 Linux 宿主上创建一台 Ubuntu 24.04 虚拟机,通过 SSH 登录,再用同一份 YAML 清单扩展为多节点固定 IP 实验环境。如需在 Apple Silicon 上运行 macOS 客机,请阅读 macOS 虚拟机教程。

本教程使用 Barn 1.2.0,默认每节点 1 vCPU、2 GiB;可在清单中显式设置资源,详见配置默认值。

开始之前

安装 Barn,并确保宿主至少预留 2 GiB 可用内存供客机使用。请在交互式终端中以普通用户执行下面的命令:Barn 改动宿主前会询问一次,只有需要管理员权限的步骤才会提示输入 sudo 密码。CI 等无人值守场景请参阅自动化指南。在中国大陆,可以在首次 barn up 时加上 --mirror,从中国官方仓库 repo.pigsty.cc 下载镜像。

首次启动前定制配置

默认实验环境只有一个 Ubuntu 节点,架构跟随宿主:Apple Silicon 为 arm64,Intel/AMD 为 amd64。日常使用无需指定架构;跨架构选择与覆盖优先级见镜像与架构配置。保持默认即可直接跳到启动并连接。如果希望先自定义拓扑、网段或操作系统镜像,请在首次 barn up 之前生成并编辑清单:

  1. 生成初始配置文件(dual、trio、full 分别生成 2、3、4 节点模板,-c 10.20.30.0/24 指定网段,-I el9 为所有节点写入同一个镜像,-A amd64 设置 vm_arch):

    mkdir -p ~/barn-lab && cd ~/barn-lab
    barn init
  2. 编辑 barn.yml,调整镜像或硬件资源:

    barn.yml
    all:
      vars:
        admin_ip: 10.10.10.10
        vm_image: u24
        vm_cpu: 1
        vm_mem: 2GiB
      children:
        nodes:
          hosts:
            10.10.10.10: { nodename: meta }
  3. 校验 YAML 并预览变更计划:

    barn validate
    barn plan

barn validate 和 barn plan 无需安装 QEMU 或配置宿主网络即可运行,下一节的 barn up 会直接使用这份 barn.yml。完整配置字段见配置参考。

启动并连接

mkdir -p ~/barn-lab && cd ~/barn-lab
barn up

首次运行且既没有配置文件也没有已有部署时,barn up 会在改动任何东西之前打印一份简短的准备计划,只列出适用的行:dependencies 列出缺少的软件包(QEMU、UEFI 固件、OpenSSH)及所用的包管理器,network 给出要准备的固定 IP 网段,config 给出将要写入的单节点 barn.yml,sudo 说明哪些步骤需要 root 权限。在已经装有 QEMU 的宿主上,计划如下:

ITEM     STATE    MESSAGE
network  planned  prepare 10.10.10.0/24
config   planned  create /home/alice/barn-lab/barn.yml
sudo: network (root-owned barn0 bridge)
Continue with this setup? [Y/n]

确认一次后,sudo 可能会要求输入密码。随后 Barn 会下载并校验基础镜像,在终端中实时刷新进度表,等待 SSH 就绪:

NAME  ADDRESS      STATE  MESSAGE
meta  10.10.10.10  ready  SSH ready: barn ssh meta
boot 1/1 nodes: 39s [DONE]

如果 barn up 报错退出,先运行 barn doctor 检查宿主,再用 barn logs meta 查看客机控制台输出,修复问题后重新运行 barn up。常见故障见故障排查。

登录客机:

barn ssh

barn ssh 会使用部署密钥以管理员用户 dba 登录客机,支持免密 sudo。barn up 同时会安装 SSH 别名,所以直接运行 ssh meta 也能登录。输入 exit 退回宿主终端,后面的命令都在宿主上执行。

默认配置 值
节点与地址 meta(10.10.10.10)
镜像 Ubuntu 24.04(u24:stable,与宿主架构一致)
CPU 与内存 1 vCPU、2 GiB
磁盘 64 GiB 根盘写时复制层,以及挂载到 /data 的 128 GiB 测试数据盘

两块磁盘均为按需增长的 qcow2 稀疏文件。如果默认网段 10.10.10.0/24 与本机现有路由冲突,首次 setup 会为未修改过的默认模板自动选择另一个空闲的私有 /24 网段——实际分配的地址以生成的 barn.yml 和 barn status 为准。

说明

每个 BARN_HOME 对应唯一一套 Linux 部署:Barn 默认将 Linux 实验环境的状态保存在 BARN_HOME(即 ~/.barn)下。切换工作目录不会创建第二套实验环境;在没有清单文件的目录中运行 barn up 会直接恢复现有部署。设计背景详见一套部署,没有项目概念。

查看并使用虚拟机

barn status
NAME  ADDRESS      STATE    IMAGE             SPEC  ROOT
meta  10.10.10.10  running  u24@20261017.0.1  1c2g  64 GiB

barn status 列出每个节点的固定地址、记录的状态、镜像版本与规格。在宿主上执行客机命令时,用 -- 隔开远程命令:

barn exec meta -- hostname
barn exec meta -- df -h / /data

barn up 会确认管理 SSH 可用,并报告数据盘、私网等客机阶段是否存在功能限制。修复问题或初始化被中断后,重新运行 barn up 即可继续收敛,已处于健康状态的虚拟机不会重启。

警告

数据盘属于可丢弃的测试存储。在客机恢复期间,若文件系统检查工具报告 ext4 或 XFS 数据盘存在可识别的损坏,barn up 会将其重置(持久数据盘同样如此)。重要数据请保存在宿主上,磁盘保留与恢复边界详见存储与访问。

扩容为多节点环境

要把实验环境扩展为四个节点(按默认每节点 2 GiB 计算共需 8 GiB 客机内存),在现有 barn.yml 的 all.children.nodes.hosts 下追加三个节点。新地址需要与 meta 位于同一个 /24;如果首次运行时 Barn 改选了其他网段,请使用那个网段:

barn.yml
all:
  vars:
    admin_ip: 10.10.10.10
  children:
    nodes:
      hosts:
        10.10.10.10: { nodename: meta }
        10.10.10.11: { nodename: node-1 }   # 新增
        10.10.10.12: { nodename: node-2 }   # 新增
        10.10.10.13: { nodename: node-3 }   # 新增

预览差异并拉起新增节点:

barn plan
barn up

barn plan 会输出 create: node-1, node-2, node-3,随后 barn up 会在不重启 meta 的前提下创建这三个节点。

如果修改了已有节点的 CPU 或内存,执行 barn resize <node> 即可应用,并保留虚拟机身份与磁盘;镜像变更仍需执行 barn recreate <node>,这会替换该节点的根盘。从 barn.yml 中删除节点条目不会自动销毁虚拟机,需显式运行 barn destroy <node>。

停止、恢复与清理

barn stop
barn start

stop 与 start 都会保留虚拟机磁盘。不再需要实验环境时,运行 barn destroy 并输入 destroy 确认。Barn 会删除虚拟机及其根盘与非持久数据盘,移除部署状态和它安装的 SSH 别名,同时保留持久数据盘、部署密钥、基础镜像缓存与宿主网络。之后在 ~/barn-lab 中再次运行 barn up,就会根据 barn.yml 重建一套新的实验环境。如需彻底移除所有残留文件,请参阅卸载与清理。

接下来

  • 日常管理 — 查看日志、重启节点、应用配置变更与销毁虚拟机。
  • 存储与访问 — 配置持久数据盘、通过 OpenSSH 传输文件并访问客机端口。
  • 镜像仓库 — 选择 Debian、Rocky Linux、Ubuntu 或导入本地 qcow2 镜像。
  • 自动化 — 无人值守 setup --yes、解析 --json 输出、执行客机脚本,以及与 Pigsty 共用 pigsty.yml。

1.3 - macOS 虚拟机

用 barn mac 在 Apple 芯片 Mac 上运行 macOS 27 虚拟机:创建、连接、共享文件与剪贴板,以及清理。

barn mac 用于在 Apple Silicon Mac 上创建和管理可随时重建的 macOS 虚拟机,适合编译构建、自动化测试以及复现 macOS 专属问题。每台虚拟机自带管理员账号、免密 sudo、固定绑定的 SSH 密钥与独立私网地址,基于 Apple Virtualization 框架直接以当前用户身份运行,全程无需 sudo。

Mac 虚拟机与 Linux 实验环境完全独立:它不读取 barn.yml,所有数据保存在 $BARN_HOME/mac(默认 ~/.barn/mac)下,执行 Linux 的 barn destroy 或 barn purge 不会影响任何 Mac 虚拟机。

前提条件

  • 一台运行 macOS 27 或更高版本 的 Apple Silicon Mac,且当前用户已登录图形桌面会话(客机同样运行 macOS 27)。
  • 首次创建约需 65 GiB 可用磁盘空间,用于存放从 Apple 下载的恢复镜像(.ipsw,约 25 GiB)、安装后的基础镜像(约 27 GiB)以及启动写入空间。后续每台虚拟机通过 APFS 写时复制克隆基础镜像,按实际改动增长(默认容量上限为 100 GiB)。
  • 与同一版本 CLI 配套的原生应用包 Barn.app,Apple Silicon 发行包与 Homebrew 安装均已包含。
  • 无需 sudo 权限。

受 Apple Virtualization 框架限制,单台 Mac 最多同时运行两台 macOS 虚拟机(其他虚拟化工具启动的实例及正在执行的 macOS 基础镜像安装均计入配额)。你可以创建更多已停止的虚拟机并按需启动其中任意两台(须遵守适用的 Apple 软件许可协议)。

安装

通过 Homebrew 安装预编译发行版:

brew install pgsty/infra/barn
barn version
barn mac doctor

Homebrew 会一并安装经过签名、公证的 Barn.app 及配套 CLI/helper,无需安装 Go 或 Xcode。Apple Silicon 的安装脚本与手动归档同样包含原生 App。升级或替换 App 前请先停止运行中的 Mac 虚拟机。

如需开发 Barn 本身,请参阅构建 Mac 原生组件。

创建第一台机器

barn mac up

如果本机尚未准备 macOS 基础镜像,barn mac up 会先列出下载体积与磁盘空间并请求确认:

info: macOS 27.0 (26A428) is not prepared on this Mac yet.
download:  24.8 GiB from Apple (updates.cdn-apple.com)
then:      install macOS once into a reusable base (about 20 minutes)
free:      551.2 GiB
Download macOS from Apple now? [Y/n]

确认后,Barn 会依次完成以下三步:

  1. 从 Apple 官方(updates.cdn-apple.com)下载恢复镜像,支持断点续传并自动核对 Apple 公布的 SHA-256 校验值。
  2. 一次性安装 macOS 基础镜像,生成一份未启动过的干净母盘(安装期间会临时占用两个运行配额之一)。
  3. 通过 APFS 写时复制克隆出 mac1,启动客机并自动配置同名管理员账号,等待 SSH 与免密 sudo 就绪。
NAME  ADDRESS      STATE    MESSAGE
mac1  10.10.20.10  running  created and ready; macOS 27.0 (26A428), user alice
ready: barn mac ssh mac1
desktop: barn mac open mac1

后续新建虚拟机都会直接克隆这份基础镜像,几秒内即可完成创建,无需重复执行漫长的系统恢复安装。Barn 首次下载默认固定为 macOS 27.0 (26A428);如需跟进更新的 macOS 27 版本,可显式运行 barn mac image update。

如果本机已下载好 Apple 恢复镜像,可通过 --ipsw 直接传入(位于同一 APFS 卷时将直接克隆数据块而无需复制):

barn mac up --ipsw ~/Downloads/UniversalMac_27.0_26A428_Restore.ipsw

在无终端脚本中,需传入 --yes 才会自动下载 25 GiB 镜像;也可使用 barn mac setup 提前准备基础镜像而不创建虚拟机。如果创建新虚拟机时传入了 --no-wait(虚拟机进程启动即返回),在使用 ssh 或 exec 前请再执行一次不带 --no-wait 的 barn mac up NAME 以完成密钥与 sudo 初始化。

使用机器

终端与命令

barn mac ssh                                  # 进入交互式终端
barn mac exec -- sw_vers                      # 直接执行单个程序
barn mac ssh -- 'id; sudo -n true && echo sudo works'
ProductName:		macOS
ProductVersion:		27.0
BuildVersion:		26A428

客机管理员账号默认与宿主 macOS 用户名一致(创建时可通过 --user 自定义),并具备免密 sudo。请在远端命令前加上 --:ssh 会将命令行交给客机 Shell 执行,exec 则直接按参数列表调用目标程序(需要管道或重定向时请显式调用 sh -c,详见 SSH/exec 契约)。两者都会透传客机命令的退出码,配合 --json 可结构化捕获 stdout、stderr 与 exit_code:

barn --json mac exec -- sh -c 'echo out; exit 3'
{
  "command": "exec",
  "node": "mac1",
  "host": "10.10.20.10",
  "arguments": ["sh", "-c", "echo out; exit 3"],
  "success": false,
  "exit_code": 3,
  "stdout": "out\n"
}

完整 JSON 字段说明见 Mac 命令参考。

桌面

barn mac open

barn mac open 会在原生窗口中打开客机桌面,缩放窗口即可动态调整客机分辨率(可通过 View → Enter Full Screen 切换全屏)。直接关闭窗口不会停止虚拟机;再次运行 barn mac open 可重新唤出窗口,若虚拟机已停止则会先启动它。

当客机窗口处于焦点状态时,键盘快捷键会直接发送给客机,宿主侧操作请通过顶部菜单栏执行:

菜单项 作用
Machine → Share Clipboard 在当前会话中开关纯文本剪贴板共享
Machine → Restart… 重启客机内的 macOS 系统
Machine → Shut Down… 正常关闭客机(等同于 barn mac stop)
Window → Keep Running in Background 隐藏桌面窗口,让虚拟机继续在后台运行
Barn → Quit Barn… 选择让虚拟机在后台保持运行,或直接关机

宿主注销或关机时,Barn 会先请求客机正常关机,若超时仍未停止则强制断电。

每台虚拟机还会随机生成一组用于锁屏解锁和桌面管理员弹窗的登录密码。如需复制到剪贴板而不在终端明文回显,可执行:

barn mac password --copy

剪贴板

剪贴板共享会在窗口焦点切换时通过虚拟机自身的 SSH 通道自动同步纯文本,无需在客机内安装额外代理:点击进入客机窗口时可使用在宿主 Mac 上复制的文本,切回宿主应用时则会同步客机内复制的文本。密码管理器标记为敏感的条目、图片和文件不会跨机同步。

如需为某台虚拟机长期关闭剪贴板同步,可执行 barn mac configure mac1 --clipboard off(下次启动时生效)。

共享目录

创建虚拟机时可通过 --share 将宿主目录共享给客机,客机会将其自动挂载到 /Volumes/My Shared Files/<名称>:

barn mac up dev --cpu 8 --memory 16G --share ~/src --share docs=~/Documents:ro
barn mac exec dev -- ls "/Volumes/My Shared Files"

共享名称默认取目录路径的最后一段,末尾追加 :ro 表示只读挂载。共享路径须解析为已存在的目录(支持符号链接),且 Barn 绝不会自动创建或删除宿主共享目录。若需修改已有虚拟机的共享目录,请先停机再运行 barn mac configure:

barn mac stop dev
barn mac configure dev --share data=/Volumes/Work/data --unshare docs
barn mac start dev

由于 macOS 客机的 VirtioFS 在宿主修改文件后可能短暂缓存旧内容,若构建任务需要立即读取最新字节,建议使用 scp 或 rsync 将文件同步到客机本地磁盘。

在其他工具中使用 SSH

当第一台 Mac 虚拟机就绪时,Barn 会在 ~/.ssh/config 中添加一行带标记的 Include,使 ssh mac1、scp、rsync 以及支持 Remote-SSH 的编辑器能够直接按名称连接每台虚拟机,并自动使用该虚拟机的专属密钥与固定主机密钥:

ssh mac1 'uptime'
rsync -a ./project/ mac1:project/
barn mac ssh-config              # 查看生成的 SSH 配置条目
barn mac ssh-config --remove     # 移除 Barn 添加的 Include 并关闭自动写入

如果 ~/.ssh/config 是由 dotfile 工具管理的符号链接,Barn 不会直接修改它,而是打印出需要手动添加的 Include 行。执行 --remove 后如需恢复自动集成,可运行 barn mac ssh-config --install。若你的个人 SSH 配置已占用某个虚拟机同名别名,Barn 会保留你的原有别名,仅按 IP 地址发布该虚拟机的配置。

多台机器

每台虚拟机使用以字母开头的小写字母、数字或内部连字符命名。创建参数(--cpu、--memory、--disk、--user、--share)仅在首次创建该虚拟机时生效:

barn mac up dev --cpu 8 --memory 16G
barn mac ls
NAME  ADDRESS      STATE    SSH    USER   OS          CPU  MEMORY  DISK                 SHARED
dev   10.10.21.10  running  ready  alice  macOS 27.0  8    16 GiB  504.0 MiB / 100 GiB  src,data
mac1  10.10.20.10  running  ready  alice  macOS 27.0  4    8 GiB   4.7 GiB / 100 GiB
limit: 2 of 2 macOS VMs are running; stop one before starting another

省略机器名称时,命令默认作用于当前唯一存在的虚拟机或 mac1(存在多台机器且目标不唯一时会提示显式指定名称)。如果 --disk 指定的容量与现有基础镜像不同,Barn 会先用恢复镜像安装一份对应容量的基础镜像。

每台虚拟机拥有独立的 /24 私有子网(默认从 10.10.20.0/24 起分配,客机地址为 .10),并自动避开局域网、VPN、Linux 实验环境及其他 Mac 虚拟机占用的网段。当同一数据目录下已有两台 Mac 虚拟机在运行时,启动第三台会立即报错并提示可停止的机器:

barn mac up build --user ci
error: dev and mac1 are running; macOS allows 2 macOS virtual machines at a time
next: barn mac stop mac1

日常管理

barn mac stop dev               # 请求客机正常关机(超时 2 分钟后断电)
barn mac start dev              # 启动并等待 SSH 就绪
barn mac restart dev            # 重启以应用待生效的 configure 变更
barn mac stop --all             # 停止所有运行中的 Mac 虚拟机

传入 barn mac stop --force 可立即断电,传入 barn mac start --recovery 则会启动至 macOS 恢复模式并打开桌面窗口。

barn mac up 不会修改已有虚拟机的硬件配置;若对已存在的虚拟机传入不同的创建参数,命令会拒绝执行并提示改用 barn mac configure:

error: dev already exists, so --cpu would not apply; its configuration and data were preserved
next: barn mac configure dev --cpu 4

修改 CPU、内存、共享目录或网段前请先停止虚拟机(剪贴板开关可随时修改),变更将在下次启动时生效:

barn mac stop dev
barn mac configure dev --cpu 6 --memory 12G --subnet auto
barn mac start dev

barn mac recreate 会基于基础镜像用全新 macOS 替换虚拟机磁盘,同时保留机器名称、账号、资源规格、共享目录与 IP 地址;barn mac destroy 则会彻底删除虚拟机。两条命令在终端中都需要输入确认词,非交互脚本请传入 --yes:

barn mac recreate dev
barn mac destroy dev
操作 客机磁盘与已安装应用 规格设置、IP 地址与账号
stop / start、restart、重复 up 保留 保留
configure 保留 按指定参数更新
recreate 替换为全新的 macOS 克隆盘 保留(重新生成登录密码与 SSH 密钥)
destroy 删除 删除(共享基础镜像仍会保留)

macOS 版本与磁盘空间

barn mac image ls
KIND  OS          BUILD   STATE  ON DISK   CAPACITY  USED BY
base  macOS 27.0  26A428  ready  26.7 GiB  100 GiB   mac1,default

运行 barn mac image update 可向 Apple 查询最新的受支持 macOS 27 版本,确认后下载恢复镜像并为后续新建虚拟机准备新的默认基础镜像。已有虚拟机会保持原有系统版本,直到你显式执行 barn mac recreate NAME --update(若该虚拟机使用了如 200G 的自定义磁盘容量,请先按提示执行 barn mac setup --disk 200G 准备同容量的新基础镜像)。

使用 barn mac image prune 可查看未被任何虚拟机引用的非默认基础镜像,加上 --installers 会一并纳入已下载的 .ipsw 恢复镜像与未完成下载,加上 --yes 执行删除:

barn mac image prune --installers         # 预览可清理的镜像文件
barn mac image prune --installers --yes   # 确认删除

由于 APFS 克隆与基础镜像共享底层物理数据块,ON DISK 与各虚拟机的磁盘占用统计存在重叠,请勿直接相加计算总占用。

故障排查

遇到问题时先运行 barn mac doctor,它会依次检查宿主环境、Barn.app 原生组件、基础镜像和每台虚拟机的状态并给出修复命令;barn mac logs [名称] 则用于查看启动、网络、关机及 Apple Virtualization 运行时日志。

常见现象 处理方法
启动时报 network … overlaps route … VPN 或新路由占用了当前网段,执行 barn mac configure NAME --subnet auto 重新分配子网。
macOS allows 2 macOS virtual machines at a time 停止提示中的某台虚拟机(barn mac stop NAME),或退出其他工具运行的 macOS 虚拟机。
第三方客户端执行 ssh mac1 报 No route to host 在 系统设置 → 隐私与安全性 → 本地网络 中为该终端或 IDE 开启本地网络权限,或改用系统自带的 /usr/bin/ssh(barn mac ssh 与 exec 默认调用系统自带客户端)。
mac_runner_missing 或 mac_runner_protocol 确保 barn、barn-hosts-helper、barn-mac-runner 与 Barn.app 来自同一次 make mac-build 输出目录且保持相对路径不变。
通过远端 SSH 登录宿主 Mac 后启动失败 请在 Mac 本机已登录图形桌面会话的终端中运行 barn mac,并确保登录钥匙串处于解锁状态。

Apple Virtualization 框架尚不支持在虚拟机中稳定登录 Apple 账户,也不支持 USB 设备直通、快照与挂起恢复。

清理

barn mac ls                                 # 查看现有 Mac 虚拟机名称
barn mac destroy mac1 dev                   # 确认删除指定虚拟机
barn mac image prune --installers --yes     # 删除已缓存的恢复镜像与闲置基础镜像

销毁最后一台 Mac 虚拟机时,Barn 会自动清理 ~/.ssh/config 中的对应条目,并保留默认基础镜像供日后复用。如需彻底移除所有 Mac 虚拟机文件:

  1. 销毁所有 Mac 虚拟机(barn mac destroy ...),并执行 barn mac ssh-config --remove。
  2. 删除 $BARN_HOME/mac(默认 ~/.barn/mac)。
  3. 按需删除保存桌面窗口位置的 ~/Library/Preferences/com.pgsty.barn.plist(0.9.0 版本为 io.pgsty.barn.mac-runner.plist)。

1.4 - 日常管理

唯一部署的正常生命周期:检查、访问、扩容、变更、停止与销毁。

本页介绍 Linux 实验环境的日常运维操作。macOS 虚拟机请参阅 macOS 日常管理。

检查与访问

barn status
barn ssh meta
barn exec node-1 -- hostname
barn logs meta --source serial

以上命令直接读取 BARN_HOME(默认 ~/.barn)中记录的已应用状态,只要该路径指向同一位置,就可在任意工作目录下执行。自行设置 BARN_HOME 时,跨目录操作请使用绝对路径。barn status 默认展示各节点的镜像与资源规格(并在使用软件模拟时标注 tcg);加上 --verbose 还会列出客机架构、虚拟化加速器、回环 SSH 端口和 QEMU PID。

每次执行 barn up(包括只针对部分节点的局部 up)后,Barn 都会根据整套已应用部署刷新 ~/.ssh/barn_config 中的 SSH 别名,确保 ssh meta 等连接始终可用;你也可以随时通过 barn ssh-config --install 手动刷新别名。

涉及配置收敛的命令(plan、up、reload、resize 和 recreate)按以下优先级查找清单:

  1. 显式传入的 -f /path/to/inventory.yml 参数(当同一目录下同时存在 barn.yml 和 pigsty.yml 且希望使用后者时必须指定)。
  2. 当前工作目录下按顺序匹配到的第一个文件:barn.yml、barn.yaml、pigsty.yml、pigsty.yaml(不会向上搜索父目录)。
  3. BARN_HOME 中记录的已应用规格(barn validate 除外,它始终要求提供配置文件)。

重复运行 barn up 会自动重试未完成的客机初始化阶段并原位更新旧版客机辅助脚本,已健康的虚拟机无需重启。任何可选功能限制或自动执行的测试盘修复都会显示在终端摘要及 JSON/YAML 的 nodes[].warnings 与 nodes[].repairs 字段中(详见数据盘说明)。

停止与启动

barn stop
barn start
barn restart node-1
barn reload -f barn.yml       # 校验清单、停止目标节点并重新收敛

barn start 会启动已停止的虚拟机并复查运行中节点的就绪状态,同时刷新因端口占用而重新分配的回环 SSH 端口与别名。barn reload 在停止目标节点前会先校验清单语法、配置漂移与启动依赖,随后对这些节点执行 barn up 流程。

reload 是受控的“停止后重新启动”流程,可以新增节点或启动已停止节点;但对于已有节点的 CPU、内存、镜像、磁盘、共享目录、地址等虚拟机规格变更,它会在停止任何节点前拒绝执行。修改 CPU 或内存时,请编辑 vm_cpu 或 vm_mem 后执行 barn resize。支持的增加操作可以热插拔;减少资源或后端不支持时会自动停机再启动,同时保留虚拟机身份与磁盘。Barn 1.2.0 还支持使用 resize -D 原地扩容根盘。镜像、数据盘、网络和共享目录变更使用 recreate。

在线 resize 在热插拔后中断时,barn status 会提示实际 CPU 和内存可能与已应用配置不一致(reason: resize_incomplete)。再次运行 barn resize NODE 可继续调整,或执行 barn restart NODE 恢复已提交的资源配置。离线 resize 在停止节点和更新状态期间持续持有部署锁。

启动命令传入 --no-wait 时会在 QEMU 进程拉起后立即返回,跳过就绪检查、客机恢复以及客机 /etc/hosts 和控制节点 SSH 刷新;后续运行一次 barn up 即可补齐这些步骤。

变更部署

barn plan
barn up                         # 创建或启动目标节点并刷新 SSH 别名
barn resize node-1              # 应用 CPU/内存变更,不重建虚拟机
barn recreate node-1            # 重建规格发生变更的节点

barn plan 会对比清单文件与已应用状态,展示目标镜像版本、资源总量、漂移原因及磁盘影响:

检测到的变化 含义 应用方式
create 清单中新增了尚未创建的节点 barn up
resize 节点 CPU 或内存发生变化 barn resize <node>
recreate 节点镜像、磁盘、共享目录或其他虚拟机规格发生变化 barn recreate <node>
missing 已创建的节点从 YAML 清单中被移除 恢复 YAML 条目,或执行 barn destroy <node>

JSON 输出中的 start、create、resize、recreate 与 missing 是节点列表,顶层 action 概括整次计划,取值为 create、start、converge、resize、recreate、blocked-removal、repair 或 none;可选字段 blocked 是说明原因的字符串。whole_deployment: true 表示需要重建整个部署;按提示执行命令,确保新节点也一并纳入。

删改 YAML 条目绝不会自动销毁虚拟机;修改 Barn 不消费的 Pigsty 服务级变量则会显示 action: none。在交互式终端中执行 recreate 和 destroy 需输入命令名确认,非交互脚本中则需传入 --yes(或 --force)。

recreate 是显式的替换路径。Barn 会先校验新镜像、网络、共享目录以及持久数据盘的挂载契约,然后销毁选定节点的虚拟机产物,再按目标清单启动全新的虚拟机。根盘和非持久数据盘会被替换;兼容的持久数据盘继续保留并重新挂载。替换后的虚拟机会获得新的身份,同时刷新 SSH 主机密钥状态。

不带节点名的 recreate 会替换部署中的全部节点,并在确认提示中逐一列出。如果清单缺少某个已有节点,它会在停止任何虚拟机前拒绝执行(退出码 4,reason: nodes_removed):请用 barn destroy <node> 显式删除该节点,或把它加回清单。Barn 会在销毁锁内再次核对范围,预检期间已应用状态发生变化时报告 deployment_changed。

分批应用节点变更

可以一次编辑多个节点,再分批应用:

barn plan node-1 -f barn.yml
barn recreate node-1 -f barn.yml
barn plan node-2 -f barn.yml

显式选择节点执行 plan、up、reload、recreate 或 resize 时,未选中节点保留已应用定义,即使 YAML 已修改或暂时省略它们。未创建且未选中的节点会在选中时才解析镜像。整份清单仍须通过语法解析,所选变更也不能与已应用节点的地址、别名、控制节点角色或部署公共设置发生冲突。

不传节点名时,Barn 会检查整份清单:CPU 与内存变更使用 resize,其他已有节点规格变更需要 recreate,清单中缺失的节点需要恢复定义或显式销毁。

并发命令

单条命令内部的节点并行操作,在 Barn 1.2.0 中可通过 --parallel/-p 调整,默认值根据 CPU 数计算;支持的命令与 Barn 1.1.0 的差异见生命周期并发。

修改部署状态的命令(up、start、stop、restart、reload、resize、recreate、destroy、purge 和 provision)会获取 BARN_HOME 下的部署锁。若其他操作正在运行,命令最长等待 10 分钟(provision --timeout 可指定更短的期限),并打印持锁命令、PID 与启动时间;等待超时将返回退出码 4(error: conflict、reason: deployment_busy)。持锁进程退出后锁会自动释放,切勿手动删除锁文件。

只读与连接类命令(status、ssh、exec、ssh-config 以及 hosts 的状态读取)无需等待锁,直接读取最新已发布的状态。若后台正有变更命令持锁运行,barn status 会附带一条 note 说明当前正在执行的操作。异常中断后的恢复步骤见故障排查。

销毁

请根据需要清理的范围选择对应的销毁命令:

销毁单个节点
barn destroy node-3
销毁环境(保留持久盘)
barn destroy
连同持久盘一并删除
barn destroy --delete-persistent
快速清空整套实验环境
barn purge
  • barn destroy <node> 仅删除指定节点,并为剩余节点刷新 SSH 配置片段。删除控制节点时,剩余的第一个节点接任控制节点,ssh-config、hosts、exec 与 provision 可继续使用;请将清单中的 admin_ip 改为该节点的地址(除非希望 up 重新创建已删除的节点,否则一并删除其条目),再执行 barn up 安装其控制 SSH 访问。
  • barn destroy 删除整套部署的虚拟机、根盘、非持久数据盘、部署状态以及 Barn 安装的 SSH 别名,同时保留持久数据盘、部署密钥、镜像缓存和宿主网络。之后再次运行 barn up 即可根据清单重建实验环境。
  • barn destroy --delete-persistent 与 barn destroy --purge 仅适用于整套部署(不支持与节点名称同用),其中 --purge 会一并删除持久数据盘、密钥和部署状态。
  • barn purge 默认立即清空整套 Linux 实验环境,并删除归属明确的遗留持久盘、密钥与部署状态,保留镜像缓存与宿主网络。需要查看节点列表和清理范围后再确认时,运行 barn purge --ask,输入 y/yes 确认或 n/no 取消;空行和 EOF 也会取消。它不接受 --yes、-y 或 --force。

所有虚拟机移除后,如需卸载多用户共享的 Linux 宿主网络:

barn network uninstall --yes

镜像缓存管理请参阅镜像仓库,完整卸载宿主文件请参阅卸载与清理。

1.5 - 存储、文件与服务访问

配置测试数据盘,理解保留规则,传输文件,并通过 OpenSSH 访问客机服务。

本指南介绍 Linux 实验环境的数据盘配置、文件传输与服务访问,示例沿用 Linux 快速上手中的 meta 节点(10.10.10.10)。

创建虚拟机前配置磁盘

默认情况下,每个 Linux 节点配有一块 64 GiB 根盘写时复制层,以及一块挂载在 /data 的 128 GiB 非持久数据盘。vm_disk 用于以 GiB 为单位设置根盘大小(可填整数 64 或带单位的 64GiB);vm_disks 则会替换整个数据盘列表(设为 vm_disks: [] 即不挂载额外数据盘)。

新建单节点实验环境时,可将以下配置保存为 storage.yml:

storage.yml
all:
  vars:
    admin_ip: 10.10.10.10
    vm_image: u24@20261017.0.1
  children:
    nodes:
      hosts:
        10.10.10.10:
          nodename: meta
          vm_cpu: 2
          vm_mem: 4096
          vm_disk: 64
          vm_disks:
            - {path: /data, size: 64, fs: auto, persistent: true}
            - {path: /scratch, size: 32, fs: ext4, persistent: false}

若同名节点已存在且磁盘配置不同,barn up 会提示配置漂移;请先查看 barn plan 并备份所需数据,再显式执行 barn recreate meta(重建会替换根盘与非持久数据盘)。

校验配置文件、创建虚拟机并验证挂载结果:

barn validate -f storage.yml
barn plan -f storage.yml
barn up -f storage.yml
barn exec meta -- findmnt /data
barn exec meta -- findmnt /scratch
barn exec meta -- df -h / /data /scratch

磁盘容量(size: 64 或 size: 64GiB)均为按需分配的稀疏虚拟容量,随实际写入增长。当 fs: auto 时,若客机安装了 mkfs.xfs 则优先格式化为 XFS,否则使用 ext4。启动后请结合 barn up 输出警告与 findmnt 确认数据盘已正常挂载。

各类操作的磁盘保留规则

操作 根盘与非持久数据盘 持久数据盘(persistent: true)
stop 后 start,或 restart 保留 保留
健康状态下重复执行 up 保留 保留
规格兼容的 recreate 替换 保留并重新挂载
普通 destroy 删除 保留
整套部署 destroy --delete-persistent 或 purge 删除 删除(含已保留的持久盘)

Barn 依据磁盘身份与规格参数复用持久数据盘:在 recreate 或 destroy 后重新挂载保留盘时,节点名称、挂载路径 path、容量 size 和文件系统 fs 必须保持一致。规格不匹配时 Barn 会拒绝挂载,而不会自动执行扩容、改名或文件系统转换。

警告

持久数据盘依然属于可丢弃的测试存储。 persistent: true 仅控制虚拟机销毁或重建时是否保留磁盘文件;但在客机恢复期间,若文件系统检查工具报告 ext4 或 XFS 数据盘存在可识别的损坏,barn up 仍会将其重置(并在 nodes[].repairs 中记录)。带分区表、签名缺少 UUID、使用不支持的文件系统特性或检查工具未知失败的磁盘会保留数据并给出警告;设备暂缺、探测失败、挂载点繁忙或宿主 I/O 错误也绝不会触发格式化。重要数据请务必备份在宿主上。

新格式化的数据盘默认归 root 所有。你可以用以下命令验证写入 /data 的数据在普通停机重启后依然保留:

barn exec meta -- sudo -n sh -c \
  'printf "retention check\n" > /data/barn-retention.txt'
barn stop meta
barn start meta
barn exec meta -- cat /data/barn-retention.txt

macOS 客机的目录共享用法请参阅 macOS 虚拟机教程。

通过管理 SSH 传输文件

从运行中的部署导出独立的 OpenSSH 配置文件,即可直接使用 ssh、scp 或 rsync:

barn ssh-config > barn-ssh.conf
ssh -F ./barn-ssh.conf meta hostname
scp -F ./barn-ssh.conf ./storage.yml meta:/tmp/storage.yml
scp -F ./barn-ssh.conf meta:/data/barn-retention.txt ./barn-retention.txt

生成的配置片段引用当前回环 SSH 端口、部署密钥路径以及按实例隔离的 known_hosts 文件,不会内嵌私钥原文。重建节点或管理端口变动后请重新导出,或执行 barn ssh-config --install 将别名写入 ~/.ssh/config,从而免去 -F 参数。

访问客机内的服务

只要客机内的服务监听在节点的固定私网 IP 上(例如监听在 10.10.10.10:5432 的 PostgreSQL)且客机防火墙放行,宿主与其他节点即可直接通过该 IP 访问。

如果服务仅监听在客机回环地址 127.0.0.1 上,可通过 OpenSSH 建立本地端口转发隧道:

ssh -F ./barn-ssh.conf -N \
  -L 127.0.0.1:15432:127.0.0.1:5432 meta

保持该终端运行,宿主本地客户端即可连接 127.0.0.1:15432(按 Ctrl-C 关闭隧道)。

SSH 别名(如 ssh meta)仅对 OpenSSH 工具生效。如果希望浏览器、psql 等常规宿主程序也能直接解析节点名与 vm_alias,可预览并启用 /etc/hosts 集成:

barn hosts install --json
barn hosts install --yes

barn hosts install --yes 会更新当前宿主的 /etc/hosts(必要时请求 sudo);增删节点或修改 IP 后重新执行即可刷新。

Barn 清单不提供 vm_ports 或 vm_forwards 字段,请直接使用固定私网 IP 或 OpenSSH 端口转发。由于管理 SSH 走独立的宿主回环端口,即便固定 IP 私网受限,barn ssh 与 -L 隧道依然可用。

宿主目录共享

Linux 与 macOS 宿主均可通过 QEMU Virtio-9p 向 Linux 客机共享目录。首次 barn up 前在 all.vars 或节点变量下设置:

barn.yml
vm_shares:
  - host: ./src
    guest: /workspace
    readonly: true

host 支持相对清单真实文件目录的路径、~/ 与目录符号链接。目录须已存在、当前用户可访问且不与 BARN_HOME 重叠,无须归当前用户所有;多个客机可以读写同一目录,由用户协调写入。

宿主 QEMU 与客机内核须支持 9p。可写共享还受客机用户权限约束;无法写入时会降级只读并报告警告,不会修改宿主属主。修改已有节点共享后执行 barn recreate <node>。原生 macOS 客机通过 barn mac up --share 或 barn mac configure --share 使用 VirtioFS。

完整的磁盘与共享字段约束请参阅配置参考。

1.6 - 镜像仓库

选择客机镜像、使用镜像站、导入本地 qcow2,并清理缓存。

本指南介绍 Linux 客机镜像的选择、镜像站切换、静态仓库构建与本地缓存清理。

使用默认配置时,barn up 会自动按宿主架构解析 u24:stable 并按需下载经过校验的不可变 qcow2 镜像,无需提前手动拉取。Barn 初始使用二进制内置的签名镜像目录(revision 2026110502,覆盖 9 个发行版家族的 17 个镜像产物);执行 barn update 可从远端仓库获取、校验并激活最新镜像目录(或用 barn image sync 从指定 URL 或本地文件加载目录)。

选择镜像

查看当前镜像目录中的发行版家族与版本详情:

barn image list
barn image info u24
barn image info u24:stable

Barn 内置 9 个发行版家族:el7、el8、el9、el10、d12、d13、u22、u24 和 u26。直接填写家族名(如 el9)默认使用 stable 通道,name:channel 指定通道,而 name@version 则精确锁定某个不可变构建版本。你也可以在 vm_version 中填写数字前缀,按点号分隔的版本段自动匹配最新的小版本:

barn.yml
all:
  vars:
    vm_image: el9
    vm_version: "9.8"

上例中 "9.8" 会匹配活动镜像目录中最新的 9.8.x 构建,"9" 则匹配最新的 9.x 构建(YAML 中的纯数字 vm_version 请加双引号以保持字符串类型)。独立设置的 vm_version 不能与 vm_image 中的 :channel 或 @version 后缀同时使用。

若需要跨镜像目录更新保持严格可复现,请直接锁定 barn image info 显示的完整版本号:

barn.yml
all:
  vars:
    vm_image: d13@20261103.2651.1

修改 vm_image 或 vm_version 后,先运行 barn plan 查看变更。已有节点会保留当前根盘,直到显式执行 barn recreate <node>;运行 barn update 仅影响后续新建或重建的节点。

临时覆盖与架构选择

使用 -I(--image)与 -A(--arch)可在单次命令执行中临时覆盖镜像与架构设置。

默认使用宿主架构;只有显式配置 vm_arch 或传入 --arch/-A 时才覆盖。优先级为 -A → vm_arch → 宿主架构;-A native 表示忽略清单中的固定架构,恢复跟随宿主。amd64 接受 x86_64、x64 别名,arm64 接受 aarch64、a64 别名。

barn plan -I u24 -A amd64
barn up -I u24 -A amd64

-I u24 替代所选节点的 vm_image 与 vm_version,不改变架构。这些覆盖不会改写清单;要长期保留,请设置 vm_image 与 all.vars.vm_arch,移除被替代的 vm_version,或用 barn init -I u24 -A amd64 生成新清单。已有节点改镜像或架构仍需 recreate,架构变更必须覆盖全部已有节点。完整规则见配置参考。

barn image list 会列出所有架构;独立的 info 和 pull 默认按宿主架构查询,不读取清单的 vm_arch,可用 --arch/-A 指定(旧 -a 仍兼容)。镜像缺少目标架构变体时会报错,不会改选其他架构。当前 Barn 接受的客机架构只有 amd64 与 arm64:

  • el7 仅支持在原生 linux/amd64 宿主上运行。
  • Apple Silicon 上的 el8(arm64) 会自动启用 QEMU TCG 软件模拟,因为上游 RHEL/Rocky 8 arm64 内核要求 64 KiB 页粒度,而 macOS HVF 硬件加速不支持该页大小。跨架构模拟器与固件要求见运行时排查。
说明

内置镜像目录中,除仅供兼容旧环境使用的 EOL el7 标记为 deprecated 外,其余全部版本均为 supported。

使用镜像站

发行版默认使用全球镜像源 https://repo.pigsty.io/barn。单次命令可通过 --mirror 切换至中国官方镜像站(https://repo.pigsty.cc/barn),或通过 --repo 指定自定义仓库 URL 或本地目录路径:

barn image pull u24 --mirror
barn up --mirror
barn update --repo https://mirror.example/barn
barn image pull u24 --repo https://mirror.example/barn
barn up --repo https://mirror.example/barn

也可以通过环境变量 BARN_REPO 为当前 Shell 会话设置默认仓库:

export BARN_REPO=https://mirror.example/barn
barn update
barn up

仓库选择优先级依次为 --repo → --mirror → BARN_REPO → 全球默认源(https://repo.pigsty.io/barn)。两个官方仓库以及任何明文 http:// 仓库都强制要求可信 Minisign 签名(catalog.json.minisig);显式指定的本地目录和自定义 https:// 仓库则允许使用未签名的 catalog.json。所有下载的镜像文件都会严格校验字节大小、SHA-256 摘要与 qemu-img 结构完整性。

使用官方仓库下载镜像时,Barn 会自动重试临时网络故障并支持断点续传;若所选官方站点不可达,还会自动回退到另一个官方镜像站。自定义 --repo 仓库则不会向外部站点回退。

每个仓库根路径在 BARN_HOME 下各自维护独立的活动镜像目录状态。首次将 --repo 指向包含自定义镜像的仓库时,请先执行 barn update --repo <root> 激活其镜像目录,再运行 plan 或 up。

构建静态仓库

Barn 镜像仓库是一个普通的静态目录,可直接通过本地路径读取、用 rsync 同步或由任意静态 HTTP/HTTPS 服务托管:

/srv/barn

  • barn/
    • repo.yaml人工维护的镜像版本与通道定义
    • catalog.json自动生成的镜像目录(含 SHA-256 与文件尺寸)
    • catalog.json.minisigMinisign 签名(官方仓库与 HTTP 仓库必需)
    • images/
      • d13-1-arm64.qcow2经校验且支持 cloud-init 的 qcow2 基础镜像

repo.yaml 是唯一需要人工编辑的源文件。对应上方单个 arm64 镜像的最小配置如下:

/srv/barn/repo.yaml
schema: 1
revision: 1
defaults: { image: d13, channel: stable, arch: native, boot: uefi }
images:
  d13:
    channels: { stable: "1" }
    versions:
      "1":
        status: testing
        variants:
          arm64:
            source_user: debian

将准备好的 qcow2 镜像放入 /srv/barn/images/d13-1-arm64.qcow2(支持相对仓库路径、目录符号链接与共享可写目录),随后在安装了 qemu-img 的宿主上生成并校验 catalog.json:

barn repo scan /srv/barn
barn repo build /srv/barn
barn repo verify /srv/barn

barn repo scan 以只读方式检查目录结构,barn repo build 则会运行完整的 qemu-img check,将文件名、SHA-256、文件大小和虚拟容量写入 catalog.json。每次更新镜像目录内容时都请递增 revision;发布到远端服务器时,先上传不可变的 .qcow2 镜像文件,最后再更新 catalog.json 及其签名。

激活并验证该本地仓库:

barn update --repo /srv/barn
barn image info d13 --arch arm64 --repo /srv/barn
barn image pull d13 --arch arm64 --repo /srv/barn

后续运行 plan、up 和 recreate 时传入 --repo /srv/barn(或设置 export BARN_REPO=/srv/barn),并在清单中配置 vm_image: d13@1。如需将该仓库恢复为二进制内置目录(同时保留防回滚版本号记录),可执行 barn image reset --repo /srv/barn。

导入本地镜像与清理缓存

如果只需使用单个自定义 qcow2 镜像,无需搭建静态仓库,可直接将其作为 local-* 别名导入本地缓存,默认记录宿主架构:

barn image import --name local-mybase --boot uefi \
  --source-user ubuntu --sha256 <digest> /path/to/base.qcow2

注册别名时需同时指定 --name(必须以 local- 开头)、--boot(uefi 或 bios)和 --source-user;省略这组参数则仅校验镜像并按内容摘要缓存。导入的镜像必须已预装并启用 cloud-init。命名别名一旦注册即不可变——重新制作镜像后请注册新的 local-* 名称,并在 barn.yml 中通过 vm_image: local-mybase 引用。

命名导入支持 -A,例如 barn image import /path/to/arm64.qcow2 --name local-arm64 --boot uefi --source-user ubuntu -A arm64。它记录你声明的架构,不会转换镜像或检测客机 CPU;使用该镜像时,也要让清单的 vm_arch 或生命周期命令的 -A 与之匹配。不带 --name 时不能传入 -A。

清理未被使用的缓存镜像与中断下载暂存文件:

barn image prune --dry-run
barn image prune --yes

barn image prune(依赖本机 qemu-img)会自动保护当前所选仓库活动镜像目录中的全部镜像、已有节点正在使用的基础镜像以及所有已注册的 local-* 别名。

签名信任链、防回滚机制、缓存目录结构及架构兼容规则详见镜像参考;从上游云镜像制作候选镜像并执行发布前验收的完整流程详见镜像流水线。

1.7 - 自动化与客机脚本

准备无人值守实验环境,检查 JSON 结果,并在选定客机内运行可重复执行的脚本。

本指南介绍如何在无人值守脚本与 CI 流水线中调用 Barn。请始终以拥有该部署的普通 Unix 用户身份执行命令,并在每次调用时传入相同的 -f <清单> 与 BARN_HOME。

准备可预测的实验环境

建议将主机清单纳入版本控制,并将 vm_image 锁定为完整版本号(如 vm_image: u24@20261017.0.1),确保后续更新镜像目录不会意外改变流水线所使用的基础镜像。显式传入 -f 还能防止首次 setup 在遇到网段冲突时自动改写默认模板的子网。若使用自定义镜像仓库,请先执行 barn update --repo URL 激活其镜像目录,再向 setup 和 up 传入相同的 --repo。

在启动自动化流程前,先生成并校验配置文件:

mkdir -p ~/barn-lab
cd ~/barn-lab
barn init dual
# 编辑 barn.yml,锁定 vm_image 与节点规格。
barn version
barn validate -f barn.yml
barn plan -f barn.yml
barn setup -f barn.yml --dry-run

核对宿主变更计划并配置好免交互 sudo 凭据(或 NOPASSWD 策略)后,执行宿主准备并拉起环境:

barn setup -f barn.yml --yes
barn up -f barn.yml --json > up.json

生成新清单时,barn init [模板] --image <引用> 将镜像引用写入 all.vars.vm_image,让所有生成节点继承同一个镜像。引用可以是目录别名(el9)、频道(u24:stable)或版本选择器(u24@20261017.0.1)。barn setup [模板] --image <引用> 也支持生成时选镜像,但遇到已有清单时会拒绝该生成参数。

--image/-I、--arch/-A 在各命令中采用相同的用法:barn init full -I u24 -A amd64 将两项选择保存到新清单;validate、plan、up、reload、recreate 和 resize 的同名参数则只覆盖本次期望配置。例如 barn plan -f barn.yml -I u24 -A arm64 --json,执行时传入相同的覆盖参数。setup 的 -I/-A 仍只适用于生成模板。

这些命令还支持 --cpu/-C、--mem/-M、--scale/-S、--disk/-D。各项规格的优先级为命令行参数 → 非空 BARN_* 环境变量 → 清单 → 默认值;validate、plan 与实际应用计划的命令应使用相同的参数和环境。

未指定架构参数时依次读取 BARN_ARCH、清单的 vm_arch,都未设置时跟随宿主;-A native 可以覆盖环境变量和清单,恢复宿主架构。已有 VM 改镜像或架构需要 recreate。长期使用的 CI 配置宜保存 vm_image、vm_arch 与精确镜像版本,详见配置参考。

barn setup --yes 会直接接受宿主准备计划,不再询问。在终端中,up、start、restart 与 reload 安装软件包或 Barn 网络前会展示同样的计划并询问一次;没有终端时它们只报告缺少的条件,因此请先执行 barn setup --yes。

结合退出码校验 JSON 结果

Barn 将结构化 JSON/YAML 结果输出到 stdout,将诊断信息输出到 stderr。需要注意的是,只要管理 SSH 就绪,barn up 就会返回 退出码 0——即使附加数据盘、Virtio-9p 共享或节点间 SSH 存在功能限制(记录于 nodes[].warnings),或者自动重置了损坏的测试数据盘(记录于 nodes[].repairs)。因此自动化脚本应当同时校验退出码与 JSON 字段:

up-check.sh
#!/usr/bin/env bash
set -euo pipefail

if barn up -f barn.yml --json > up.json 2> up.stderr; then
  jq -e '
    (.nodes | type == "array" and length > 0) and
    all(.nodes[];
      .state == "running" and .ready == true and
      ((.warnings // []) | length == 0) and
      ((.repairs // []) | length == 0)) and
    ((.warnings // []) | length == 0)
  ' up.json || exit 1
else
  barn_exit=$?
  cat up.stderr >&2
  cat up.json
  exit "$barn_exit"
fi

当后续步骤要求客机完全就绪时,请勿在 barn up 中使用 --no-wait(barn status --json 仅读取已缓存的状态与警告,不会重新探测客机 SSH)。

错误退出码与专用报告结构

请结合命令行退出码与各命令的 JSON 结构判断执行结果:

  • 退出码 2(usage):首次运行缺少配置文件、参数非法、镜像别名未知,或标准输入不是终端时执行 destroy/recreate 却未传 --yes(purge 则直接执行,不会询问)。
  • 退出码 4(conflict):清单发生需要显式处理的漂移(reason: recreate_required 或 nodes_removed),recreate 预检期间已应用状态发生变化(reason: deployment_changed),或等待部署锁超过 10 分钟(reason: deployment_busy)。
  • 退出码 5(partial):多节点 up 或 provision 部分成功、部分失败——重试前请先检查 nodes[] 或 results[]。
  • 退出码 7(integrity):摘要、签名或身份校验失败,包括目录签名或签名 revision 校验失败(reason: catalog_signature 或 catalog_equivocation)。
  • 专用报告格式:
    • barn doctor --json 在宿主计算能力检查通过时即退出 0,即使 class: network 检查报错;若工作流依赖私网通信,请同时检查 checks[] 与 barn network status --json。
    • barn ssh 和 barn exec 直接透传远端命令的退出码(含 OpenSSH 连接失败的 255),并在 --json 模式下通过 success、exit_code、stdout 和 stderr 返回结果。
    • 未传 --yes 时,如果标准输入不是终端或输出为 --json/--yaml,network 与 hosts 的 install/uninstall 只输出计划并退出 0;请检查结果中的 applied,或传入 --yes。

执行单条命令或批量脚本

在节点名称与远端命令之间始终使用 -- 分隔,并将 Barn 自身的参数(如 --json、--verbose)放在 -- 之前:

barn exec meta -- hostname
barn exec node-1 -- sh -c 'id; df -h /data'
barn exec meta --json -- uname -a > uname.json

调用 barn exec 时请将程序名与参数分开传递;若需使用管道、重定向或环境变量展开,请显式调用 sh -c(详见 SSH 透传与命令补全)。

如需在多台运行中的 Linux 客机上批量执行巡检或初始化脚本,可先在宿主保存一份 Bash 脚本(普通文件或指向普通文件的符号链接,不超过 4 MiB):

check-lab.sh
#!/usr/bin/env bash
set -euo pipefail
hostname
id
findmnt /data
test -d /data

通过 barn provision 在目标节点上运行:

barn provision --script ./check-lab.sh meta node-1
barn provision --script ./check-lab.sh --parallel 2 --timeout 5m --json > provision.json

省略节点选择器时,provision 会作用于部署中的全部节点(所有目标节点必须已处于运行状态)。Barn 会将校验后的脚本字节流直接通过 SSH 传给客机 Bash 执行,并记录脚本的 SHA-256 摘要,不在客机磁盘上落盘保存脚本文件。

  • 并发与超时:默认串行执行;--parallel 接受正整数,工作线程数不超过所选节点数。--timeout 限制整次操作时长,默认 1h,接受任意正时长。--sudo 通过客机免交互 sudo -n 执行。
  • 输出截断与幂等性:每个节点最多捕获 1 MiB stdout 与 1 MiB stderr(超出时标记 stdout_truncated / stderr_truncated)。由于部分失败不会回滚已执行成功的客机操作,请确保编写的脚本可安全重跑。
  • 退出码规则:目标节点部分成功、部分失败时退出 5;仅针对单个节点且远端返回大于 0 且非 255 的状态码时直接透传该状态码;其余全失败情况退出 1。

与 Pigsty 配合使用

Barn 与 Pigsty 原生共用同一套 Ansible YAML 清单格式。barn init 生成的模板仅定义虚拟机硬件拓扑,而 Pigsty 仓库中的 pigsty.yml 则包含完整的 PostgreSQL 集群与监控服务配置。先用 Barn 根据 pigsty.yml 拉起虚拟机:

barn validate -f pigsty.yml
barn plan -f pigsty.yml
barn up -f pigsty.yml
barn ssh

在 barn up 期间,Barn 会初始化客机管理员账号,并将部署私钥复制到 admin_ip 指定的控制节点上,使其能够直接通过固定私网 IP 免密连接集群内的其他节点(详见安全与信任)。待 barn up 就绪后,登录控制节点即可按照 Pigsty 文档部署数据库服务。

1.8 - 故障排查

面向 setup、网络、镜像、漂移、中断状态与 SSH 的简短安全手册。

本手册提供 Linux 实验环境的常见问题排查步骤。macOS 客机请运行 barn mac doctor 并参阅 Mac 故障排查章节。

排查问题时,建议先采集以下三份 JSON 诊断报告(当没有其他命令持有部署锁时,barn status 还会自动收敛中断的虚拟机状态):

barn doctor --json
barn network status --json
barn status --json

只要宿主计算能力检查通过,即使 class: network 检查报错,barn doctor 也会返回退出码 0——因此判断 barn up 能否正常接入私网前,请同时查看 checks[] 与 barn network status --json。

下载与 PATH 问题

安装脚本从 GitHub Releases 下载发行归档(--mirror 仅用于切换客机镜像仓库,不会重定向安装脚本下载)。若访问 GitHub 需要代理,请在终端中设置 HTTPS_PROXY 或 ALL_PROXY 环境变量(macOS 系统设置中的图形代理不会自动注入命令行环境)。

用户态安装脚本默认将程序安装到 ~/.local/bin。若安装后提示找不到 barn 或仍显示旧版本,请检查当前 PATH:

export PATH="$HOME/.local/bin:$PATH"
command -v barn
barn version

请始终保持同一版本打包的 barn 与 barn-hosts-helper 处于原有的相对目录结构中。

找不到主机清单

当既没有配置文件也没有已应用部署时,交互式运行 barn up 会自动生成初始 barn.yml。如需使用现有清单,请在 barn.yml / pigsty.yml 所在目录运行 plan、up 或 validate,或显式传入 -f /path/to/file(也可先运行 barn init 生成模板)。

未指定 -f 时,plan、up、reload、resize 和 recreate 会按 barn.yml、barn.yaml、pigsty.yml、pigsty.yaml 的顺序查找当前工作目录,仅在四个文件都不存在时回退到 BARN_HOME 中的已应用规格。若匹配到的第一个文件存在语法错误,命令会立即报错退出;当旧的 barn.yml 与目标 pigsty.yml 同处一个目录时,请显式传入 -f pigsty.yml。

若 barn status 提示 no deployment state found,说明当前 BARN_HOME 下尚无已应用部署(全新环境或刚执行过 purge)。

init 输出路径与符号链接

barn init 与 barn setup 可以经由目录符号链接写入,barn init -o ./lab/config/barn.yml 也会自动创建缺失的父目录。覆盖已有文件需要 --force。Barn 不会经由输出文件本身的符号链接写入:传入 --force 时会报告 will not overwrite …: it is a symlink,此时请改为传入链接指向的目标路径:

barn init -o "$(readlink -f barn.yml)" --force

setup 需要 sudo

barn setup 在请求密码前会先打印即将执行的宿主变更明细,并在特权步骤开始时将当前终端直接交给 sudo。--yes 仅用于自动确认 Barn 的变更计划,不会绕过 sudo 本身的身份认证;无人值守环境需预先配置免密 sudo(NOPASSWD)或有效凭据缓存。你可以随时运行 barn setup --dry-run 预览计划。

在 macOS 上,barn setup 会先完成固定版本 socket_vmnet 软件包的下载与校验,随后才请求管理员权限,因此下载失败不会触发密码提示。

原生加速或兼容运行时不可用

Barn 依赖 macOS HVF 或 Linux KVM 提供原生硬件虚拟化加速,仅在显式配置跨架构 vm_arch 或命中内置兼容规则(如在 Apple Silicon 上运行 el8 arm64)时启用 QEMU TCG 软件模拟;原生 HVF/KVM 异常绝不会自动降级为 TCG。

Homebrew 的 qemu 配方已同时包含 arm64 与 amd64 系统模拟器,而 Linux 宿主的 barn setup 仅安装宿主原生架构的模拟器——在 Linux 上运行跨架构客机前,请先安装对应的 qemu-system-* 二进制与 UEFI 固件。

网络状态为 partial 或 invalid

若宿主网络配置完整但处于未激活状态,交互式运行 barn up 会把重新启动网络列入宿主准备计划,询问一次后执行;没有终端时请运行 barn setup --yes。若 barn network status 报告 partial 或 invalid,请通过内置卸载命令预览并清理受管资源,切勿手动删除系统网络配置文件:

barn network status --json --verbose
barn network uninstall --json
barn network uninstall --yes

若 Linux 网桥冒烟测试在 setup 期间失败,Barn 会自动回滚网络配置;仅当输出明确的 automatic rollback failed 时才需人工介入。

在 macOS 上,barn setup 可自动修复缺失或权限过严的 /var/log/barn-vmnet 目录(标准权限为 root:wheel 0755),但若该路径被替换为符号链接、属主异常或对同组/其他用户可写,Barn 会拒绝自动修改——请按 barn network status 给出的诊断命令手动修复。

Linux bridge helper 失败

在 Debian / Ubuntu 宿主上,请检查 /usr/lib/qemu/qemu-bridge-helper 的属主、属组与 setuid 权限位(应为 root:<当前用户所属组> 4750):

id
stat -c '%U:%G %a %n' /usr/lib/qemu/qemu-bridge-helper
dpkg-statoverride --list /usr/lib/qemu/qemu-bridge-helper

plan 报告 recreate 或 missing

  • recreate:节点的虚拟机规格定义已变更。请先查看 barn plan 并备份根盘或非持久数据盘上的文件,再运行 barn recreate <node>(非交互环境需加 --yes)。
  • missing:已创建的节点从 YAML 清单中被移除。可恢复该节点的 YAML 条目,或执行 barn destroy <node> 将其销毁。存在缺失节点时,不带节点名的 barn recreate 会在停止任何虚拟机前拒绝执行(退出码 4,reason: nodes_removed)。

使用节点选择时,barn plan node-1 与 barn recreate node-1 会保留未选中节点的已应用定义,无关节点的编辑不必一起重建。地址、别名、控制节点角色及部署公共设置的真实冲突仍需处理。

节点未就绪

节点就绪要求管理 SSH 可连通且客机实例 UUID 校验一致。若某个节点无法创建、启动或建立管理 SSH 连接,barn up 会指出故障节点与所处阶段,并以退出码 5 结束。请先查看对应日志:

barn logs <node>                  # 客机串口控制台日志
barn logs <node> --source qemu    # QEMU 进程标准错误与诊断日志
barn logs --source events         # 宿主准备与部署事件日志
barn status

附加数据盘、Virtio-9p 共享目录、主机名、客机 /etc/hosts、控制节点 SSH 与固定 IP 私网网卡均在管理 SSH 就绪后独立初始化。单一步骤失败不会阻断管理 SSH,barn up 仍会返回退出码 0 并在 nodes[].warnings 中列出受限项:

报告的功能限制 处理方法
数据盘不可用 排查设备缺失、文件系统工具、挂载繁忙或宿主 I/O 错误后,重新运行 barn up。带分区表、签名缺少 UUID 或使用不支持的文件系统特性的磁盘会保留数据且不挂载
共享目录只读 核对宿主与客机的实际写权限后,重新运行 barn up
客机 hosts 或控制节点 SSH 未完成 重新运行 barn up 刷新客机内的托管文件
私网网卡不可用 检查 barn network status,修复宿主网桥或 vmnet 后重新运行 barn up

排除故障后再次运行 barn up,Barn 会仅重试未完成的阶段而不重启健康节点。空白数据盘会被初始化;ext4 或 XFS 数据盘只有在文件系统检查工具报告可识别的损坏时才会重置(详见数据盘说明)。若希望在首次准备失败时当场清理未完成产物,可在运行 barn up 时加上 --rollback。

Linux 目录共享要求 QEMU 与客机内核均支持 9p;如果客机内核不支持,修正宿主路径也无法挂载,可改用 SSH/SCP/rsync 或支持 9p 的内核。该要求同样适用于 macOS 宿主;原生 macOS 客机使用独立的 VirtioFS。

SSH 失败

请依次检查 barn status、barn ssh-config 与 barn logs <node>:

  • 部署密钥恢复:若宿主侧公钥文件缺失,Barn 会在启动时根据完好的私钥自动重新派生;若私钥本身丢失,请从备份恢复原私钥——Barn 不会为已存在的虚拟机重新生成新身份。若控制节点内的私钥副本丢失,barn up 会报告 control-ssh 限制,此时宿主到客机的管理 SSH 依然可用。
  • 端口重分配与主机密钥隔离:若已停止虚拟机的回环管理端口被其他进程占用,下次启动时会自动改用空闲端口并刷新 ~/.ssh/barn_config。SSH 主机密钥按虚拟机实例 UUID 独立记录,因此重建节点不会引发 known_hosts 冲突。
  • 由 dotfile 工具管理的 ~/.ssh/config:当 ~/.ssh/config 是符号链接或硬链接时,Barn 只会生成 ~/.ssh/barn_config 并提示你手动添加 Include 行。若 barn ssh meta 正常而直接执行 ssh meta 失败,请先核对该 Include 配置。
  • 远端命令分隔符:在节点名与远端命令之间请使用 -- 分隔(如 barn exec meta -- hostname),详见 SSH 透传与命令补全。

镜像目录或镜像校验失败

Barn 二进制内置了 active 与 standby Minisign 公钥,会严格拦截未知签名者、目录版本回滚、文件尺寸或 SHA-256 不匹配以及存在安全隐患的 qcow2 结构。目录签名或签名 revision 校验失败时退出码为 7(error: integrity,reason: catalog_signature 或 catalog_equivocation);读取缓存签名时出现权限或 I/O 错误仍属于运行时错误(退出码 1)。请始终使用正确签名的镜像仓库,或通过 barn image import --sha256 ... 导入本地镜像,切勿直接将文件手动拷入 ~/.barn/images。

命令被中断

按下 Ctrl-C 或发送 SIGTERM 会取消命令,退出码为 130(cancelled)。Barn 会向它启动的进程发送 SIGTERM,sudo 会将其转发给特权命令;Barn 最多等待 10 秒,忽略 SIGTERM 的后代进程会继续运行,需要你自行停止。

命令中断后,请先运行 barn status:若后台仍有其他 Barn 命令持有部署锁,输出会附带 note 提示——请等待该命令自然结束,切勿将其视为异常中断。

当没有进程持锁时,barn status 会比对记录的 QEMU PID 与进程启动时间戳,确认进程真实身份后自动收敛状态:

中断场景 自动恢复与后续操作
宿主重启,或原 QEMU PID 被其他无关进程复用 barn status 识别出进程身份不匹配后将节点标记为 stopped,随后执行 barn start 即可
barn stop 中断,但 QEMU 仍在运行 barn status 将状态恢复为 running;仍需关机时再次执行 barn stop
在线 barn resize 在修改运行中客机后中断 barn status 报告 resize_incomplete;重新运行 barn resize <node> 或执行 barn restart <node>
首次 barn up 在准备阶段中断 修正清单后重新执行 barn up -f barn.yml,Barn 会自动回滚事务日志中未完成的产物
barn destroy 执行中途中断 按相同的销毁范围重新运行 barn destroy 或 barn purge 即可完成清理

如果 Barn 无法确认记录的进程身份(或者 QEMU 进程仍在运行但 QMP 套接字丢失),它会拒绝后续变更操作以防误杀无关进程。请保留现场状态目录并通过 barn logs <node> --source qemu --verbose 排查原因,切勿手动删除节点目录、套接字或篡改状态文件中的 PID。

在 GitHub 提交问题报告时,请附上完整命令与退出码、barn version、宿主操作系统与架构、QEMU 版本,以及开头三份 --json 诊断输出。

1.9 - 从源码构建

构建 Barn 1.2.0 或开发分支,准备 Mac 原生组件,并运行贡献者检查。

开发新功能或审阅发行版本时,可从源码构建 Barn。预编译 CLI 与 Apple Silicon 发行包内的原生应用包 Barn.app 均可直接安装,详见安装指南。

检出源码

克隆 v1.2.0 标签以复现本文档对应的发行版(开发主分支时可省略 --branch v1.2.0),并在提交构建记录时附上 git log -1 --oneline 与 git status --short:

git clone --branch v1.2.0 https://github.com/pgsty/barn.git
cd barn

v1.2.0 标签用于复现 Barn 1.2.0 发布说明所描述的已发布版本。开发构建不要设置 BARN_VERSION,避免将开发构建标记为正式的 1.2.0。

构建 CLI

Barn 1.2.0 在 go.mod 与 packaging/toolchain.env 中固定使用 Go 1.27.4,并依赖 Git、Make、Bash 与标准编译工具(仅编译 CLI 无需安装 QEMU 或配置宿主网络):

BARN_VERSION=1.2.0 make build
export PATH="$PWD/bin:$PATH"
barn version

make build 会在 bin/.barn-releases/ 下编译配套的 barn 与 barn-hosts-helper,将 helper 的 SHA-256 摘要嵌入 CLI,并在 bin/ 下创建入口符号链接。请始终使用 make build 而非裸跑 go build ./cmd/barn;移动构建产物时请一并保留 bin/.barn-releases/ 目录与 bin/ 下的两个链接。

未指定 BARN_VERSION 时,开发构建默认将版本号标记为 dev,工作区存在未提交改动时 commit 字段会显示为 uncommitted。

执行 make cross 可在 bin/darwin_amd64、bin/darwin_arm64、bin/linux_amd64 与 bin/linux_arm64 下交叉编译四个目标平台的 Go CLI 与 helper。构建产物(bin/、dist/、.goreleaser-*/)及实验环境清单不应纳入版本控制;在工作树内生成前,请确认对应路径已被忽略。

请针对准备使用的源码运行下方贡献者检查;历次带日期的验收记录见验证历史。

工具版本以当前检出的 packaging/toolchain.env 为准;正式发行包按签名与公证流程构建。

构建 Mac 原生组件

重新编译本地 Mac 组件前,请先停止正在使用它的所有 Mac 虚拟机。

在运行 macOS 27+ 的 Apple Silicon Mac 上,确认 xcrun 已指向 Xcode 27+(提供 macOS 27 SDK 与 Swift 编译器),然后执行:

BARN_VERSION=1.2.0 make mac-build
export PATH="$PWD/bin/mac:$PATH"
barn mac doctor

make mac-build 会在 bin/mac 下生成配套的 barn、barn-hosts-helper、独立运行器 barn-mac-runner 与原生应用包 Barn.app,同时打包生成 bin/barn-mac-darwin-arm64.tar.gz。可执行 make mac-native-test 运行原生组件测试套件,随后按 macOS 虚拟机教程创建虚拟机。

源码标签 原生应用包 应用标识符(Bundle ID)
v0.9.0 Barn Mac.app io.pgsty.barn.mac-runner
v0.9.1 及之后 Barn.app com.pgsty.barn

当前 CLI 同时兼容 Barn.app 与旧版 Barn Mac.app,而 0.9.0 CLI 仅查找 Barn Mac.app——请始终使用 bin/mac 下同批构建出的 CLI 与应用包。

代码签名与公证

未设置签名环境变量时,make mac-build 默认使用供本机开发测试的 ad-hoc 签名。如需进行证书签名或公证分发:

  • 设置 BARN_CODESIGN_IDENTITY 以使用 Developer ID 证书为 Barn.app 签名。
  • 设置 BARN_NOTARY_PROFILE 与 BARN_MAC_REQUIRE_NOTARIZATION=1,使构建流水线自动校验签名、提交 Apple 公证、装订票据(staple)并验证 Gatekeeper 状态。
  • 设置 BARN_CODESIGN_IDENTITY 后,make mac-build 也会先签名 Go helper,将最终 SHA-256 嵌入 CLI,再签名 CLI。Mac 发布手册进一步说明 CLI/helper/App 联合公证及导出载荷的发行验证。

运行贡献者检查

执行完整的 make check 还需要 Python 3、jq、支持竞态检测(-race)的 C 编译器,以及 packaging/toolchain.env 中固定版本的静态检查工具:

go install honnef.co/go/tools/cmd/staticcheck@v0.8.2
go install golang.org/x/tools/cmd/deadcode@v0.52.0
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.15.0
go install golang.org/x/vuln/cmd/govulncheck@v1.9.0

将 GOBIN(或 $(go env GOPATH)/bin)加入 PATH 后运行:

make test
make check

make check 会依次验证 Go 模块、Shell 脚本语法、仓库维护检查、单元与竞态测试、go vet、staticcheck、deadcode、golangci-lint、govulncheck、四平台交叉编译、镜像流水线与安装器测试以及依赖许可证合规性。打包快照验证流程请参阅发布工程。

1.10 - 卸载与清理

分别移除 Linux 与 macOS 虚拟机,再清理集成、镜像、网络和程序。

Barn 分别独立管理 Linux 实验环境与 macOS 虚拟机。barn purge 仅删除 Linux 部署,不会删除任何 Mac 虚拟机。 在完成虚拟机、宿主集成、镜像缓存和宿主网络的清理前,请先保留 barn 命令行程序。

选择清理范围

目标 命令
停止运行中的虚拟机并保留磁盘 barn stop;Mac 虚拟机使用 barn mac stop --all
删除单个 Linux 节点 barn destroy <node>
删除 Linux 实验环境,保留持久数据盘 barn destroy
删除 Linux 实验环境、持久数据盘与密钥 barn purge(默认直接删除,--ask 开启确认)
删除指定的 Mac 虚拟机 barn mac destroy <name...>(需输入确认词)

执行删除前,请先通过 barn status(Linux 节点)和 barn mac ls(Mac 虚拟机)核对名称,并将需要保留的文件备份到宿主。

完整清理步骤

  1. 销毁 Linux 与 Mac 虚拟机

    清空整套 Linux 实验环境(含已保留的持久数据盘与部署密钥):

    barn purge

    默认立即删除;如需先查看虚拟机列表与清理范围,改用 barn purge --ask,输入 y/yes 确认或 n/no 取消,不接受 --yes、-y 或 --force。如果还创建过 macOS 虚拟机,先查看列表再按名称逐一销毁:

    barn mac ls
    barn mac destroy mac1 dev
  2. 移除 SSH 与 /etc/hosts 集成

    整套销毁 Linux 部署时会自动移除默认的 ~/.ssh/barn_config 集成。若曾安装过自定义名称的 SSH 片段、/etc/hosts 主机名条目或 Mac SSH 集成,请依次清理:

    barn ssh-config --remove --name lab
    barn hosts uninstall --json
    barn hosts uninstall --yes
    barn mac ssh-config --remove

    以上命令仅清理 Barn 写入的受管配置块,不会影响你原有的 ~/.ssh/config 和 /etc/hosts 条目。

  3. 清理镜像缓存

    预览并删除本地缓存的 Linux 与 macOS 镜像文件:

    barn image prune --dry-run
    barn image prune --yes
    barn mac image prune --installers
    barn mac image prune --installers --yes
  4. 卸载 Linux 宿主网络

    先销毁 Linux 实验环境(只要还有 Linux 虚拟机在运行,该命令就会中止),再预览并卸载多用户共享的 Linux 宿主网络(Mac 虚拟机的私有网络会随虚拟机停止自动释放,无需单独卸载):

    barn network uninstall --json
    barn network uninstall --yes

    宿主网络由 systemd-networkd 管理时,如果存在其他宿主网络接口或无法确认由 Barn 独占,卸载会保留全局 networkd 单元状态;计划中会报告 preserve_networkd,执行结果在 checks.networkd 中说明原因。

  5. 卸载 Barn 程序与剩余文件

    通过包管理器安装的 Barn 可直接用对应命令卸载:

    Homebrew
    brew uninstall barn
    Debian / Ubuntu
    sudo apt remove barn
    RHEL / Fedora
    sudo dnf remove barn
    • 用户态安装脚本(install.sh):删除 ~/.local/bin 下的 barn、barn-hosts-helper、.barn-current、.barn-releases/ 与 .barn-install.lock,并移除 Shell 配置文件中的 PATH 设置。
    • 手动归档或源码构建:停止全部 Mac 虚拟机后,删除解压后的发行目录、bin/mac 或单独复制出去的 Barn.app(0.9.0 版本为 Barn Mac.app),以及保存窗口位置的 ~/Library/Preferences/com.pgsty.barn.plist(0.9.0 版本为 io.pgsty.barn.mac-runner.plist)。
    • 手动安装的 hosts helper:若曾手动安装 /opt/barn/libexec/barn-hosts-helper,在完成 barn hosts uninstall --yes 且确认本机无其他用户使用 Barn 后即可删除。
警告

请务必在销毁全部 Linux 和 Mac 虚拟机之后再删除 ~/.barn(或自定义 BARN_HOME)。 ~/.barn 同时存放两类虚拟机的运行状态、密钥、持久数据盘与基础镜像;若仍有虚拟机目录残留或 destroy 报错,请先通过 barn status / barn mac ls 排查原因,切勿直接递归强删目录。

2 - 参考

Barn 1.2.0 的配置字段、命令参数、输出格式与镜像仓库说明。

本节汇总 Barn 1.2.0 的全部命令、配置字段、输出格式与镜像仓库规则;版本表标明相对 1.1.0 的新增功能。需要按步骤上手操作时,请先阅读使用指南。

  • 命令参考 — 全部 Linux 与 macOS 命令、完整选项表、默认值、示例与可用版本
  • Linux 配置 — 清单发现顺序、变量继承、默认值、数据盘、目录共享与节点漂移规则
  • CLI 契约 — 全局参数、Linux 生命周期命令、JSON/YAML 结构化输出与退出码
  • Mac 运行时参考 — barn mac 子命令、虚拟机设置、JSON 输出结构、失败原因与文件布局
  • Linux 镜像 — 内置镜像目录 2026110502、版本别名、仓库验签、本地导入与缓存清理
  • 镜像流水线 — 面向贡献者的 Linux qcow2 候选镜像校验与离线归一化工具

Barn 的对外接口是 barn 命令行(可通过 barn version 与 barn <command> --help 查看当前安装版本);Go 仓库 internal/ 下的包属于内部实现。镜像表对应 Barn 1.2.0 二进制内置的镜像目录快照,日常运行 barn update 即可激活更新的签名仓库元数据,无需升级可执行文件。构建与发布门禁详见发布工程。

2.1 - 命令参考

逐项介绍 Barn 全部命令的语法、局部选项、默认值、使用示例与版本范围。

从下表选择命令,查看参数、完整局部选项、示例与操作范围。组织方式参考 PIG 的命令索引与命令组详解;结构化输出及退出码见 CLI 契约,清单字段见配置参考。

版本基线

本参考对应 2026-11-12 发布的 Barn 1.2.0,源码为 90f6158。中英文页面均已对照 CLI 帮助核对,覆盖 57 个操作命令与 174 项局部选项。

标记 可用范围 行为
1.1.0 1.1.0 与 1.2.0 均支持的选项 1.1.0 默认 2 vCPU / 4 GiB,通过清单调整 CPU/内存
1.2.0 1.2.0 新增 规格选项与环境变量、vm_scale、根盘扩容、生命周期 --parallel、vm_hosts 和 hosts install -f;默认规格改为 1 vCPU / 2 GiB

升级时如需保留旧默认值,请显式设置 vm_cpu: 2、vm_mem: 4GiB,并检查 barn plan。已应用 VM 的资源会保留到显式执行资源变更操作为止。用 barn version 和 barn COMMAND --help 核对已安装构建;另见发布说明与发布验收。

命令索引

任务 命令与详细参考
准备环境 setup、init、validate、doctor
规划与创建 plan、up
启停节点 start、stop、restart、reload
调整与检查 resize、recreate、status
删除部署 destroy、purge
访问 Linux 客机 ssh、exec、logs、provision、ssh-config
发布宿主名称 hosts install、hosts uninstall
刷新目录 update、image sync、image reset
管理 Linux 镜像 image list、info、pull、import、prune
维护镜像仓库 repo scan、build、verify
宿主网络 network status、install、uninstall
原生 macOS VM mac ls、up、start、stop、restart、configure、recreate、destroy
Mac 访问 mac open、ssh、exec、password、ssh-config、logs
Mac 准备 mac setup、doctor、image ls、image update、image prune
CLI 工具 version、completion、help

全局选项

barn [--json|--yaml] [-v|--verbose] COMMAND [arguments] [local options]
选项 含义
-h、--help 显示所选命令的可读帮助,退出 0
--json stdout 输出结构化 JSON,进度与诊断保留在 stderr
--yaml stdout 输出结构化 YAML,与 --json 互斥
-v、--verbose 向 stderr 输出有界诊断信息
--version 根命令的版本快捷选项;结构化版本报告用 barn version --json

全局输出选项可放在子命令前后,但必须在 ssh、exec 使用的远程命令分隔符 -- 之前。-f、-I、-A、-p、--yes 都是局部选项,以对应命令的表格为准。logs -f 表示跟随日志,mac logs -n 表示行数。长布尔选项支持 =true 或 =false。

BARN_OUTPUT、BARN_VERBOSE 设置输出默认值。BARN_HOME 选择私有状态目录,默认 ~/.barn,跨目录操作时建议使用绝对路径。Linux 与 Mac 机器共用数据根目录,但生命周期相互独立。详见环境变量与退出码。

barn 与帮助

barn
barn --help
barn help resize
barn image pull --help
barn --json

无参数时,文本模式打印完整帮助并退出 0,JSON/YAML 模式返回建议操作 actions[]。显式帮助始终输出可读文本。image、repo、network、hosts、mac image 命令组要求子命令,缺少时退出 2;mac 是例外,默认执行 mac ls。Linux 和 Intel Mac 的根帮助隐藏 mac,但仍可显式查看 Mac 命令帮助。

简写在父命令范围内生效,例如 barn im ls 等同 barn image list,barn mac st 等同 barn mac ls;各命令页列出了对应别名。purge 没有 rm 别名。

2.1.1 - 准备与工具

生成清单、准备宿主、校验配置,以及查看版本和生成补全脚本。

生成清单、准备宿主、校验配置,以及查看版本和生成补全脚本。

本参考对应 Barn 1.2.0;选项表区分 1.1.0 已有选项 与 1.2.0 新增选项,具体范围见版本基线。所有命令继承全局选项。

barn setup

barn setup [meta|dual|trio|full] [flags]

准备宿主软件包、固定 IP 网络、镜像与所选清单,然后运行 barn up 创建 Linux VM。meta、dual、trio、full 模板分别包含 1、2、3、4 个节点;未指定模板或 -f 时复用发现的清单,没有清单才生成 meta。-c 与规格选项用于生成模板,显式规格选项不能用来改写已有清单;1.2.0 复用清单时也忽略规格环境变量。

--dry-run 预览整个事务。执行需要终端确认或 --yes,系统提权仍可能询问密码。新生成且未经编辑的默认模板遇到子网冲突时,setup 可以选择空闲私有 /24,并将原模板备份为 barn.yml.before-network-change;显式清单保留原子网。Linux 宿主运行异架构客机时,需要另外安装目标 QEMU 模拟器与固件。

别名:s。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-c, --cidr string 规范的 RFC1918 IPv4 /24 子网;模板与网络安装默认 10.10.10.0/24 1.1.0
-C, --cpu string 缩放前的基础 vCPU 数,整数 1–256;最终 CPU 数也不能超过 256 1.2.0
-D, --disk string 根盘绝对容量,裸整数单位为 GiB,例如 128GiB;至少达到基础镜像虚拟容量 1.2.0
-d, --dry-run 仅预览计划,不修改状态 1.1.0
-f, --file string 要准备的清单;不能与模板位置参数同时使用 1.1.0
-I, --image string 镜像引用,如 u24、el9:stable 或 d13@20261103;覆盖所选节点的 vm_image/vm_version 1.1.0
-M, --mem string 缩放前的基础内存,裸整数单位为 MiB,例如 4GiB;至少 512 MiB 1.2.0
--mirror 使用中国官方源 https://repo.pigsty.cc/barn;显式 --repo 优先 1.1.0
-m, --mode string macOS 的 socket_vmnet 模式:host(默认)或 shared 1.1.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
-S, --scale string CPU 与内存的整数倍率,1–256;磁盘容量不缩放 1.2.0
-y, --yes 确认并执行显示的计划;系统 sudo 仍可能要求密码 1.1.0
barn setup --dry-run
barn setup full -I el9 --yes
barn setup -f pigsty.yml --yes
barn up

barn init

barn init [meta|dual|trio|full] [flags]

生成兼容 Pigsty 的 YAML 清单,默认在 ./barn.yml 写入单节点 meta 模板,控制节点地址为 .10;dual、trio、full 依次增加 .11、.12、.13 节点。覆盖已有文件必须加 --force,-o - 将清单输出到 stdout。本命令不下载镜像或准备宿主。

Barn 1.2.0 每节点默认 1 vCPU、2 GiB,使用 64 GiB 根盘和独立的 128 GiB /data 盘;生成的模板保存六项规格字段,包括 vm_scale。1.1.0 的 CPU 与内存默认值为 2 vCPU、4 GiB。详见规格默认值。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-c, --cidr string 规范的 RFC1918 IPv4 /24 子网;模板与网络安装默认 10.10.10.0/24 1.1.0
-C, --cpu string 缩放前的基础 vCPU 数,整数 1–256;最终 CPU 数也不能超过 256 1.2.0
-D, --disk string 根盘绝对容量,裸整数单位为 GiB,例如 128GiB;至少达到基础镜像虚拟容量 1.2.0
--force 覆盖目标清单文件;默认保留已有文件 1.1.0
-I, --image string 镜像引用,如 u24、el9:stable 或 d13@20261103;覆盖所选节点的 vm_image/vm_version 1.1.0
-M, --mem string 缩放前的基础内存,裸整数单位为 MiB,例如 4GiB;至少 512 MiB 1.2.0
-o, --output string 目标文件,默认 ./barn.yml;- 表示输出到 stdout 1.1.0
-S, --scale string CPU 与内存的整数倍率,1–256;磁盘容量不缩放 1.2.0
barn init
barn init full -I el9 -A amd64 -o lab.yml
barn init dual -c 10.20.30.0/24 -o -

barn validate

barn validate [flags]

读取清单并校验 Barn 使用的字段,输出解析后的节点;不接受节点位置参数。未指定 -f 时依次在当前目录寻找 barn.yml、barn.yaml、pigsty.yml、pigsty.yaml;找不到清单就报错,即使存在已应用状态也不回退。覆盖参数仅对本次校验生效,--json 可查看解析后的规格,与现有部署比较则用 plan。

别名:v。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-C, --cpu string 缩放前的基础 vCPU 数,整数 1–256;最终 CPU 数也不能超过 256 1.2.0
-D, --disk string 根盘绝对容量,裸整数单位为 GiB,例如 128GiB;至少达到基础镜像虚拟容量 1.2.0
-f, --file string 要校验的清单;省略时在当前目录发现,不回退到已应用状态 1.1.0
-I, --image string 镜像引用,如 u24、el9:stable 或 d13@20261103;覆盖所选节点的 vm_image/vm_version 1.1.0
-M, --mem string 缩放前的基础内存,裸整数单位为 MiB,例如 4GiB;至少 512 MiB 1.2.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
-S, --scale string CPU 与内存的整数倍率,1–256;磁盘容量不缩放 1.2.0
barn validate -f lab.yml
barn --json validate -f lab.yml -I u24 -A arm64

barn doctor

barn doctor [flags]

检查 QEMU、原生加速、固件、OpenSSH、短暂的加速启动测试和宿主网络;不接受清单或节点参数。缺少计算能力时命令失败,尚未准备网络则作为提示报告。网络细节用 barn network status 检查,原生 macOS VM 用 barn mac doctor。

别名:dt。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn doctor
barn --json doctor
barn doctor --verbose

barn version

barn version [flags]

输出版本、源码提交、构建时间、宿主操作系统与架构。1.2.0 通常显示 dev,正式版本标识来自构建时写入的信息。核对文档或提交问题时保留这份输出,也可用根命令的 barn --version。

别名:ver。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn version
barn --json version

barn completion

barn completion [bash|zsh|fish|powershell] [flags]

必须指定 bash、zsh、fish 或 powershell 中的一种 shell,将补全脚本输出到 stdout;命令本身不安装脚本。补全涵盖各命令的选项、模板、镜像别名与可读取的节点名,升级 Barn 后应重新加载。加载 shell 代码时使用文本输出。

除 --help 外没有局部选项,仍可使用全局输出选项。

source <(barn completion bash)
barn completion zsh > "${fpath[1]}/_barn"
barn completion fish > ~/.config/fish/completions/barn.fish
barn completion powershell

实现依据

command_setup.go · command_misc.go · command_root.go

发布源码与相对 1.1.0 的变化见版本基线。

2.1.2 - Linux 生命周期

规划、创建、启停、调整、查看和显式删除 Linux 虚拟机。

规划、创建、启停、调整、查看和显式删除 Linux 虚拟机。

本参考对应 Barn 1.2.0;选项表区分 1.1.0 已有选项 与 1.2.0 新增选项,具体范围见版本基线。所有命令继承全局选项。

节点参数使用 meta、node-1 等解析后的名称,省略时选择该命令清单或已应用范围内的全部节点;IP、组名、vm_alias 均不能作为选择器。plan、up、reload、resize、recreate 依次读取 -f、当前目录清单、已应用状态,其他生命周期命令直接使用已应用状态。

规格覆盖、缩放和环境变量见配置参考。1.2.0 并发选项只适用于下文列出 --parallel 的命令,plan、resize、status 不接受它。结构化结果与退出码见 CLI 契约。

barn plan

barn plan [node...] [flags]

将有效期望清单与已应用状态比较,输出精确镜像、资源、逐盘动作,以及需要创建、调整资源、重建、启动或显式移除的节点,不改变 VM 或下载镜像。目录镜像仅需本地元数据,具名本地镜像还需要 qemu-img。

退出码 0 表示成功生成计划,也可能是因清单遗漏节点而阻塞的计划;脚本需检查 action、blocked 和变更数组。显式选择节点时保留其他节点的已应用定义。结果格式见计划输出。

别名:pl。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-C, --cpu string 缩放前的基础 vCPU 数,整数 1–256;最终 CPU 数也不能超过 256 1.2.0
-D, --disk string 根盘绝对容量,裸整数单位为 GiB,例如 128GiB;至少达到基础镜像虚拟容量 1.2.0
-f, --file string 显式清单路径;生命周期命令依次使用该文件、当前目录发现的清单、已应用状态 1.1.0
-I, --image string 镜像引用,如 u24、el9:stable 或 d13@20261103;覆盖所选节点的 vm_image/vm_version 1.1.0
-M, --mem string 缩放前的基础内存,裸整数单位为 MiB,例如 4GiB;至少 512 MiB 1.2.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
-S, --scale string CPU 与内存的整数倍率,1–256;磁盘容量不缩放 1.2.0
barn plan
barn plan -f pigsty.yml meta
barn --json plan -I u24 -A amd64

barn up

barn up [node...] [flags]

创建缺失节点、启动已停止节点,并在保留健康 VM 进程的同时重试未完成的客机配置。默认等待管理 SSH 就绪,随后更新宿主 SSH 别名、客机 hosts 与控制节点 SSH 条目;非致命客机配置问题放入 warnings,已就绪节点仍视为成功。

首次交互运行时可以准备缺失的宿主依赖;清单与部署状态都不存在时会生成 meta。脚本应先运行 setup --yes。已有节点的定义变化需用 resize 或 recreate,清单遗漏的节点需显式 destroy。--rollback 仅清理本轮准备失败节点中尚未提交且可安全回收的制品。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-C, --cpu string 缩放前的基础 vCPU 数,整数 1–256;最终 CPU 数也不能超过 256 1.2.0
-D, --disk string 根盘绝对容量,裸整数单位为 GiB,例如 128GiB;至少达到基础镜像虚拟容量 1.2.0
-f, --file string 显式清单路径;生命周期命令依次使用该文件、当前目录发现的清单、已应用状态 1.1.0
-I, --image string 镜像引用,如 u24、el9:stable 或 d13@20261103;覆盖所选节点的 vm_image/vm_version 1.1.0
-M, --mem string 缩放前的基础内存,裸整数单位为 MiB,例如 4GiB;至少 512 MiB 1.2.0
--mirror 使用中国官方源 https://repo.pigsty.cc/barn;显式 --repo 优先 1.1.0
-n, --no-wait QEMU 启动并通过进程身份核验后返回;SSH 就绪与客机恢复延后到下一次 up 1.1.0
-p, --parallel int 节点并发上限;省略时为 max(1, 逻辑 CPU 数 - 2),0 表示所选节点全部并发 1.2.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
--rollback 清理本次准备失败节点中尚未提交、可以安全回收的制品 1.1.0
-S, --scale string CPU 与内存的整数倍率,1–256;磁盘容量不缩放 1.2.0
barn up
barn up -f pigsty.yml meta
barn up --mirror --rollback
barn up meta --no-wait

barn start

barn start [node...] [flags]

按已应用状态启动所选已停止节点并等待 SSH,使用同一 BARN_HOME 时可从任意目录执行,不读取清单或创建新节点。启动会刷新 SSH 访问配置;已经运行的 VM 需要补做客机配置时用 up。共享目录不可用只影响对应节点,独立节点继续执行。

选项 含义 / 默认值 可用版本
-n, --no-wait QEMU 启动并通过进程身份核验后返回;SSH 就绪与客机恢复延后到下一次 up 1.1.0
-p, --parallel int 节点并发上限;省略时为 max(1, 逻辑 CPU 数 - 2),0 表示所选节点全部并发 1.2.0
barn start
barn start meta --no-wait

barn stop

barn stop [node...] [flags]

核验已记录的进程身份后停止所选 Linux VM,保留根盘、数据盘、密钥与部署状态。未指定名称时停止整套 Linux 部署;原生 macOS VM 和宿主网络分别由各自命令管理。

选项 含义 / 默认值 可用版本
-p, --parallel int 节点并发上限;省略时为 max(1, 逻辑 CPU 数 - 2),0 表示所选节点全部并发 1.2.0
barn stop meta
barn stop

barn restart

barn restart [node...] [flags]

使用已应用状态停止并重新启动已有节点,不读取清单修改。需要重新读取清单用 reload,应用已有节点的定义变化用 resize 或 recreate。默认等待 SSH,--no-wait 可跳过等待。

选项 含义 / 默认值 可用版本
-n, --no-wait QEMU 启动并通过进程身份核验后返回;SSH 就绪与客机恢复延后到下一次 up 1.1.0
-p, --parallel int 节点并发上限;省略时为 max(1, 逻辑 CPU 数 - 2),0 表示所选节点全部并发 1.2.0
barn restart
barn restart meta --no-wait

barn reload

barn reload [node...] [flags]

先校验期望规格与启动依赖,通过后才停止所选节点并按 up 流程收敛,可以创建清单中新增加的节点。需要调整资源或重建的变更,以及清单遗漏的已应用节点,都会在停止任何 VM 前阻止执行。仅按已记录配置重启时用 restart。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-C, --cpu string 缩放前的基础 vCPU 数,整数 1–256;最终 CPU 数也不能超过 256 1.2.0
-D, --disk string 根盘绝对容量,裸整数单位为 GiB,例如 128GiB;至少达到基础镜像虚拟容量 1.2.0
-f, --file string 显式清单路径;生命周期命令依次使用该文件、当前目录发现的清单、已应用状态 1.1.0
-I, --image string 镜像引用,如 u24、el9:stable 或 d13@20261103;覆盖所选节点的 vm_image/vm_version 1.1.0
-M, --mem string 缩放前的基础内存,裸整数单位为 MiB,例如 4GiB;至少 512 MiB 1.2.0
--mirror 使用中国官方源 https://repo.pigsty.cc/barn;显式 --repo 优先 1.1.0
-n, --no-wait QEMU 启动并通过进程身份核验后返回;SSH 就绪与客机恢复延后到下一次 up 1.1.0
-p, --parallel int 节点并发上限;省略时为 max(1, 逻辑 CPU 数 - 2),0 表示所选节点全部并发 1.2.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
--rollback 清理本次准备失败节点中尚未提交、可以安全回收的制品 1.1.0
-S, --scale string CPU 与内存的整数倍率,1–256;磁盘容量不缩放 1.2.0
barn reload -f pigsty.yml
barn reload meta --mirror

barn resize

barn resize [node...] [flags]

调整 CPU/内存并扩大根盘,保留 VM 身份、磁盘与 SSH 密钥。目标规格来自清单、环境变量或命令行覆盖。支持的 CPU/内存增加操作使用热插拔,减少资源或不支持在线修改时使用停机再启动。镜像、架构、数据盘、网络、共享目录、节点创建和移除均不能通过 resize 应用。

1.2.0 还接受资源参数,并可用 -D 128GiB 原地扩容根盘:停止 QEMU、扩展镜像、启动客机扩展并核验最后一个普通 ext4/XFS 根分区,原先停止的 VM 最后恢复为停止状态。目标只能增加,且须对齐 512 字节。中断后用同一目标重试;不支持缩小、LVM、加密根盘或非末尾分区。详见根盘扩容与恢复。命令行覆盖不改写清单。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-C, --cpu string 缩放前的基础 vCPU 数,整数 1–256;最终 CPU 数也不能超过 256 1.2.0
-D, --disk string 根盘绝对容量,裸整数单位为 GiB,例如 128GiB;至少达到基础镜像虚拟容量 1.2.0
-f, --file string 显式清单路径;生命周期命令依次使用该文件、当前目录发现的清单、已应用状态 1.1.0
-I, --image string 镜像引用,如 u24、el9:stable 或 d13@20261103;覆盖所选节点的 vm_image/vm_version 1.1.0
-M, --mem string 缩放前的基础内存,裸整数单位为 MiB,例如 4GiB;至少 512 MiB 1.2.0
-S, --scale string CPU 与内存的整数倍率,1–256;磁盘容量不缩放 1.2.0
barn plan -f pigsty.yml meta
barn resize -f pigsty.yml meta
barn --json status meta

barn recreate

barn recreate [node...] [flags]

按期望清单替换所选 VM,会删除这些节点的根盘与非持久数据盘,并重新挂接兼容的持久盘。先用 plan 检查范围;终端要求输入 recreate,脚本必须传 --yes 或 --force,没有 -y 简写。

不选节点时应用整个清单;清单遗漏已有节点会在停止 VM 前报错,需先显式销毁该节点或将它加回清单。选择性重建保留其他节点,成功后也会刷新 SSH 访问配置。

别名:rc。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-C, --cpu string 缩放前的基础 vCPU 数,整数 1–256;最终 CPU 数也不能超过 256 1.2.0
-D, --disk string 根盘绝对容量,裸整数单位为 GiB,例如 128GiB;至少达到基础镜像虚拟容量 1.2.0
-f, --file string 显式清单路径;生命周期命令依次使用该文件、当前目录发现的清单、已应用状态 1.1.0
--force 跳过交互确认;无终端执行销毁或重建时必须显式确认 1.1.0
-I, --image string 镜像引用,如 u24、el9:stable 或 d13@20261103;覆盖所选节点的 vm_image/vm_version 1.1.0
-M, --mem string 缩放前的基础内存,裸整数单位为 MiB,例如 4GiB;至少 512 MiB 1.2.0
--mirror 使用中国官方源 https://repo.pigsty.cc/barn;显式 --repo 优先 1.1.0
-n, --no-wait QEMU 启动并通过进程身份核验后返回;SSH 就绪与客机恢复延后到下一次 up 1.1.0
-p, --parallel int 节点并发上限;省略时为 max(1, 逻辑 CPU 数 - 2),0 表示所选节点全部并发 1.2.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
-S, --scale string CPU 与内存的整数倍率,1–256;磁盘容量不缩放 1.2.0
--yes 确认并执行显示的计划;系统 sudo 仍可能要求密码 1.1.0
barn plan meta
barn recreate meta
barn recreate -f pigsty.yml meta --yes

barn status

barn status [node...] [flags]

检查已记录的节点配置与当前 QEMU 进程身份,无需位于清单目录。running 表示已核验 VM 进程存在,不能据此判断 SSH 就绪。--verbose 增加运行时细节,--json 返回节点记录、正在进行的操作说明和失败信息。退化节点可能使命令退出 5,健康节点仍会列出。1.2.0 文本输出使用 2c4g 这样的紧凑 SPEC 值。

别名:st。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn status
barn status meta --verbose
barn --json status

barn destroy

barn destroy [node...] [flags]

删除所选 VM,未指定节点时删除整套部署。根盘与非持久数据盘会被删除,持久盘默认保留;终端要求输入 destroy,脚本必须传 --yes 或 --force,没有 -y。

--delete-persistent 和 --purge 仅支持整套部署,后者还删除部署密钥与状态。镜像缓存、宿主网络和原生 Mac VM 保留。删除控制节点后,第一个剩余节点接任控制角色;随后更新 admin_ip 并运行 up 配置其控制 SSH 访问。

别名:de。

选项 含义 / 默认值 可用版本
--delete-persistent 同时删除归 Barn 所有的持久数据盘,仅支持整套部署 1.1.0
--force 跳过交互确认;无终端执行销毁或重建时必须显式确认 1.1.0
-p, --parallel int 节点并发上限;省略时为 max(1, 逻辑 CPU 数 - 2),0 表示所选节点全部并发 1.2.0
--purge 同时删除持久盘、部署密钥与状态,仅支持整套部署 1.1.0
--yes 确认并执行显示的计划;系统 sudo 仍可能要求密码 1.1.0
barn destroy meta
barn destroy --yes
barn destroy --yes --purge

barn purge

barn purge [flags]

立即删除整套 Linux 部署,包括根盘、持久数据盘、密钥、状态和默认 SSH 配置片段,不接受节点名或读取清单。没有 --yes、-y、--force 选项;需要先审阅范围时用 --ask,输入 y/yes 确认,回车取消。

镜像缓存、宿主网络和 Mac VM 保留。部署不存在时幂等成功,遗留制品身份不明时仍需核验。1.2.0 的 --parallel 控制清理过程中的节点并发。

选项 含义 / 默认值 可用版本
--ask 先显示节点与删除范围,要求输入 y/yes;n/no 或回车取消 1.1.0
-p, --parallel int 节点并发上限;省略时为 max(1, 逻辑 CPU 数 - 2),0 表示所选节点全部并发 1.2.0
barn purge --ask
barn --json purge

实现依据

command_lifecycle.go · main.go

发布源码与相对 1.1.0 的变化见版本基线。

2.1.3 - 客机访问与 hosts

连接 Linux 客机、执行脚本、读取日志,以及发布 SSH 和 hosts 条目。

连接 Linux 客机、执行脚本、读取日志,以及发布 SSH 和 hosts 条目。

本参考对应 Barn 1.2.0;选项表区分 1.1.0 已有选项 与 1.2.0 新增选项,具体范围见版本基线。所有命令继承全局选项。

barn ssh

barn ssh [flags] [node] [-- command...]

打开所选已准备节点的交互 SSH 会话,默认选择已准备的控制节点,否则选第一个已准备节点。远程命令必须放在 -- 后,参数会像普通 ssh 一样合并后交给远程 shell 解析;Barn 选项放在分隔符前。节点参数必须是解析后的节点名,不能使用 IP、别名或组名。

远程命令的退出码原样传回。结构化交互 SSH 将会话输出发送到 stderr,最终报告写入 stdout。详见 SSH 参数规则。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn ssh
barn ssh meta
barn ssh meta -- 'df -h /data; id'

barn exec

barn exec [flags] [node] -- command...

在所选已准备节点运行一个远程命令,默认节点选择规则与 ssh 一致。必须使用 --,首个命令参数不能为空;分开的参数保留空格、引号以及后续空值。管道、重定向和变量展开请用 sh -c,也兼容将单个完整字符串作为 shell 命令。

文本模式转发子进程输出与退出码;结构化结果包含 success、exit_code、stdout、stderr。远程非零退出码原样返回,应先检查报告再判断是否属于 Barn 自身错误。

别名:ex。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn exec meta -- hostname
barn exec meta -- printf '<%s>\n' 'a b' ''
barn --json exec meta -- sh -c 'echo out; exit 17'

barn logs

barn logs [node] [flags]

读取所选节点的串口或 QEMU 诊断日志,默认选已准备的控制节点或第一个已准备节点。--source events 读取部署级有界事件日志,不接受节点参数,可在部署状态建立前使用。跟随模式持续输出流,-f 在这里表示跟随日志,不是清单文件。QEMU 参数仅在详细输出开启时显示。

别名:l。

选项 含义 / 默认值 可用版本
-f, --follow 持续读取新增日志;文本输出字节流,JSON 输出 NDJSON,YAML 输出文档流 1.1.0
-s, --source string 日志源:serial(默认)、qemu 或部署级 events 1.1.0
barn logs meta
barn logs meta --source qemu
barn logs --source events --follow
barn --json logs meta --follow

barn provision

barn provision [node...] [flags]

通过已验证的部署 SSH 连接,将本地 Bash 脚本流式发送给所选运行中节点;未选节点时针对全部节点。脚本不会作为文件留在客机,执行记录包含脚本摘要;命令不创建或启动 VM。

必须指定 --script,默认串行执行,整个操作默认超时一小时。此处 --parallel 0 无效,与 1.2.0 生命周期并发规则不同。--sudo 在客机使用非交互的 sudo -n,需确保客机用户已有权限。结构化输出可以检查各节点的执行结果与失败。

选项 含义 / 默认值 可用版本
-p, --parallel int 正整数并发上限,默认 1;不接受 0 1.1.0
-s, --script string 必填:将此本地 Bash 脚本通过 SSH 传给所选客机执行 1.1.0
--sudo 在客机通过 sudo -n 执行脚本 1.1.0
-t, --timeout duration 整个操作的截止时间,正时长;默认 1h 1.1.0
barn provision --script ./check.sh meta
barn provision --script ./bootstrap.sh --sudo --parallel 2 --timeout 30m

barn ssh-config

barn ssh-config [node...] [flags]

默认打印 Linux 部署的 OpenSSH 配置片段。--install 写入片段并在 ~/.ssh/config 加一条 Include,打印和安装都可选节点;--remove 只移除指定的 Barn 片段,不依赖部署状态,也不接受节点名。安装与移除选项互斥。

默认前缀为 barn,片段路径为 ~/.ssh/barn_config,普通生命周期命令会自动维护。用户 SSH 配置无法安全修改时,Barn 给出需要手工加入的 Include,直接使用 barn ssh 仍可连接。

别名:sc。

选项 含义 / 默认值 可用版本
-i, --install 安装 SSH 配置片段,并在 ~/.ssh/config 加入一条 Include 1.1.0
--name string SSH 别名与配置片段前缀,默认 barn 1.1.0
--remove 移除 Barn 安装的 SSH 配置片段与 Include 1.1.0
barn ssh-config
barn ssh-config --install meta
barn ssh-config --install --name lab
barn ssh-config --remove --name lab

barn hosts install

barn hosts install [flags]

通过摘要匹配的提权 helper,将已应用节点的名称和别名写入宿主 /etc/hosts 的 Barn 区块。终端先展示变更并询问;非交互或结构化模式默认只预览,显式 --yes 才执行。区块内容未变化时无需提权,up 不会自动发布此文件。

Barn 1.2.0 新增 -f pigsty.yml,可在创建 VM 前发布清单节点及 all.vars.vm_hosts。每次替换整个 Barn 区块,后来不带 -f 执行会移除仅来自清单的服务名,详见本机服务名。

别名:i。

选项 含义 / 默认值 可用版本
-f, --file string 发布清单节点、别名与 vm_hosts;无需预先创建 VM 1.2.0
-y, --yes 确认并执行显示的计划;系统 sudo 仍可能要求密码 1.1.0
barn hosts install --json
barn hosts install --yes

barn hosts uninstall

barn hosts uninstall [flags]

只移除宿主 /etc/hosts 中 Barn 管理的区块,保留其他条目,不需要清单或部署状态。终端模式展示计划并询问;非交互或结构化模式默认预览,--yes 才执行。移除此区块不删除 VM 或修改客机 DNS 配置。

别名:u。

选项 含义 / 默认值 可用版本
-y, --yes 确认并执行显示的计划;系统 sudo 仍可能要求密码 1.1.0
barn hosts uninstall --json
barn hosts uninstall --yes

实现依据

command_root.go · command_access.go · main.go

发布源码与相对 1.1.0 的变化见版本基线。

2.1.4 - 镜像命令

更新签名目录、查看和下载镜像、导入本地文件以及清理缓存。

更新签名目录、查看和下载镜像、导入本地文件以及清理缓存。

本参考对应 Barn 1.2.0;选项表区分 1.1.0 已有选项 与 1.2.0 新增选项,具体范围见版本基线。所有命令继承全局选项。

官方仓库和 HTTP 源必须提供受信任的分离签名。显式选择的自定义 HTTPS 仓库或本地目录可以不签名,但来源必须恰好是该仓库的 catalog.json;只要提供了签名,就必须验签成功。详见目录信任规则。

barn update

barn update [flags]

从所选仓库取得 catalog.json,并按仓库策略获取所需签名,通过信任与 revision 检查后原子激活。普通命令只使用本地元数据,不隐式刷新。本命令更新镜像元数据,不升级 Barn 可执行文件。仓库选择顺序为 --repo > --mirror > BARN_REPO > 全球官方源,详见仓库选择与信任。

选项 含义 / 默认值 可用版本
--mirror 使用中国官方源 https://repo.pigsty.cc/barn;显式 --repo 优先 1.1.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
barn update
barn update --mirror
barn --json update --repo /srv/barn

barn image list

barn image list [flags]

列出目录中的所有架构和已注册本地镜像,不接受镜像位置参数或架构过滤选项。读取本地活动目录,需要刷新时显式运行 barn update。barn images、barn im 都是镜像命令组的别名。

别名:ls。

选项 含义 / 默认值 可用版本
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
barn image list
barn --json image list
barn image list --repo /srv/barn

barn image info

barn image info [image[:channel]|image@version-prefix] [flags]

查看单个镜像的元数据与已验证缓存状态,省略镜像参数时使用目录默认值。可传家族名 u24、通道 u24:stable 或数字版本前缀 el9@9,架构默认原生。--architecture/-a 是 --arch/-A 的兼容写法,不下载镜像制品。别名与精确内置版本见 Linux 镜像。

别名:in。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
barn image info
barn image info u24 -A arm64
barn --json image info el9@9

barn image pull

barn image pull [image[:channel]|image@version-prefix] [flags]

下载所选制品,核验 SHA-256、字节大小、qcow2 结构和虚拟容量后激活缓存。省略镜像和架构时使用目录默认镜像与宿主原生架构,已有有效缓存可以复用。目录中的 upstream URL 记录来源,不作为下载失败时的备用地址。仍支持兼容写法 --architecture/-a;下载异架构镜像不会安装对应 QEMU 模拟器。

别名:p。

选项 含义 / 默认值 可用版本
-A, --arch string 客机架构:native、amd64、arm64;也接受 x86_64、x64、aarch64、a64 1.1.0
--mirror 使用中国官方源 https://repo.pigsty.cc/barn;显式 --repo 优先 1.1.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
barn image pull
barn image pull u24 --mirror
barn image pull d13 -A amd64 --repo /srv/barn

barn image import

barn image import <path> [flags]

将本地普通 qcow2 文件复制到私有缓存并校验容器,可选核对预期摘要。接受相对路径、~/ 与指向普通文件的符号链接,需要 qemu-img;导入不启动镜像、不安装 cloud-init,也不修改登录凭据。

指定 local-* 名称可注册不可变的清单引用,必须同时给出启动模式与源镜像登录用户。具名导入可用 -A 记录异架构,qcow2 元数据本身无法识别 CPU 架构;无名称导入不能使用 -A。使用时设置 vm_image 及匹配的 vm_arch。详见导入与缓存规则。

别名:i。

选项 含义 / 默认值 可用版本
-A, --arch string 与 --name 一起记录客机架构,默认 native;不会转换镜像架构 1.1.0
-b, --boot string 具名导入必填:bios 或 uefi 1.1.0
--name string 不可变的 local-* 别名,必须同时指定 --boot 与 --source-user 1.1.0
-s, --sha256 string 可选的预期 SHA-256;不匹配时导入失败 1.1.0
-u, --source-user string 具名导入必填:源镜像的登录用户 1.1.0
barn image import ./base.qcow2
barn image import ./base.qcow2 --name local-dev --boot uefi --source-user ubuntu -A arm64

barn image sync

barn image sync <url|path> [flags]

从精确 URL 或本地文件激活目录,按上面的信任规则读取旁边的 .minisig 签名,适用于恢复或导入;正常刷新已配置仓库应使用 update。--repo 指定替换哪个仓库的活动元数据。无签名自定义源必须恰好是 <repo>/catalog.json,任意位置的恢复文件则需要受信任签名。

旧 revision 需要 --allow-downgrade;对于允许无签名目录的自定义仓库,从曾签名的目录切换到无签名目录也需要此选项。它不会接受无效签名,也不绕过官方仓库的签名要求和 revision 内容检查。后续回退保护仍记住历史最高 revision。

别名:sy。

选项 含义 / 默认值 可用版本
--allow-downgrade 允许激活比历史最高 revision 更旧的签名目录 1.1.0
-r, --repo string 要替换活动目录的仓库 1.1.0
barn image sync /srv/barn/catalog.json
barn image sync --repo /srv/barn /srv/recovery/catalog.json
barn image sync --allow-downgrade /srv/recovery/catalog.json

barn image reset

barn image reset [flags]

为所选仓库重新激活当前二进制内置的镜像目录,保留回退保护使用的历史最高 revision。镜像缓存与 VM 磁盘保留;需要清理缓存时使用 image prune。

选项 含义 / 默认值 可用版本
-r, --repo string 要恢复为内置目录的仓库 1.1.0
barn image reset
barn --json image reset --repo /srv/barn

barn image prune

barn image prune [flags]

默认列出可回收缓存文件,--yes 才删除候选文件,与 --dry-run 互斥。所选仓库的活动目录、已应用节点的基础镜像摘要和本地别名注册表会保护所引用的文件;可识别的过期暂存文件也可清理,隔离的 .corrupt-* 文件保留。

预览和删除时应使用相同的仓库选择。删除按顺序执行,后续文件发生错误不会恢复已经删除的文件。详见清理规则。

别名:pr。

选项 含义 / 默认值 可用版本
-d, --dry-run 仅预览计划,不修改状态 1.1.0
-r, --repo string 镜像仓库 URL 或本地目录,优先于 BARN_REPO;支持 --mirror 的命令中也优先于该选项 1.1.0
-y, --yes 删除列出的无引用文件;不能与 --dry-run 同时使用 1.1.0
barn image prune --dry-run
barn image prune --repo /srv/barn --dry-run
barn image prune --repo /srv/barn --yes

实现依据

command_image.go · images.go

发布源码与相对 1.1.0 的变化见版本基线。

2.1.5 - 仓库命令

根据 repo.yaml 与 qcow2 制品扫描、构建和校验静态镜像仓库。

根据 repo.yaml 与 qcow2 制品扫描、构建和校验静态镜像仓库。

本参考对应 Barn 1.2.0;选项表区分 1.1.0 已有选项 与 1.2.0 新增选项,具体范围见版本基线。所有命令继承全局选项。

barn repo scan

barn repo scan <root> [flags]

扫描包含 repo.yaml 与平铺 images/ 目录的仓库根路径,报告已跟踪、缺失、未跟踪和不安全的 qcow2 文件,不修改文件,也不需要 qemu-img。扫描成功即退出 0,即使发现问题也是如此;自动化必须检查 missing 和 unsafe,不能只看退出码。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn repo scan /srv/barn
barn --json repo scan /srv/barn

barn repo build

barn repo build <root> [flags]

校验 repo.yaml,通过 qemu-img 检查声明的 qcow2 制品,计算最终摘要与大小,并原子生成 catalog.json。缺失或不安全的制品导致构建失败,未跟踪文件不会收录;repo.yaml 与镜像字节保持原样。

本命令不签名或发布目录。内容变化时递增 revision,保持制品文件名不可变,并在发布前使用独立的贡献者签名工具。详见仓库格式。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn repo build /srv/barn
barn --json repo build /srv/barn

barn repo verify

barn repo verify <root> [flags]

根据 repo.yaml 与实际镜像字节在内存中重建预期目录,要求与已有 catalog.json 逐字节一致,需要 qemu-img。本命令检查仓库内容一致性,分离签名由目录激活流程或签名工具验证。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn repo verify /srv/barn
barn --json repo verify /srv/barn

实现依据

command_repo.go

发布源码与相对 1.1.0 的变化见版本基线。

2.1.6 - 宿主网络命令

检查、安装和移除 Linux 客机使用的固定 IP 网络。

检查、安装和移除 Linux 客机使用的固定 IP 网络。

本参考对应 Barn 1.2.0;选项表区分 1.1.0 已有选项 与 1.2.0 新增选项,具体范围见版本基线。所有命令继承全局选项。

barn network status

barn network status [flags]

检查宿主上供 Linux 客机使用的唯一 Barn 网络,包括后端、已安装 CIDR、归属、健康状态和生命周期预检发现。--cidr 指定预期子网,省略时检查已安装子网;本操作只读。每个原生 Mac VM 的独立网络另行管理。

别名:st。

选项 含义 / 默认值 可用版本
-c, --cidr string 可选的预期私有 /24;省略时检查已安装子网 1.1.0
barn network status
barn --json network status --cidr 10.10.10.0/24

barn network install

barn network install [flags]

检查或安装宿主网络后端:macOS 使用 socket_vmnet,Linux 通过活动网络管理器配置 barn0。终端先展示提权计划并询问;结构化或非交互调用默认仅预览,--yes 才执行。新 Mac 建议先用 setup 获取锁定的 socket_vmnet 压缩包。

--archive、--interface-id 仅适用于 macOS,host/shared 是 macOS vmnet 模式,Linux 不接受 shared。已有网络必须匹配所选配置,变更子网或模式前先检查状态。

别名:i。

选项 含义 / 默认值 可用版本
-a, --archive string macOS 专用:锁定版本的本地 socket_vmnet 压缩包,仍需通过摘要校验 1.1.0
-c, --cidr string 规范的 RFC1918 IPv4 /24 子网;模板与网络安装默认 10.10.10.0/24 1.1.0
-i, --interface-id string macOS 专用:持久化的 vmnet UUID 1.1.0
-m, --mode string macOS 的 socket_vmnet 模式:host(默认)或 shared 1.1.0
-y, --yes 确认并执行显示的计划;系统 sudo 仍可能要求密码 1.1.0
barn network install --json
barn network install --cidr 10.10.10.0/24 --yes

barn network uninstall

barn network uninstall [flags]

仅移除 Barn 管理的网络配置并恢复已记录的宿主设置,运行中 Linux 客机会阻止卸载,应先停止。终端模式显示计划后询问,结构化或非交互调用默认预览,--yes 才执行。不会删除 VM 磁盘或原生 Mac 网络。

别名:u。

选项 含义 / 默认值 可用版本
-y, --yes 确认并执行显示的计划;系统 sudo 仍可能要求密码 1.1.0
barn stop
barn network uninstall --json
barn network uninstall --yes

实现依据

command_network.go

发布源码与相对 1.1.0 的变化见版本基线。

2.1.7 - macOS 命令

管理具名原生 macOS VM、桌面访问、恢复镜像与共享基础镜像。

管理具名原生 macOS VM、桌面访问、恢复镜像与共享基础镜像。

本文对应 Barn 1.2.0;下列选项在 1.1.0 中也已提供。

原生 macOS VM 需要 Apple Silicon、macOS 27+ 与匹配的 Barn.app(宿主上的原生应用包),应由已登录桌面的普通用户运行。状态位于 $BARN_HOME/mac,独立于 Linux 清单。

省略可选名称时,Barn 选择唯一已有 VM 或 mac1;存在多台机器且没有 mac1 时需显式指定。configure、recreate、destroy 始终要求名称,start、stop 可以传多个名称或 --all。宿主各应用合计最多同时运行两台 macOS VM,正在安装的基础镜像也计入限制。详见机器规则、网络、输出与文件。

Mac 容量单位采用二进制,即使写作 GB 也是如此,与 Linux 清单中的十进制 GB 不同;Mac 裸容量数字表示字节。这些命令忽略 Linux 的 BARN_IMAGE/BARN_ARCH/BARN_CPU/BARN_MEM/BARN_SCALE/BARN_DISK 覆盖。

barn mac ls

barn mac ls [flags]

列出每台 VM 的状态、地址、SSH 就绪情况、macOS 版本和资源,读取本地记录并查询运行中机器,不创建、下载或启动 VM。别名为 list、status、st;直接运行 barn mac 也执行此操作。

别名:list, status, st。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn mac ls
barn --json mac ls

barn mac up

barn mac up [name] [flags]

创建并启动具名 VM,默认名称为 mac1,等待 SSH 和免密 sudo 可用。没有已准备基础镜像时,先确认从 Apple 下载并安装 macOS,后续机器复用基础镜像。

创建参数只用于新 VM,已有 VM 的参数不匹配会报配置冲突;修改 CPU、内存或共享目录用 configure。--no-wait 返回时首次初始化可能尚未完成,随后运行不带该选项的 mac up NAME 完成密钥和 sudo 配置。

选项 含义 / 默认值 可用版本
--clipboard on|off on/off,也接受 true/false、yes/no;新 VM 默认开启,仅在桌面窗口聚焦时共享 1.1.0
--cpu int vCPU 数,默认 4;最小 2,最大为宿主逻辑 CPU 数;configure 省略时保留原值 1.1.0
--disk size 基础镜像磁盘容量,最小 32 GiB;首次默认 100 GiB,up 优先沿用已准备基础镜像的容量 1.1.0
--ipsw string 使用本地 Apple IPSW 恢复文件 1.1.0
--memory size 内存,默认 8 GiB;必须为整 MiB,范围为 4 GiB 至宿主内存;configure 省略时保留原值 1.1.0
-n, --no-wait VM 进程运行后返回;首次启动可能仍在初始化,随后运行 mac up NAME 完成就绪检查 1.1.0
--open VM 启动后打开桌面窗口 1.1.0
--share [name=]path[:ro] 可重复:[name=]path[:ro|:rw];默认可写,在客机 /Volumes/My Shared Files 中显示 1.1.0
--subnet string 独立的私有 /24 子网;auto 自动选择空闲子网,新 VM 默认自动选择 1.1.0
--user string 客机管理员用户名;默认宿主 macOS 用户名,名称无效时用 barn 1.1.0
-y, --yes 下载 Apple 恢复镜像前跳过询问;无终端下载时需要 1.1.0
barn mac up
barn mac up dev --cpu 8 --memory 16G --share ~/src --open
barn mac up build --yes --no-wait

barn mac start

barn mac start [name...] [flags]

启动已有 VM 并等待 SSH,不创建机器或下载镜像。可传多个名称或 --all,两者不能混用。普通启动要求机器已完成首次初始化;尚未初始化的 VM 用 up 完成,--recovery 则直接打开 macOS Recovery 桌面。

选项 含义 / 默认值 可用版本
--all 选择全部已有 VM;不能同时指定名称 1.1.0
-n, --no-wait VM 进程运行后返回;首次启动可能仍在初始化,随后运行 mac up NAME 完成就绪检查 1.1.0
--open VM 启动后打开桌面窗口 1.1.0
--recovery 启动 macOS Recovery 并打开桌面,不等待普通 SSH 就绪 1.1.0
barn mac start mac1
barn mac start --all
barn mac start mac1 --recovery

barn mac stop

barn mac stop [name...] [flags]

通过 macOS 正常关闭所选机器,等待两分钟后仍未停止则断电,并在结果中报告。可传多个名称或 --all;--force 立即断电,会丢失客机中未保存的工作。磁盘和机器配置保留。

选项 含义 / 默认值 可用版本
--all 选择全部已有 VM;不能同时指定名称 1.1.0
--force 立即断电,客机中未保存的工作会丢失 1.1.0
barn mac stop dev
barn mac stop --all
barn mac stop dev --force

barn mac restart

barn mac restart [name] [flags]

正常关闭一台 VM 后重新启动并应用配置,省略名称时遵循默认机器选择规则。不接受多个名称或 --all;可用 --open 打开桌面,--no-wait 跳过 SSH 等待。

选项 含义 / 默认值 可用版本
-n, --no-wait VM 进程运行后返回;首次启动可能仍在初始化,随后运行 mac up NAME 完成就绪检查 1.1.0
--open VM 启动后打开桌面窗口 1.1.0
barn mac restart dev
barn mac restart dev --open

barn mac configure

barn mac configure <name> [flags]

必须显式指定一台已有 VM,修改 CPU、内存、共享目录或子网时需先停止机器;剪贴板设置可以在运行时修改。磁盘和登录账户保持原样,配置在下次启动生效;当前会话的剪贴板同步可在菜单栏即时切换。省略的选项保留原设置,重复 --share 可添加或替换同名共享,--unshare 按名称移除共享。

选项 含义 / 默认值 可用版本
--clipboard on|off on/off,也接受 true/false、yes/no;新 VM 默认开启,仅在桌面窗口聚焦时共享 1.1.0
--cpu int vCPU 数,默认 4;最小 2,最大为宿主逻辑 CPU 数;configure 省略时保留原值 1.1.0
--memory size 内存,默认 8 GiB;必须为整 MiB,范围为 4 GiB 至宿主内存;configure 省略时保留原值 1.1.0
--share [name=]path[:ro] 可重复:[name=]path[:ro|:rw];默认可写,在客机 /Volumes/My Shared Files 中显示 1.1.0
--subnet string 独立的私有 /24 子网;auto 自动选择空闲子网,新 VM 默认自动选择 1.1.0
--unshare stringArray 可重复:删除指定名称的共享目录配置 1.1.0
barn mac stop dev
barn mac configure dev --cpu 8 --memory 16G --share ~/src
barn mac configure dev --unshare src --clipboard off
barn mac start dev

barn mac recreate

barn mac recreate <name> [flags]

必须显式指定机器名。擦除该 VM 磁盘,使用原名称、账户、资源、共享目录和地址重新克隆 macOS,客机文件、应用和设置全部丢失。终端要求输入 recreate,脚本需 --yes 或 --force,没有 -y。--update 使用最新已准备基础镜像,应先执行 mac image update。

选项 含义 / 默认值 可用版本
--force 跳过销毁或重建的确认;无终端时必须显式确认 1.1.0
-n, --no-wait VM 进程运行后返回;首次启动可能仍在初始化,随后运行 mac up NAME 完成就绪检查 1.1.0
--update 重建时使用最新已准备的基础镜像,先运行 mac image update 1.1.0
--yes 等同于 --force;没有 -y 简写 1.1.0
barn mac recreate dev
barn mac image update --yes
barn mac recreate dev --update --yes

barn mac destroy

barn mac destroy <name...> [flags]

必须显式指定一个或多个机器名,将机器断电并删除磁盘、密钥、密码和设置,保留共享基础镜像和其他机器。终端要求输入 destroy,脚本需 --yes 或 --force,没有 -y。宿主共享目录不会删除;未使用基础镜像用 mac image prune 清理。

选项 含义 / 默认值 可用版本
--force 跳过销毁或重建的确认;无终端时必须显式确认 1.1.0
--yes 等同于 --force;没有 -y 简写 1.1.0
barn mac destroy dev
barn mac destroy mac1 mac2 --yes

barn mac open

barn mac open [name] [flags]

显示 VM 的桌面窗口,机器已停止时会先启动。关闭窗口后 VM 继续在后台运行,剪贴板在窗口聚焦时共享。尚未完成首次初始化且已运行的 VM 可直接打开桌面;未运行时用 mac up NAME --open 继续首次启动。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn mac open
barn mac open dev

barn mac ssh

barn mac ssh [flags] [name] [-- command...]

使用该 VM 专属 SSH 私钥与固定的宿主密钥连接,省略远程命令时打开交互 shell。-- 前最多传一个已有机器名及 Barn 选项;远程命令必须放在 -- 后,按普通 SSH 方式拼接后交给远程 shell。远程退出码原样返回。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn mac ssh dev
barn mac ssh dev -- 'sw_vers; id'

barn mac exec

barn mac exec [flags] [name] -- command...

使用 VM 专属 SSH 连接运行远程程序,必须提供 -- 和非空首参数;分开的参数保留边界及后续空值,shell 表达式请显式使用 sh -c。也兼容单个命令字符串。Barn 选项置于 -- 前,远程退出码原样返回,结构化结果包含 stdout、stderr 和 exit_code。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn mac exec dev -- sw_vers
barn mac exec dev -- printf '<%s>\n' 'a b' ''
barn --json mac exec dev -- sh -c 'echo out; exit 3'

barn mac password

barn mac password [name] [flags]

读取客机登录账户的密码,用于桌面解锁及管理员询问。默认输出密码,--copy 改为复制到宿主剪贴板。密码文件与机器 SSH 私钥采用相同保护;注意选择输出位置。

选项 含义 / 默认值 可用版本
-c, --copy 复制登录密码到宿主剪贴板,替代终端明文输出 1.1.0
barn mac password dev
barn mac password dev --copy

barn mac ssh-config

barn mac ssh-config [flags]

打印全部 Mac VM 的 OpenSSH 配置片段,支持 ssh、scp、rsync 和编辑器按名称连接,每台机器使用独立私钥与固定宿主密钥。首台 VM 就绪时自动安装,生命周期命令持续更新。--remove 移除配置并保持停用,直到显式 --install;两选项互斥,也不接受机器选择器。已有 SSH 别名冲突时仅发布 IP 地址条目。

选项 含义 / 默认值 可用版本
-i, --install 安装 ~/.ssh/barn-mac_config 及其 Include,并重新启用自动维护 1.1.0
--remove 移除 Barn 安装的 Mac SSH 配置,并保持停用直到显式 --install 1.1.0
barn mac ssh-config
barn mac ssh-config --install
barn mac ssh-config --remove

barn mac logs

barn mac logs [name] [flags]

读取 VM 的 runner.log 尾部,包含启动、网络、关闭和 Apple Virtualization 错误。--lines/-n 为正整数,默认 100;这里的 -n 表示行数,不是跳过等待。没有跟随选项。

选项 含义 / 默认值 可用版本
-n, --lines int 读取最近的日志行数,正整数,默认 100 1.1.0
barn mac logs dev
barn mac logs dev --lines 200

barn mac setup

barn mac setup [flags]

提前准备共享 macOS 基础镜像:确认后从 Apple 下载 IPSW,或读取 --ipsw 指定的本地恢复文件,再安装为未启动的基础镜像。后续 VM 从它克隆。此命令不创建具名机器;直接 mac up 也会在需要时自动执行此准备。

选项 含义 / 默认值 可用版本
--disk size 基础镜像磁盘容量,最小 32 GiB;首次默认 100 GiB,up 优先沿用已准备基础镜像的容量 1.1.0
--ipsw string 使用本地 Apple IPSW 恢复文件 1.1.0
-y, --yes 下载 Apple 恢复镜像前跳过询问;无终端下载时需要 1.1.0
barn mac setup --yes
barn mac setup --ipsw ~/Downloads/restore.ipsw --disk 200G

barn mac image ls

barn mac image ls [flags]

列出缓存的 IPSW 恢复文件和已准备基础镜像,包括状态、占用空间及使用它们的 VM;别名为 list。这是本地状态查询,无需调用原生运行器。

别名:list。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn mac image ls
barn --json mac image ls

barn mac image update

barn mac image update [flags]

从 Apple 查询最新 macOS 27 恢复镜像,经确认后下载并安装为新机器的默认基础镜像;也可通过 --ipsw 指定本地文件。已有 VM 继续使用原基础镜像,显式 mac recreate NAME --update 才替换该 VM 磁盘。

选项 含义 / 默认值 可用版本
--ipsw string 使用本地 Apple IPSW 恢复文件 1.1.0
-y, --yes 下载 Apple 恢复镜像前跳过询问;无终端下载时需要 1.1.0
barn mac image update --yes
barn mac image ls

barn mac image prune

barn mac image prune [flags]

默认列出没有机器使用、且不是当前默认基础镜像的清理候选,只有传 --yes 才删除。--installers 同时纳入下载的 IPSW 与未完成下载。VM 的引用关系会保护仍在使用的基础镜像。

选项 含义 / 默认值 可用版本
--installers 将下载的 IPSW 与未完成下载也纳入清理范围 1.1.0
-y, --yes 删除列出的未使用镜像;省略时仅预览 1.1.0
barn mac image prune
barn mac image prune --installers --yes

barn mac doctor

barn mac doctor [flags]

只读检查宿主 macOS 与 Apple Silicon 支持、Mac 组件签名、可用磁盘空间、基础镜像以及每台 VM 的文件、密钥、共享目录、网络和 SSH,不修改或启动机器。Linux/QEMU 环境用顶层 barn doctor 检查。

除 --help 外没有局部选项,仍可使用全局输出选项。

barn mac doctor
barn --json mac doctor

实现依据

command_mac.go

发布源码与相对 1.1.0 的变化见版本基线。

2.2 - 配置

Barn 读取的 Pigsty 主机清单字段、默认值与节点级漂移行为。

本文对应 Barn 1.2.0,Linux 默认规格为 1 vCPU、2 GiB。升级时如需保留 1.1.0 的默认值,请显式设置 vm_cpu: 2、vm_mem: 4GiB。另见版本基线,并用 barn version 与 --help 核对已安装构建。

发现顺序

Barn 先检查命令行显式传入的 -f 路径;未指定 -f 时,依次在当前工作目录查找 barn.yml、barn.yaml、pigsty.yml 与 pigsty.yaml。四种文件名均使用同一种兼容 Pigsty 的 YAML 主机清单格式。

当前目录没有任何清单文件、但 BARN_HOME(默认 ~/.barn)中已存在部署时,plan、up、reload、recreate 与 resize 会直接使用已应用的部署规格;validate 则始终要求磁盘上存在清单文件。配置文件须解析为不超过 4 MiB 的普通文件,支持符号链接;共享源的相对路径以清单真实文件所在目录为基准。Barn 会采用按顺序找到的第一个候选文件;若该文件存在语法或规则错误,Barn 会直接报错退出,不会继续尝试后续文件名。

已应用的部署状态统一保存在 BARN_HOME 中,重命名清单文件不会改变部署;跨工作目录操作同一套部署时,请将 BARN_HOME 设为绝对路径。

完整配置示例

barn init [meta|dual|trio|full] 分别生成 1、2、3、4 节点的拓扑模板。meta 使用 .10,更大的模板依次增加 .11(node-1)、.12(node-2)与 .13(node-3);这些模板只定义虚拟机拓扑,上层 Pigsty 服务角色由你的 Ansible 剧本决定。使用 --cidr 可在保留末位主机号的前提下更换 /24 网段;运行 barn init full -o - 可将模板直接打印到标准输出而不落盘。

barn.yml
all:
  vars:
    admin_ip: 10.10.10.10
    vm_image: u24
    vm_cpu: 2
    vm_mem: 4GiB
    vm_disk: 64
  children:
    lab:
      hosts:
        10.10.10.10: { nodename: meta }
        10.10.10.11:
          nodename: worker
          vm_mem: 8GiB
          vm_disks:
            - { path: /data, size: 128, fs: auto, persistent: true }

上面的清单定义了两个托管节点,并以 meta 作为控制节点。将其保存为 barn.yml 后,可在不启动虚拟机的情况下校验配置并预览计划:

barn validate -f barn.yml
barn --json validate -f barn.yml
barn plan -f barn.yml

validate 只检查 YAML 语法、字段规则与镜像目录引用(传入 --repo 可改用其他仓库的目录校验),不会启动虚拟机或下载镜像。JSON 输出包含 valid、source、spec_hash 与 resolved;若本地镜像目录无法读取,结果会附带警告并跳过镜像选择器校验。真正执行 up 时,Barn 会进一步校验 local-* 导入镜像的缓存字节、宿主资源、共享目录、网络与客机 SSH 就绪状态。

Barn 读取什么

清单必须包含顶层 all: 分组,Barn 会遍历其中的 hosts 与嵌套 children 映射。Barn 直接解析静态 YAML,不执行 Ansible 动态清单插件或 Jinja 表达式,也不加载外部 group_vars 或 host_vars 文件。同一个 IPv4 地址出现在多个分组中时,Barn 会合并各组继承的变量,将其视为同一个节点。

Barn 只读取节点 IPv4 键、nodename、admin_ip、pg_cluster、pg_seq、node_admin_username、node_admin_uid 以及下表列出的 vm_* 变量:

  • 控制节点:Barn 从 all.vars 读取 admin_ip。未设置或未命中任何托管节点时,Barn 按 YAML 遍历顺序(先读当前组的 hosts,再递归读取 children)选择第一个托管节点。建议显式设置 admin_ip,以免调整分组顺序时改变控制节点。
  • 登录账号:所有节点必须使用同一个匹配 [a-z_][a-z0-9_-]{0,31} 的登录用户名。使用默认用户 dba 时,若显式设置 node_admin_uid,其值必须为 88;使用自定义用户名时,Barn 只检查 node_admin_uid 是否为整数,客机内实际 UID 由创建账号时自动分配。
  • 上层 Pigsty 字段:pg_role、pg_version、repo_*、node_packages 等不由 Barn 消费的字段会被安全忽略,修改它们不会触发虚拟机配置漂移。
  • 继承与严格校验:变量按 all.vars → 嵌套 children.<group>.vars → 节点变量的顺序覆盖。节点上声明的 vm_disks 等列表会整体替换组级列表,不会追加合并。同级分组对同一节点给出不同值时,必须在节点层级显式覆盖以消除冲突。未知的 vm_* 字段、错误类型、Jinja 表达式、重复 YAML 键以及多文档 YAML 流都会直接报错;报错时会指出违反的规则、问题值与行号,并提示拼写相近的 vm_* 字段名。支持 YAML 锚点与 << 合并键(显式键优先,合并序列中排在前面的映射次之)。
  • 跳过节点:vm_skip: true 的外部主机可使用主机名或 IPv6 键,不参与推导托管 /24;清单仍须保留一个托管节点。已部署节点被跳过时,plan 会标记为 missing,不会自动销毁。

VM 变量

变量 默认值 含义
vm_skip false 跳过该物理机或外部主机,不为它创建虚拟机
vm_image u24 镜像系列、:channel 通道引用或 image@version 版本选择器
vm_version 未设置 匹配该数值前缀的最新版本,例如 9 或 9.7
vm_arch native 部署级客机架构,默认跟随宿主;可显式指定 amd64 或 arm64
vm_cpu 1 基础 vCPU 核数,缩放后的有效核数必须在 1–256 内
vm_mem 2048 基础内存容量:裸整数按 MiB 计,也支持 8GiB 等带单位字符串(最低 512MiB)
vm_scale 1 只倍乘 CPU 和内存的正整数
vm_hosts [] 额外的本机 hosts 映射,只能在 all.vars 声明
vm_disk 64 根盘容量:裸整数按 GiB 计,也支持 64GiB 等带单位字符串
vm_disks [{path: /data}] 额外数据盘列表(默认挂载一块 128 GiB 非持久盘到 /data)
vm_alias [] 写入客机 /etc/hosts、SSH 配置及可选宿主 /etc/hosts 的附加别名
vm_shares [] QEMU 9p 宿主目录共享(Linux 与 macOS 宿主)

空节点条目(如 10.10.10.10: {})即可使用默认参数定义一台完整虚拟机。托管节点须使用同一 /24 内互不重复的可用地址。

裸整数在 vm_mem 中表示 MiB,在磁盘容量中表示 GiB。显式容量字符串接受正整数和不区分大小写的单位,例如 8G、512m、4gib、64GB。K/M/G/T 与 KiB/MiB/GiB/TiB 使用二进制倍率,KB/MB/GB/TB 使用十进制倍率。小数 1.5GiB 和无单位字符串 "8192" 无效。up 会检查根盘不小于基础镜像虚拟大小。

省略 vm_image 时,Barn 始终按二进制内置目录选择 u24(Ubuntu 24.04),自定义仓库中的 defaults.image 不会改写未设置 vm_image 的清单。此外,Barn 在解析清单时会先按内置目录将 ubuntu 等内置别名归一化为 u24;使用自定义仓库时,请在 vm_image 中直接填写规范系列名,不要将内置别名改指其他系列。

需要把镜像系列与版本前缀分开书写时,可配合使用 vm_version:

barn.yml
vm_image: el9
vm_version: "9.8"

若镜像目录中存在完全一致的版本号,Barn 优先精确匹配;否则按点号分段匹配版本前缀,并按整数大小选择匹配的最高版本(9.8 匹配最新的 9.8.* 构建,9 匹配最新的 9.x 版本,且 9.10 排在 9.9 之后)。vm_version 不能与已包含 :channel 或 @version 的 vm_image 同时使用。

1.2.0 的资源缩放

分别解析 vm_cpu、vm_mem 和 vm_scale:主机变量优先于最深层分组,其次是父组和 all.vars。缺省值依次为 1 vCPU、2048 MiB 和倍数 1。继承完成后只乘一次:

CPU  = 解析后的 vm_cpu(默认 1)× 解析后的 vm_scale(默认 1)
内存 = 解析后的 vm_mem(默认 2048 MiB)× 解析后的 vm_scale(默认 1)
配置 有效 CPU 有效内存
均未配置 1 2 GiB
vm_scale: 3 3 6 GiB
vm_cpu: 2、vm_scale: 3 6 6 GiB
vm_mem: 4GiB、vm_scale: 3 3 12 GiB
vm_cpu: 2、vm_mem: 4GiB、vm_scale: 3 6 12 GiB

主机的 vm_scale: 1 会覆盖分组的 vm_scale: 3,多层倍数不累乘;同层分组冲突需要在主机上覆盖。倍数接受 1–256 的整数,同时受最终 256 vCPU 上限和内存溢出检查约束。带引号的数字、小数、布尔值、null、零和负数均无效。基础内存仍需至少 512 MiB。根盘、数据盘和共享目录不受缩放影响。参数名为 vm_cpu 和 vm_mem,不提供 vm_memory 别名。

先执行 barn plan -f pigsty.yml,再用 barn resize -f pigsty.yml 应用 CPU/内存变更。旧部署若省略了这些字段,新版读取清单后会显示资源减少;升级前显式补上 vm_cpu: 2、vm_mem: 4096 即可保持旧默认规格。没有清单、直接使用已应用状态的命令会保留记录中的资源。

1.2.0 的本机服务域名

Barn 1.2.0 支持从清单发布 hosts。

在 all.vars.vm_hosts 中声明有限的服务映射。显式指定清单发布时,Barn 将它们与节点名、vm_alias 合并:

pigsty.yml
all:
  vars:
    vm_hosts:
      - {address: 10.10.10.10, names: [i.pigsty, m.pigsty]}
      - {address: 10.10.10.100, names: [pg-dns-service]}
  hosts:
    10.10.10.10: {nodename: meta}
barn hosts install -f pigsty.yml --json  # 预览,VM 创建前也可使用
barn hosts install -f pigsty.yml --yes  # 发布,sudo 可能要求密码
barn hosts uninstall --yes

每条记录必须包含 address 与非空 names 列表。地址必须是清单私网 /24 内的规范 IPv4,范围为 .9–.254;.1–.8 保留给宿主与 DHCP。同名同 IP 去重,名称按大小写不敏感比较;同名不同 IP 报错。Barn 管理块外已有冲突名称时也会停止发布。hosts 记录本身不会在客机上配置 VIP。

这些映射只影响宿主的 /etc/hosts,修改它们不会改变 VM 规格摘要、配置客机 DNS 或产生 VM 漂移。不带 -f 时,hosts install 只发布已应用 VM 状态中的名称和别名,并替换整个 Barn 管理块;需要保留服务域名时应始终显式指定清单。up 不会自动发布此文件。内容不变时无需 sudo,系统 hosts 内容有变时仍需权限。通配符、SRV 记录以及动态主库发现需要 DNS 服务。

Pigsty 1.2.0 的 bin/sandbox-dns 会提取 portal、节点、PostgreSQL、VIP 和 MinIO 名称,再交给此接口。具体范围见 迁移排查。

1.2.0 规格覆盖

Barn 1.2.0 支持六项规格的统一 CLI 与环境变量输入;1.1.0 支持镜像/架构选项,但没有新增的四项资源参数和这些环境变量。

清单字段 命令行 环境变量 默认值
vm_image --image/-I BARN_IMAGE u24
vm_arch --arch/-A BARN_ARCH native
vm_cpu --cpu/-C BARN_CPU 1
vm_mem --mem/-M BARN_MEM 2048 MiB
vm_scale --scale/-S BARN_SCALE 1
vm_disk --disk/-D BARN_DISK 64 GiB

每个字段分别采用 CLI > 非空环境变量 > 主机 > 最深子组 > 父组 > all.vars > 默认值。CPU 和内存始终表示基础值,覆盖完成后各乘一次最终 scale;磁盘容量不参与倍乘。-S 3 替换原来的倍数,指定精确最终 CPU/内存时加 -S 1。CLI 与环境变量覆盖选中节点的主机值;需要保留节点特例的公共默认值写在 all.vars。清单语法、字段类型和继承冲突仍必须有效。

barn init full -C 2 -M 4GiB -S 2 -D 128GiB
barn plan -f barn.yml -S 3
BARN_SCALE=2 barn validate -f barn.yml -S 1

init 和生成模板的 setup 写入全部六项选择,包括默认值;保存 CPU/内存基数和倍数。首次交互式 up 需要生成清单时也保存本次选择。已有文件上的生命周期覆盖仅改变本次期望规格,不回写 YAML;后续读取原文件会报告差异。没有清单、只剩应用状态时,--scale 或 BARN_SCALE 要求提供 -f;CPU/内存可以按隐式倍数 1 设置绝对值。

环境变量只影响接收相应规格的命令。status/start/stop/restart/destroy/purge、独立镜像管理和 barn mac 不读取这六项变量;setup 复用已有清单时也忽略它们。resize 接受 CPU/内存/scale、根盘容量及已有的 I/A 核对接口;BARN_DISK 仅用于根盘增长。空白环境值视为未设置,CLI 已遮蔽的无效环境值不报错,例如 BARN_CPU=bad barn plan -C 2。有效的环境覆盖会保留在后续命令的显式参数中。

--disk 设置系统根盘的绝对容量,必须不小于基础镜像的虚拟大小,计划使用目录元数据检查,创建时再次检查实际镜像。它适用于创建、显式重建,以及 resize -D 的根盘原地增长。扩容只支持末端普通 ext4/XFS 根分区,不支持缩盘;流程与恢复见 根盘扩容。重建会替换根盘和非持久数据盘。当前默认的 128 GiB /data 盘保持独立。

镜像与架构覆盖

镜像与架构遵循相同的规格优先级:命令行参数、非空环境变量、清单值,最后使用默认值。

默认客机架构与宿主一致:Apple Silicon 使用 arm64,Intel/AMD 宿主使用 amd64。可以通过命令行、环境变量或清单选择其他架构。优先级为 --arch/-A → BARN_ARCH → 清单 vm_arch → native(宿主架构);-A native 可以覆盖环境变量与清单,恢复跟随宿主。

架构值 别名 含义
native — 跟随当前宿主架构,也是未设置时的默认值
amd64 x86_64、x64 固定使用 x86-64 客机
arm64 aarch64、a64 固定使用 ARM64 客机

vm_arch 是整套部署共用的属性,请在 all.vars 中统一定义。每个托管节点必须解析为同一架构,不能用节点变量或节点选择器混合架构。

--image/-I 优先于 BARN_IMAGE 和所选节点的 vm_image/vm_version,不改变架构。未传该参数时,非空的 BARN_IMAGE 覆盖清单镜像。镜像目录必须提供目标架构的变体,否则报错;Barn 不会因为镜像缺少该变体而切换架构。

barn plan -I u24                 # 使用 Ubuntu 24.04,架构仍遵循环境变量、清单或宿主默认值
barn up -I u24 -A amd64          # 本次使用 amd64 Ubuntu 24.04
barn plan -A native              # 覆盖清单架构,按宿主架构预览
barn init full -I u24 -A arm64   # 将镜像与架构写入新清单

up、plan、reload、recreate、resize 和 validate 的覆盖只对本次期望配置生效,不改写清单。要长期保留选择,请设置 all.vars.vm_arch、相应节点或组的 vm_image,并移除被替代的 vm_version;init 与生成模板的 setup 会直接写入这些选择。setup 的 -I/-A 不能用于已有清单。

没有清单文件时,生命周期命令沿用已保存的部署规格,再应用显式覆盖。start 和 restart 始终使用已应用状态。已有 VM 的架构不会因省略 -A 或修改清单而自动改变:up 会报告漂移,实际切换架构需要选择全部已有节点执行 recreate。resize 应用 CPU/内存变更并扩大受支持的根盘;镜像和架构变更需要 recreate。

客机与宿主架构不同时使用 QEMU TCG。Linux 宿主的 barn setup 默认只安装本机架构的 QEMU;运行跨架构客机前,需安装对应的 qemu-system-* 与 UEFI 固件。加速方式与镜像例外见运行时策略。

数据盘

barn.yml
vm_disks:
  - path: /data
    size: 128
    fs: auto
    persistent: false

vm_disks 列表中的每一项定义一块附加虚拟块设备:

  • path:绝对挂载路径,自动规范化,支持空格、中文和 shell 标点。简单路径保留原有磁盘标识,其他路径生成稳定摘要标识。同一节点内标识须唯一,系统目录和重叠的挂载路径仍会被拒绝。
  • size:磁盘容量,默认 128(128 GiB),支持 GiB 整数或显式容量字符串。
  • fs:文件系统类型,支持 auto(默认)、xfs 或 ext4。对于空白的 auto 磁盘,客机具备 mkfs.xfs 时格式化为 XFS,否则使用 ext4;显式指定 xfs 或 ext4 时严格使用对应工具,不会降级回退。健康的已有文件系统会直接挂载复用。
  • persistent:设为 true 时,普通 barn destroy 与 barn recreate 会在宿主上保留该磁盘镜像;只要磁盘标识与声明保持兼容,重建后的节点会自动重新挂载它。设为 vm_disks: [] 则不挂载任何额外数据盘。
重要

数据盘定位于可丢弃的测试存储。 执行 up 时,Barn 会按配置的 fs 格式化空白数据盘。对于已有的 ext4 或 XFS 文件系统(包括 persistent: true 的持久盘),只有客机内的只读检查(e2fsck -fn 或 xfs_repair -n)报告可识别的损坏时才会重置,并在 nodes[].repairs 中记录。带分区表、签名缺少文件系统 UUID、其他文件系统类型、客机工具不支持的文件系统特性或检查工具未知失败的磁盘会保留数据,并在 nodes[].warnings 中给出警告;设备暂缺、探测命令报错、挂载忙碌或宿主 I/O 故障同样只报告警告。根盘与宿主共享目录绝不会被格式化。

目录共享

barn.yml
vm_shares:
  - host: ./src
    guest: /src
    readonly: true

vm_shares 通过 QEMU Virtio-9p 将 Linux 或 macOS 宿主目录挂载到 Linux 客机,默认 readonly: true。宿主 QEMU 与客机内核须支持 9p,共享数量受后端设备能力约束。原生 macOS 客机使用 barn mac --share 的 VirtioFS。

共享源按当前用户的实际文件系统权限访问:

  • host 支持绝对路径、~/、相对清单目录的路径与目录符号链接。guest 须为绝对路径并自动规范化,接受空格、中文和 shell 标点,不接受控制字符。
  • 解析后的宿主源须已存在、当前用户可访问且不与 BARN_HOME 重叠,无须归当前用户所有。
  • 宿主源可以重叠,多个客机可以同时读写,由用户协调并发写入。同一客机内的挂载目标仍不能重叠。
  • guest 路径不能覆盖数据盘挂载点、系统保留目录或登录用户的 .ssh 目录。9p 共享适合挂载开发源码与构建产物,请勿用于存放 PostgreSQL 数据目录。
  • 若请求了可写共享(readonly: false)但客机用户无权写入,Barn 会自动降级为只读挂载并报告警告,而不会递归修改宿主文件属主;调整宿主目录权限后重新执行 barn up 即可恢复可写挂载。
  • 修改已有节点的 vm_shares 需要执行 barn recreate。up 或 start 期间若某个节点的共享源目录缺失,只会使该节点失败,其余节点照常启动;restart、reload 与 recreate 则会在停止现有虚拟机前预先校验所有共享源目录。

名称与地址

Barn 依次按显式 nodename、<pg_cluster>-<pg_seq>、node-<IP末段> 确定节点名称。节点名称在部署内必须唯一,长度为 1–63 个字符,只能包含小写字母、数字与连字符,且不能以 - 开头或结尾。vm_alias 接受额外的小写 DNS 名称(允许包含点号),且不能与任何节点名或其他别名重复。

同一套部署中的所有托管节点必须位于同一个 RFC1918 /24 私有网段内:.1 固定为宿主网关,.2–.8 保留,节点使用 .9–.254。客机内部由固定 IP 网卡承载清单地址(可通过 ip -br addr 查看)。

漂移

显式节点选择只应用所选节点的改动:plan node-1、up node-1、reload node-1、recreate node-1 和 resize node-1 保留其他节点的已应用配置,即使清单中已修改或省略它们。整份清单仍须通过语法解析,未创建且未选中的节点不要求解析镜像。与已应用节点冲突的地址、别名、控制节点角色或部署公共设置仍会报错。

Barn 为每个解析后的节点计算规格哈希:

  • barn up 会创建新增节点、启动已停止节点,并在不重启 QEMU 进程的前提下重试运行中节点尚未完成的客机初始化步骤。
  • 修改节点的 CPU 或内存后使用 barn resize <node>,该操作保留虚拟机身份与磁盘。1.2.0 还通过 resize -D 支持根盘增长。修改镜像、数据盘、共享目录或其他虚拟机定义后,需要执行 barn recreate <node> 才能生效。从清单中删去节点(或设为 vm_skip: true)只会在 plan 中将其标记为 missing,Barn 绝不会自动销毁已有节点。
  • 修改部署级属性(vm_arch、登录用户名或 /24 子网)需要重建整套部署。
  • 由于 plan 与 up 会将镜像通道和版本前缀解析为具体的镜像摘要,执行 barn update 更新镜像目录后,即便 barn.yml 原文未改,也可能产生镜像版本漂移。建议为每个节点显式固定 nodename,避免修改 pg_cluster 时导致旧节点变成 missing 并额外派生出新节点。

2.3 - CLI 契约

Barn 命令、关键参数、结构化输出与退出码。

本页说明 Barn 1.2.0 的全局展示、Linux 生命周期语义、结构化输出与退出码;各命令的语法、选项、默认值与示例见命令参考。原生 Mac 运行时契约见 Mac 参考。

barn [--json|--yaml] [-v|--verbose] <command> [flags] [node...]

每条命令都提供内置 --help,用于查看当前二进制支持的参数与示例:

barn --help
barn setup --help
barn image pull --help

不带参数直接运行 barn 会打印与 barn --help 相同的完整帮助并以退出码 0 返回;传入 --json 或 --yaml 时则返回由建议命令组成的 actions[] 数组。只输入命令分组而不带子命令(如 barn image)会以退出码 2 返回(文本模式输出帮助,JSON/YAML 模式输出结构化 usage 错误)。显式传入 --help 始终打印人类可读的帮助文本并以 0 退出。查看构建版本信息请使用 barn --version 或 barn version。

命令

类别 命令
环境准备 setup、init、validate、doctor
生命周期 plan、up、start、stop、restart、reload、resize、recreate、status、destroy、purge
节点访问 ssh、exec、logs、provision、ssh-config、hosts install/uninstall
镜像管理 update、image list/info/pull/import/sync/prune/reset、repo scan/build/verify
宿主网络 network status/install/uninstall
macOS 客机 mac … — 见 Mac 命令
其他工具 version、completion

日常命令只读取本地已激活的镜像目录,不会隐式联网刷新。执行 barn update 可拉取、验签并激活所选仓库的最新镜像目录;需要从指定 URL 或本地文件恢复目录时,使用 barn image sync。这两条命令都不会更新 barn 可执行文件本身。

常用命令在各自作用域内支持短别名:

命令 别名 命令 别名
setup s validate v
plan pl recreate rc
status st destroy de
ssh-config sc image images、im
doctor dt network n、net
exec / logs ex / l version ver

up、ssh、init、start、stop、restart、reload、resize、provision、hosts、purge、update、repo、mac 与 completion 不设顶层短别名(rm 也不是 purge 的别名)。在子命令命名空间内,hosts 与 network 的 install/uninstall 可简写为 i/u,network status 可简写为 st;image 下支持 list=ls、info=in、pull=p、prune=pr、sync=sy 与 import=i。

Barn 在每个 BARN_HOME(默认 ~/.barn,详见配置发现规则)中管理唯一一套部署,只要 BARN_HOME 指向同一位置,操作已应用状态的命令就可在任意工作目录下执行;跨工作目录使用时请设置绝对 BARN_HOME。各条命令按如下规则确定期望配置来源(-f 是命令级参数而非全局参数):

命令 期望状态来源
setup [template] 优先使用显式 -f,其次按目录发现,否则生成 meta 模板(template 与 -f 互斥)
init [template] 直接生成新清单,不读取现有状态;传入 --force 可覆盖已有文件
validate 优先使用显式 -f,其次按目录发现;绝不回退到已应用状态
plan、up、reload、recreate、resize 依次查找显式 -f、当前目录清单,最后回退到已应用的部署规格
其他生命周期与访问命令 不读取清单文件,直接操作 BARN_HOME 中的已应用状态

在终端中,如果宿主缺少依赖或 Barn 网络,up、start、restart 与 reload 会像 barn setup 一样准备宿主:先展示宿主准备计划,在安装软件包或网络前询问一次(涉及特权操作时 sudo 仍会提示输入系统密码)。当前目录没有清单且 BARN_HOME 中也没有已部署环境时,交互式 barn up 还会先生成默认 meta 清单。没有终端时,这些命令只报告缺少的条件。运行 barn setup --dry-run 可查看准备计划,在脚本中请执行 barn setup --yes 准备宿主。

对于全新、未修改的默认模板,若默认 10.10.10.0/24 网段与宿主现有路由冲突,setup 会自动改选另一个空闲的私有 /24 网段,并将原文件备份为 barn.yml.before-network-change。显式传入的 -f 清单、已手动编辑的模板以及已存在的部署始终保留各自配置的网段。

关键参数

参数 含义
--json、--yaml 在 stdout 输出机器可读结果,进度信息仍输出到 stderr(仅提供长参数)
-v、--verbose 在 stderr 输出定长截断的诊断详情
-c、--cidr 为 init/setup 模板或宿主 network 检查/安装指定 RFC1918 /24 网段
-I、--image 为生成模板选择镜像,或在支持覆盖的命令中替代所选节点的 vm_image/vm_version
-A、--arch 选择客机或镜像架构:native、amd64(x86_64、x64)、arm64(aarch64、a64)
-f、--file 为读取期望状态的命令指定清单文件
-r、--repo 指定镜像仓库 URL 或本地路径,优先级高于 --mirror 与 BARN_REPO
--mirror 为 setup、up、reload、recreate、update 与 image pull 选用中国官方镜像源(https://repo.pigsty.cc/barn)
-m、--mode 在支持该参数的命令上选择 macOS host 或 shared 网络模式
-d、--dry-run 仅打印 setup 或 image prune 的执行计划,不修改系统状态
--yes 确认宿主、初始化、镜像或销毁计划;仅下表标明的命令支持 -y
--force(init、destroy、recreate) 覆盖已有清单(init)或跳过交互式确认词(因 -f 已用于选择清单,故仅设长参数)
--ask(purge) 删除前展示虚拟机列表与清理范围,要求输入 y/yes 确认
-n、--no-wait QEMU 进程启动后立即返回,跳过客机 SSH 就绪检查、磁盘恢复与配置刷新
--rollback(up、reload) 清理本次运行中准备失败、尚未提交状态的节点残留文件
--delete-persistent 整体销毁部署时一并删除 persistent: true 的持久数据盘
--purge 整体销毁部署时删除全部磁盘、密钥与状态,仅保留镜像缓存与宿主网络

各命令支持的局部参数如下表所示:

命令 专用参数
init --output/-o(默认 ./barn.yml,- 表示输出到 stdout)、--cidr/-c、--image/-I、--arch/-A、--force
setup [meta|dual|trio|full] --file/-f、--cidr/-c、--image/-I、--arch/-A、--repo/-r、--mirror、--mode/-m、--dry-run/-d、--yes/-y(默认模板为 meta)
validate --file/-f、--repo/-r、--image/-I、--arch/-A;不接受节点参数
plan --file/-f、--repo/-r、--image/-I、--arch/-A
up、reload --file/-f、--repo/-r、--image/-I、--arch/-A、--mirror、--no-wait/-n、--rollback
recreate --file/-f、--repo/-r、--image/-I、--arch/-A、--mirror、--yes/--force、--no-wait/-n
resize --file/-f、--image/-I、--arch/-A(仍只应用 CPU/内存变更)
start、restart --no-wait/-n
stop、status 仅接受节点选择器与全局展示参数
destroy --yes/--force、--delete-persistent、--purge(后两者仅限整套部署)
purge 默认直接删除;--ask 开启确认;不接受节点参数或 --yes、-y、--force
doctor、version 仅全局展示参数
provision 必填 --script/-s;--sudo;--parallel/-p 正整数(默认 1);--timeout/-t 正时长(默认 1h)
ssh-config 可选节点选择器;--install/-i 与 --remove 互斥;--name 默认为 barn。--remove 不接受节点参数,也不要求存在部署状态
logs --source/-s serial|qemu|events(默认 serial);--follow/-f(events 为部署级日志,不接受节点名)
image info、image pull 可选镜像选择器、--arch/-A(兼容旧 -a)、--repo/-r;pull 额外支持 --mirror
image import --sha256/-s;命名导入(--name local-*)还必须同时传入 --boot/-b bios|uefi 与 --source-user/-u,可用 --arch/-A 记录客机架构
image prune --dry-run/-d 与 --yes/-y 互斥;--repo/-r
image sync 源 URL 或本地路径、--repo/-r、可选 --allow-downgrade
update --repo/-r、--mirror
image list、image reset --repo/-r
repo scan/build/verify 必填一个仓库目录路径,支持相对路径、~/ 与目录符号链接
network install --cidr/-c(默认 10.10.10.0/24)、--mode/-m(默认 host)、--yes/-y;macOS 专用 --archive/-a、--interface-id/-i
network status 可选 --cidr/-c
network uninstall、hosts install/uninstall --yes/-y
hosts install(1.2.0) --file/-f:发布清单中的节点与 vm_hosts,不要求已创建 VM

参数使用说明:

  • setup --dry-run 与 setup --yes 互斥。--cidr 仅调整新生成模板的网段,不会改写显式指定的 -f 清单。若要在 validate 时对照中国镜像源校验,请传入 --repo https://repo.pigsty.cc/barn。
  • init 与生成模板的 setup 将 -I、-A 写入 all.vars.vm_image、all.vars.vm_arch;setup 遇到已有清单时拒绝这两个生成参数。up、plan、reload、recreate、resize 与 validate 则在内存中覆盖本次期望配置,不改写清单。镜像覆盖作用于所选节点,架构覆盖作用于整套部署;详见覆盖优先级与默认值。
  • 独立的 image info/pull/import 默认取宿主架构,不读取清单的 vm_arch;用 -A 显式选择。image import -A 必须与 --name 同用;qcow2 元数据不能识别客机 CPU,所填架构须与实际镜像一致。
  • network 与 hosts 的 install/uninstall 会先展示变更计划并在终端请求确认(安装默认同意,卸载默认拒绝)。未传 --yes 时,如果标准输入不是终端或输出为 --json/--yaml,命令只输出计划并退出 0;请检查结构化报告中的 applied,或传入 --yes 执行计划。macOS 首次配置宿主网络请使用 barn setup。有节点运行时 network uninstall 会拒绝卸载网络;停止或销毁虚拟机不会卸载宿主网络。在 Linux 上,若宿主还有其他网络链路,或无法确认 networkd 仅供 Barn 使用,network uninstall 会保留全局 networkd 单元状态;计划中报告 preserve_networkd,执行报告在 checks.networkd 中说明原因。
  • 涉及安全确认与仓库选择的开关(--ask、--mirror、--force、--rollback、--remove、--allow-downgrade、--sudo、--delete-persistent、--purge)只提供长参数。在 Linux 命令中,-f 表示 --file(barn logs -f 例外,表示 --follow),-n 表示 --no-wait(而 barn mac logs -n 表示日志行数),-d 表示 --dry-run。
  • barn purge 默认立即执行整套清理,删除所有节点、持久盘、密钥、部署状态与默认 SSH 配置片段,保留镜像缓存与宿主网络。只有传入 --ask 时才先展示节点列表与清理范围:输入 y/yes 确认,n/no、空行或 EOF 取消并返回 130;不接受 --yes、-y 或 --force。当环境中尚无部署时,默认 barn purge 与整体 barn destroy 均直接返回成功(purge 还会清理归属元数据完整的残留持久盘)。无法确认残留目录归属时仍会拒绝删除。若部署状态文件已缺失,执行 destroy --force --delete-persistent 或 destroy --force --purge 会报错并提示改用 barn purge。

1.2.0 规格参数与 SPEC 显示

Barn 1.2.0 新增 --cpu/-C、--mem/-M、--scale/-S、--disk/-D,与 --image/-I、--arch/-A 共用规格输入规则,支持范围如下:

命令 新增支持
init、生成模板的 setup C/M/S/D,写入新清单
validate、plan、up、reload、recreate C/M/S/D,仅覆盖本次期望规格
resize C/M/S/D,应用 CPU/内存变化与根盘增长;保留已有 I/A 核对
复用已有清单的 setup 不接收规格覆盖,忽略规格环境变量
start/stop/restart/status/destroy/purge 不接收,沿用已应用状态

参数、单位、环境变量及保存规则见 规格覆盖。up/reload 不会自动应用已有节点的资源变化,仍需 resize 或显式 recreate。

节点表用 SPEC 列表示有效 CPU 与内存,例如 1c2g、2c4g、8c16g。c 表示 vCPU,g 表示 GiB;1536 MiB 精确显示为 1.5g,512 MiB 为 0.5g。不能整除 MiB 的字节容量用 b 精确保留,未知规格显示 -。

status 和完成结果显示已应用规格;plan/validate/setup 显示期望规格。计划中的资源变化显示为 2c4g → 4c8g,根盘在 ROOT 列单独显示。init 摘要、生命周期动态进度及普通终端的完成结果也显示 SPEC。scale 不为 1 时展示基数、倍数、结果及来源;--verbose 也显示倍数为 1 的计算说明。JSON 保留数值 CPU 和字节容量,并在 resources 中提供基数、倍数、有效结果与来源,不要求脚本解析缩写。

1.2.0 根盘原地扩容

barn resize -D 128GiB meta
BARN_DISK=128GiB barn resize meta

-D 是绝对目标容量,重复相同目标不再修改磁盘或重启 VM;缩盘直接报错。首次扩容需要停机,原本运行的节点完成后运行,原本停机的节点临时启动完成检查与扩展后恢复停机。支持 512 字节逻辑扇区、GPT 或主 MBR 分区表中位于末端的普通 ext4/XFS 根分区;LVM、加密设备、后置分区和缺少所需工具会在修改磁盘镜像前报错。根盘与原有数据、VM UUID、SSH 密钥均保留,数据盘不参与扩容。

Barn 持久化恢复阶段,核对镜像容量、客机磁盘、分区及文件系统后才完成操作。失败时 status 显示 root-resize 提示;修复报告的问题后,按提示重复相同 resize -D 目标。根盘已扩展但客机未完成时不会自动缩回。若清单仍保留旧容量,继续运行原清单会报告差异;需要长期保留新容量时更新 vm_disk。实现与测量见 根盘扩容验收。

1.2.0 的生命周期并发

Barn 1.2.0 将 Linux 虚拟机生命周期默认并发设为 max(1, 逻辑 CPU 数 - 2),CPU 数取 Barn 进程检测到的可用逻辑 CPU 数,各阶段实际并发不超过该阶段所选节点数。已发布的 Barn 1.1.0 最多使用四个工作线程,生命周期命令尚不支持 --parallel。

1.2.0 的 up、start、stop、restart、reload、recreate、destroy 与 purge 接受零或正整数参数 --parallel/-p。省略参数时采用 CPU 默认策略,显式传入 --parallel 0 则让所选节点全部并行;正数指定并发上限,--parallel 1 可将节点操作设为串行。该参数覆盖命令涉及的磁盘准备、启动与停机阶段并发,状态提交与文件删除沿用原有顺序。超过 16 的值也会生效,超过节点数则不会多建工作线程。该选项仅作用于本次命令,失败后建议的重试命令会保留显式传入的值,包括零。

barn up -p 0
barn up --parallel 8
barn start -p 1
barn restart meta node-1 -p 2

启动工作线程在客机启动、等待 SSH 与就绪检查完成期间一直占用并发名额。传入 --no-wait 后,QEMU 启动且进程身份核验通过即可释放名额。磁盘准备阶段全部结束后才进入启动阶段。provision --parallel 保持独立的默认值 1;原生 macOS 客机的运行数量限制见 Mac 命令。

实现与回归测试:concurrency.go、concurrency_test.go 与 lifecycle_parallel_test.go。

2026-11-10 真机验收在具有 18 个逻辑 CPU 的 macOS/arm64 宿主上,通过临时 BARN_HOME 管理六台 Debian 13 客机:自动默认值为 16,实际启动并发峰值为六;显式设为 1 时,启动与停止均为串行;显式设为 32 时,重启并发峰值为六。全部客机通过就绪检查,测试部署已在结束后销毁。

2026-11-11 在同一宿主上另建临时部署,验证显式零值:18 台 Debian 13 客机全部并行启动,并在 39.6 秒内通过就绪检查。选择其中三台执行停止和启动,两阶段并发峰值均为三,其余 15 台虚拟机进程保持不变。测试部署已在结束后销毁,原有六台虚拟机进程保持不变。回归测试另覆盖超过 16 的正数并发上限、修改状态前拒绝负数,以及重试命令保留显式零值。

结构化失败

编写自动化脚本时,请先检查进程退出码,再按所执行的命令解析输出。

在默认文本模式下,耗时满 1 秒的终端操作会在 stderr 动态重绘单张实时状态表(NAME ADDRESS STATE MESSAGE、ITEM STATE MESSAGE 或 IMAGE STATE MESSAGE),并在底部输出以 [DONE]、[FAILED] 或 [CANCELLED] 结尾的汇总行;当 stdout 与 stderr 都是终端且未启用 --verbose 时,完成后的表格会原地固定,stdout 只追加后续操作提示(如 connect:、retry:、next:)。常规错误会在 stderr 打印 error: <消息>;若外部命令调用失败,还会附上其最后几行 stderr 输出,并在有明确恢复步骤时打印 next: 建议命令。SSH 子进程执行远端命令返回非零退出码时,Barn 会直接透传远端输出,不再额外包装 error: 行。

在 --json 或 --yaml 模式下,定义了专属报告结构的命令(doctor、network、provision、生命周期命令以及 ssh/exec)会直接在 stdout 输出各自的报告结构(例如 exec 返回 success、exit_code、stdout 与 stderr)。如果命令在生成专属报告前就失败,Barn 会在 stdout 输出单个通用错误对象:

  • error:取自退出码表的固定错误类别(recreate_required 与 nodes_removed 现作为 error: "conflict" 下的 reason 返回,资源冲突统一使用 error: "resource")。
  • message:可读的错误说明。
  • 可选上下文字段:reason、next、operation_id,以及记录外部命令失败详情的 command(含 name、argv、exit_status、signal、timed_out、stderr)。

单次结果命令输出一份 JSON 或 YAML 文档;logs --follow 使用 NDJSON 或 YAML 文档流,结构化模式的交互 SSH 将会话输出送往 stderr,最终报告送往 stdout。设计理由见 CLI 契约。

生命周期结果

不传节点名时,生命周期命令默认作用于部署中的全部节点;而 ssh、exec 与单节点 logs 默认作用于已完成准备的控制节点(若控制节点尚未准备就绪,则回退到第一个已准备就绪的节点)。节点选择器必须是解析后的节点名称(如 meta),不接受清单 IP、分组名或 vm_alias 别名。

  • restart:不重新读取清单,直接按已应用状态重启节点。
  • reload:先校验本次生效的期望规格与启动依赖,通过后再停止所选节点并对这些节点执行 up。该命令可以新增节点;需要替换已有虚拟机的变更仍需使用 recreate。
  • resize:应用包含 vm_scale 倍数的有效 CPU/内存规格,并支持根盘增长。支持的增加操作可以热插拔;减少资源、旧虚拟机或后端不支持时会自动停机再启动,同时保留虚拟机身份与磁盘。镜像、数据盘、网络、共享目录、创建、删除及部署级变更会被拒绝。
  • recreate:通过替换根盘和非持久数据盘来应用节点定义变更,同时保留兼容的持久数据盘。显式选择节点执行 plan、up、reload、recreate 或 resize 时,其余节点保留已应用定义,即使 YAML 已修改或省略它们;未创建且未选中的节点不要求解析镜像。地址、别名、控制节点角色及部署公共设置的真实冲突仍会在预检时报错;省略选择器时则处理整份清单。
  • 当配置漂移需要执行破坏性变更时,up 与 reload 会返回 conflict 错误,并提示先运行 barn plan,再运行 barn recreate <node> 或 barn destroy <node>。在终端上,recreate 与 destroy 会列出将被替换或删除的节点,并要求输入命令名确认,传入 --yes(或 --force)可跳过;没有终端且未传这两个参数时,命令以退出码 2 拒绝执行。不带节点参数时,两者都作用于整套部署。

不带节点参数的 recreate 遇到清单缺少已有节点时,会在任何虚拟机停机前拒绝执行(conflict,reason nodes_removed,退出码 4)。需要删除该节点时请显式执行 barn destroy <node>,否则把它加回清单。Barn 会在销毁锁内再次核对范围;若预检期间已应用状态发生变化,recreate 以 reason deployment_changed 退出,请重新检查计划后重试。

删除控制节点后,剩余的第一个节点接任控制节点。请在清单中把控制角色(admin_ip)改为该节点,再运行 barn up 安装其控制 SSH 访问;--no-wait 会推迟这一步。在此之前,仍把已删除节点设为控制节点的清单属于角色漂移,up 会拒绝执行;如需恢复原节点,请将其作为普通节点重新加入。接任节点存在无法完成的准备记录时,Barn 会在删除任何内容前拒绝删除控制节点,并在错误中指出接任节点。

计划

barn plan 是只读命令,即便计算出的 action 为 resize、recreate 或 blocked-removal,也会以退出码 0 返回;自动化脚本应检查 action、create/resize/recreate/start/missing 数组,以及可选的 blocked 原因字符串。

对于镜像目录中的标准镜像,plan 仅读取本地配置与镜像目录元数据,不依赖 QEMU 或宿主网络;对于已注册的 local-* 本地导入镜像,plan 还会调用 qemu-img 校验缓存文件。plan 不会下载镜像,并会展示精确的镜像版本、CPU/内存/磁盘资源总量、漂移原因以及每块数据盘的处理动作(包括默认的 128 GiB /data 盘)。

启动与 SSH 配置

barn up 会在执行前检查宿主虚拟化能力与地址可用性,依次创建缺失节点、启动已停止节点、检查运行中节点的 SSH 就绪状态,并根据完整的已应用部署重写宿主 SSH 客户端配置片段(~/.ssh/barn_config)以及运行中客机的 /etc/hosts 和控制节点 SSH 配置。recreate 同样会完整刷新上述配置;start 与 restart 也会刷新 SSH 别名;单节点 destroy 会移除对应条目,整体 destroy 则移除整份配置片段。

若虚拟机生命周期操作已成功,但写入 ~/.ssh/config 失败(或者 ~/.ssh/config 是符号链接/硬链接,Barn 从不修改链接文件),Barn 会写好独立的 ~/.ssh/barn_config 片段、提示需手动添加的 Include 行,将告警记入 warnings[] 并以 0 退出(barn ssh 仍可正常连接)。

控制节点上由 Barn 管理的 SSH 条目不会把实验节点的主机密钥锁死在 known_hosts 中,从而保证节点重建后依然可以直接连通;用户在客机中自行添加的 SSH 配置会原样保留。

就绪

管理 SSH 连通后,Barn 即判定 Linux 客机已就绪。非致命的客机初始化问题会记录在 nodes[].warnings 中,已自动完成的恢复动作(例如重置损坏的数据盘)会记录在 nodes[].repairs 中,命令退出码仍为 0。再次运行 barn up 可以在不重启 QEMU 进程的情况下,对运行中的节点重试未完成的初始化步骤。

传入 --no-wait 时,命令在 QEMU 进程启动后立即返回,把客机就绪检查、数据盘恢复与 SSH//etc/hosts 刷新留给下一次 barn up。

哪些数据盘问题会被自动修复(记入 repairs)、哪些只报告(记入 warnings),见数据盘。已有客机会在下一次 barn up 的就绪检查中获得当前的恢复脚本。

节点失败

批处理过程中若出现可隔离的单节点失败,Barn 会保留已成功的节点,以退出码 5 返回,并按 N of M node(s) failed: <node> (<stage>: <error>); ... 格式汇总错误(常见阶段包括 prepare、start、readiness、bootstrap、guest-setup、stop 与 status)。结构化输出在 failures[] 中提供 node、stage、error 及可选的 reason(若传入 --rollback 清理了未提交节点的准备产物,还会包含 rolled_back)。遇到 readiness 或 bootstrap 失败时,请运行 barn logs <node> 查看串口输出,并参考节点未就绪排查。

状态

barn status 默认展示节点名、IP(ADDRESS)、状态(running 表示 QEMU 进程存活,不主动探测客机 SSH)、精确镜像及 CPU/内存,并在使用 TCG 软件模拟时予以标记(在 Apple Silicon 上若存在 Mac 虚拟机,还会附加 mac: <名称>; barn mac ls)。加上 --verbose 可进一步查看 SSH 转发端口、架构、加速器与 QEMU PID。若个别节点异常——包括在线 resize 在热插拔后中断(stage: "resize"、reason: "resize_incomplete")——status 仍会展示其余正常节点,在 failures[] 中附带节点错误并以 5 退出。

恢复与中断处理

  • 故障隔离:执行 up 或 start 时,某个节点的宿主共享目录缺失或新节点准备失败只影响该节点,独立的已停止节点仍会正常启动;命令以 5 退出,并给出保留原 -f、--repo 及参数选项的重试命令。
  • 阶段事件日志:宿主 setup 与紧随其后的生命周期重试共用同一个 operation_id。即便首次 setup 在创建部署状态前就失败,也可以运行 barn logs --source events --json 读取定长轮转的阶段事件日志(日志自动脱敏命令参数与凭据;setup --dry-run 不写日志)。
  • 遗留持久盘:先前移除节点后保留下来的受管持久盘不会阻塞其余节点的销毁;需要连同这些持久盘一并清理时,请执行 destroy --delete-persistent 或 purge。
  • macOS 准备顺序:在 macOS 上安装新网络时,setup 会先完成 Homebrew 查找/安装或下载固定版本的 socket_vmnet 归档,最后再请求管理员授权,避免安装或下载耗时导致先前的 sudo 凭据过期,也不会在下载失败时白白弹出密码框。
  • PID 与日志对账:如果记录的 QEMU PID 已被无关进程复用,Barn 会将该节点识别为 stopped;若停止操作中断但虚拟机进程仍在运行,Barn 会将其恢复为 running。若在线 resize 在修改运行中客机后中断,status 会报告 resize_incomplete,可重新运行 barn resize <node> 或执行 barn restart <node>。其他中断状态会提示恢复命令(destroy 会直接完成中断清理);首次 up 失败后,修改清单再重试时 Barn 会根据事务日志自动回滚未提交的残留产物。
  • 取消操作:命令被取消时,Barn 向正在运行的外部程序发送 SIGTERM,sudo 会将其转发给特权命令;Barn 最多等待 10 秒,让该进程及其继承的输出管道结束。忽略 SIGTERM 的后代进程仍需外部监管。

日志与环境变量

barn logs 默认读取客机串口控制台(--source serial)。指定 --source qemu 可读取 QEMU 诊断输出,指定 --source events 可读取部署级的定长事件日志。配合 --follow(-f)时,文本模式流式输出字节,JSON 模式输出 NDJSON 行,YAML 模式输出文档流。Barn 默认将事件日志与 QEMU 日志格式化为简洁记录,仅在传入 --verbose 时展开完整的 QEMU 启动参数。

环境变量 用途
BARN_HOME 私有状态目录(默认 ~/.barn),接受相对路径、~/ 与目录符号链接,但不能是 / 或用户主目录;跨工作目录使用时建议设置绝对路径
BARN_IMAGE/BARN_ARCH/BARN_CPU/BARN_MEM/BARN_SCALE/BARN_DISK 1.2.0 VM 规格覆盖,CLI 优先;仅在接收该字段的命令中读取,详见规格覆盖
BARN_REPO 默认镜像仓库 URL 或路径;可被命令行的 --mirror 与 --repo 依次覆盖
BARN_OUTPUT 默认输出格式(text、json 或 yaml);命令行展示参数优先
BARN_VERBOSE 诊断输出布尔开关默认值;命令行 -v/--verbose 优先
BARN_VMNET_ARCHIVE macOS setup 使用的本地 socket_vmnet 归档路径;支持相对路径、~/ 与符号链接(仍强制校验 SHA-256)
NO_COLOR 设为任意非空值时禁用终端颜色

显式传入的 --json、--yaml 与 -v/--verbose 优先于 BARN_OUTPUT 和 BARN_VERBOSE;即使这两个变量取值无效,--help 仍可正常使用。其他命令在无效取值未被命令行参数覆盖时,以退出码 2(usage)报错。

SSH 透传与命令补全

barn ssh [node] [-- command...]
barn exec [node] -- command...
提示

远端命令前必须使用 --。请写成 barn exec meta -- hostname 而非 barn exec meta hostname;需要执行 Shell 命令字符串时显式调用 sh -c。

  • barn ssh:不带远端命令时打开交互式登录终端;带上 -- command... 时,将 -- 后的参数用空格拼接后交给远端 shell 解释。
  • barn exec:要求提供 -- command...,并将程序名与各个参数分别传递,原样保留参数中的空格、引号、后续空字符串参数以及 shell 元字符。需要使用管道、重定向、变量展开或串行执行多条命令时,请显式调用 sh -c '...'。
  • -- 之前的位置参数最多只能包含一个已知节点名(省略时默认选择控制节点)。若 -- 前出现未知节点名或多个选择器,命令会在发起连接前直接以退出码 2(usage)报错,列出已知节点并提示运行 barn status。
  • --json、-v、--help 等 Barn 自身参数必须放在 -- 之前;-- 之后的所有内容(包括第二个 --、-V 或 -o...)都归属远端命令,不会修改本地 OpenSSH 客户端选项。
barn ssh meta
barn ssh meta -- 'df -h /data; id'
barn exec meta -- hostname
barn exec meta -- printf '<%s>\n' 'a b' ''
barn exec meta -- sh -c 'id; df -h /data'
barn exec meta --json -- uname -a

执行 barn completion bash|zsh|fish|powershell 可导出对应 shell 的自动补全脚本(升级版本后,Bash 用户可执行 source <(barn completion bash) 重新加载)。补全覆盖命令、短别名、拓扑模板、镜像别名、枚举参数、-f 的 YAML 文件以及当前清单或已应用状态中的节点名,并在输入 -- 后停止提示 Barn 参数。

退出码

代码 error 含义
0 成功(包含客机已就绪但带有非致命 warnings[] 或 repairs[] 的情形)
1 runtime 命令已执行但运行失败(外部工具、网络下载或客机操作失败)
2 usage 命令行语法有误、缺少配置文件,或清单/镜像选择器无效
3 capability 宿主缺少必需工具、未配置好 Barn 网络或缺少执行权限
4 conflict 当前部署状态不允许该操作,或另一个 barn 进程正持有部署锁
5 partial 节点级批处理部分或全部失败;请检查 failures[],已成功的节点保持不变
6 resource 宿主 IP、端口、网段或磁盘路径已被占用
7 integrity 摘要、镜像目录签名或签名 revision、实例身份或文件属主校验未通过
130 cancelled 操作被 SIGINT/SIGTERM 中断,或在交互提示中拒绝确认

镜像目录缺少签名或签名校验失败时返回 reason: "catalog_signature";目录复用已接受或内置的 revision 号但内容字节不同时返回 reason: "catalog_equivocation"。读取缓存目录签名时遇到的权限或 I/O 错误属于运行时错误(退出码 1)。

若另一个 barn 命令正持有部署锁,修改类命令最多等待 10 分钟并指出持锁命令;等待超时则以退出码 4(reason: "deployment_busy")退出。只读与访问类命令(status、ssh、exec、ssh-config、hosts)不会阻塞等待锁;其中 status 会展示最近一次提交的节点状态,并在 note 字段中注明正在并发执行的操作。

ssh 与 exec 会原样返回 SSH 子进程的退出码(包括 255,既可能表示 SSH 连接失败,也可能是远端命令自身返回 255),文本输出、JSON exit_code 与进程退出码三者始终保持一致。

2.4 - Mac 运行时参考

barn mac 的命令与参数、机器规则、JSON 结果、失败原因、网络与文件。
barn [--json|--yaml] [-v|--verbose] mac <command> [flags] [name...]

运行 macOS 客机需要搭载 Apple 芯片且运行 macOS 27 或更高版本的 Mac,并由当前登录桌面用户直接调用。需要调用原生 runner 的命令会以 mac_root 拒绝 root 身份,并以 mac_host_unsupported 拒绝不满足要求的宿主。在 Linux 与 Intel Mac 上,顶层 --help 默认隐藏 mac 命令;而 barn mac image ls 等只读取本地记录的子命令则无需启动原生 runner。不带子命令直接运行 barn mac 等同于 barn mac ls。

本参考说明 Barn 1.2.0 的命令接口与 Barn.app(macOS 宿主上运行虚拟机的原生应用包,runner 协议版本 2)。Apple Silicon 发行包与 Homebrew 安装已包含 App,安装步骤见 macOS 客机指南。

各子命令的完整语法、选项和示例见 macOS 命令参考。本页集中说明机器规则、网络、结果格式和状态文件。

命令

命令 用途
ls 列出所有虚拟机的状态、IP、SSH 就绪情况、macOS 版本、资源与共享目录(别名:list、status、st)
up [name] 按需创建并启动虚拟机,等待 SSH 与免密 sudo 就绪
start [name...] 启动已存在的虚拟机
stop [name...] 请求客机正常关机;超过两分钟仍未停止则强制断电
restart [name] 先停后启,使挂起的硬件、共享或网段变更生效
open [name] 打开桌面窗口;若虚拟机已停止则先启动
ssh [name] [-- command...] 打开交互式终端,或将 -- 后的命令行交给客机 shell 执行
exec [name] -- command... 在客机中执行程序并保留参数边界
configure name 停机修改 CPU、内存、共享目录或网段;剪贴板配置可在运行时保存,下次启动生效
recreate name 用全新的 macOS 克隆替换虚拟机,保留原有硬件与网络设置
destroy name... 删除一台或多台虚拟机
password [name] 显示或复制客机登录密码
ssh-config 打印、安装或移除 ~/.ssh/barn-mac_config 条目
logs [name] 查看虚拟机最近的 runner.log 运行日志
setup 下载并准备默认 macOS 基础镜像,不创建虚拟机
image ls 列出已缓存的 .ipsw 恢复镜像、已准备好的基础镜像及使用它们的虚拟机(别名:list)
image update 下载 Apple 最新的 macOS 27 构建并准备为默认基础镜像
image prune 列出未使用的镜像;传入 --yes 时执行删除
doctor 检查宿主环境、Barn.app 组件、基础镜像与每台虚拟机槽位

SSH 与 exec

提示

远端命令前必须使用 --,例如 barn mac exec dev -- sw_vers。交互式登录 barn mac ssh dev 无需分隔符。

-- 之前除 Barn 参数外,最多接受一个已存在的虚拟机名(省略名称时自动选择唯一虚拟机或 mac1)。ssh 不带命令时打开交互式终端;exec 必须在 -- 后提供非空命令。未知的机器名或语法错误会在发起连接前直接返回退出码 2(usage),并提示运行 barn mac ls 查看现有机器。

ssh 会将 -- 后的参数用空格拼接成命令行交给客机 shell;exec 则将程序名和各个参数分别传入,完整保留空格、引号及后续空字符串参数。需要管道、重定向、变量展开或串行执行多条命令时,请显式使用 sh -c '...'。--json、-v、--help 等 Barn 参数必须放在 -- 前,其后的所有参数(包括第二个 --)都归属客机命令。

为保持兼容,exec 也接受单个命令字符串作为 shell 简写。新脚本请分开传入参数或显式使用 sh -c,明确是否需要 shell 解释。

barn mac ssh dev
barn mac ssh dev -- 'sw_vers; id'
barn mac exec dev -- sw_vers
barn mac exec dev -- printf '<%s>\n' 'a b' ''
barn mac exec dev -- sh -c 'sw_vers; id'
barn --json mac exec dev -- sh -c 'echo out; exit 3'

各命令的参数

命令 参数
up --cpu、--memory、--disk、--user、--share、--clipboard、--subnet、--ipsw、-y/--yes、-n/--no-wait、--open
start --all、-n/--no-wait、--open、--recovery
stop --all、--force
restart -n/--no-wait、--open
configure --cpu、--memory、--share、--unshare、--clipboard、--subnet
recreate --update、--yes/--force、-n/--no-wait
destroy --yes/--force
password -c/--copy
ssh-config -i/--install、--remove
logs -n/--lines 正整数(默认 100),按请求行数返回日志
setup --ipsw、--disk、-y/--yes
image update --ipsw、-y/--yes
image prune --installers、-y/--yes

对于名称可省略的命令,不传名称时会选中唯一的虚拟机或 mac1;若存在多台虚拟机且没有 mac1,命令会提示你显式指定名称。start 与 stop 支持传入多个名称或 --all。在终端中,destroy 与 recreate 会先列出即将删除的内容,并要求输入命令名称确认;--yes(或 --force)可跳过询问,没有终端时必须传入。这两条命令的 --yes 没有 -y 简写;mac stop --force 表示立即断电。

--no-wait 会在虚拟机进程启动后立即返回;对于新建虚拟机,后续仍需运行一次不带 --no-wait 的 barn mac up NAME 以完成 SSH 密钥写入与 sudo 配置。普通 start 要求虚拟机已完成首次启动——若未完成首次启动的虚拟机已在运行,可执行 barn mac open NAME 查看首次启动画面;若已停止,则执行 barn mac up NAME --open。传入 --recovery 会跳过常规就绪等待,直接启动进入 macOS 恢复模式桌面。

参数取值

参数 取值
--cpu 虚拟 CPU 核数,最少 2 核,最多不超过宿主 Mac 的逻辑 CPU 数(默认 4)
--memory 二进制单位容量(16G、16GiB、16GB)或字节数;须为整 MiB,介于 4 GiB 与宿主物理内存之间(默认 8 GiB)
--disk 基础镜像磁盘容量,至少 32 GiB(默认沿用已准备基础镜像的容量,首个基础镜像为 100 GiB;指定其他容量时若尚无匹配基础镜像会自动安装一份)
--user 客机管理员用户名(默认取宿主 macOS 用户名;若宿主名称不符合账号规范则回退为 barn)
--share [name=]path[:ro|:rw],可重复指定,不再另设 8 个共享的上限;name 默认取路径最后一段,~/ 会展开为用户主目录
--clipboard on 或 off(也接受 true/false、yes/no;默认 on)
--subnet 规范的私有 /24 网段(如 10.10.30.0/24),或用 auto 自动选择第一个空闲网段

对已存在的虚拟机运行 up 时,若传入的创建参数与现有设置不一致,up 会以 mac_configuration_conflict 拒绝执行,并在 next: 行给出对应的 configure 或 recreate 命令:

  • 在虚拟机停止状态下使用 barn mac configure 修改 --cpu、--memory、--share/--unshare、--subnet 或 --clipboard(剪贴板配置也可在运行时修改并保存到下次启动生效;当前会话可通过菜单栏图标即时开关剪贴板同步)。共享名称支持空格与中文,须为 1–255 字节的有效 UTF-8,不能是 .、..,也不能包含 / 或 ASCII 控制字符;configure --share 复用已有名称时会更新其路径与读写属性,--unshare 则按名称移除对应共享。
  • 管理员账号(--user)与磁盘容量(--disk)在虚拟机整个生命周期内固定不变,recreate 也会保留它们;如需更改账号或磁盘大小,请创建一台新虚拟机。
  • 升级虚拟机的 macOS 版本时,先运行 barn mac image update,再执行 barn mac recreate NAME --update。由于 recreate --update 会保留原虚拟机的磁盘容量,若新 macOS 版本下还没有对应自定义容量(如 200G)的基础镜像,请先执行 barn mac setup --disk 200G 准备好该容量的基础镜像。

机器规则

  • 名称:1–32 个字符,以小写字母开头,仅含小写字母、数字与中间连字符(例如 mac1、dev、build-2)。
  • 单机两台并发上限:受 Apple Virtualization 框架限制,每台 Mac 最多同时运行两台 macOS 虚拟机(跨所有虚拟化应用以及正在执行的 .ipsw 基础镜像安装任务统一计数)。Barn 绝不会为了腾出名额而停止已有虚拟机。ls.running 统计当前 BARN_HOME 内的活跃虚拟机数,宿主全局上限则由 Apple 运行时强制执行。
  • 管理员账号:默认配置免密 sudo、Ed25519 SSH 密钥登录、桌面自动登录与“远程登录”(SSH 服务),并关闭 SSH 密码认证;随机生成的本地登录密码保存在虚拟机槽位目录的 password 文件中(权限 0600)。
  • 主机名:客机电脑名称(ComputerName)与虚拟机名 <name> 一致,本地主机名(LocalHostName)设为 barn-<name>(可通过 barn-<name>.local 访问)。
  • 目录共享:客机内通过单个 VirtioFS 设备挂载到 /Volumes/My Shared Files/<name>。宿主源须解析为已存在的目录,支持符号链接;名称支持空格与中文。
  • 剪贴板同步:每当虚拟机桌面窗口获得或失去焦点时,Barn 通过该虚拟机的 SSH 连接双向同步不超过 1 MiB 的纯文本,并自动跳过标记为敏感(concealed)的剪贴板条目。
  • 关机行为:barn mac stop 会向客机发送正常关机请求,等待满两分钟仍未退出则强制断电(返回 "forced": true);传入 --force 则立即断电。

网络

每台虚拟机的 runner 进程在启动时通过 Apple 的共享模式 vmnet API 创建独立的用户态网络,并在退出时自动销毁,全程无需守护进程或 root 权限:

项目 取值
网段 在 10.10.20.0/24 至 10.10.59.0/24 之间自动选择第一个避开宿主路由与其他虚拟机的空闲 /24(也可通过 --subnet 显式指定)
网关 .1(宿主 Mac)
客机地址 .10(按虚拟机 MAC 地址通过 vmnet DHCP 保留固定分配)
连通范围 支持宿主与客机互访及通过 NAT 访问外网;各虚拟机使用独立子网,不桥接物理局域网,也不做入站端口转发

如果宿主新增的路由(如 VPN 路由)占用了虚拟机已保存的网段,start 会以 mac_subnet_in_use 拒绝启动;此时执行 barn mac configure NAME --subnet auto 即可改换到空闲网段。由于 SSH 主机密钥绑定在虚拟机实例标识 barn-mac-<instance_id> 而非 IP 地址上,更换网段不会破坏 SSH 信任链。

macOS 的“本地网络”隐私权限有时会拦截第三方终端或 IDE 访问 vmnet 子网(通常表现为 No route to host),请在 系统设置 → 隐私与安全性 → 本地网络 中为对应应用开启权限。Barn 自身的 Go SSH 连接通过系统内置的 /usr/bin/nc 转发,交互命令则直接调用 /usr/bin/ssh,从而避开第三方二进制直连本地子网时的权限限制。

JSON 输出

除交互式 ssh 外,所有 barn mac 命令均支持通过 --json 与 --yaml 在 stdout 输出结构化结果,同时将进度信息写往 stderr。

ls

{
  "schema_version": 2,
  "root": "/Users/alice/.barn/mac",
  "prepared": true,
  "base": {"version": "27.0", "build": "26A428", "base_id": "26A428-e16af589f4b705ca397f5b21"},
  "machines": [
    {
      "name": "mac1",
      "kind": "macos",
      "state": "running",
      "ready": true,
      "ssh": "ready",
      "address": "10.10.20.10",
      "address_stable": true,
      "ssh_host": "10.10.20.10",
      "ssh_port": 22,
      "user": "alice",
      "image": {"version": "27.0", "build": "26A428", "base_id": "26A428-e16af589f4b705ca397f5b21"},
      "cpus": 4,
      "memory_bytes": 8589934592,
      "disk": {"capacity_bytes": 107374182400, "allocated_bytes": 1202647040},
      "network": {"subnet": "10.10.20.0/24", "gateway": "10.10.20.1", "address": "10.10.20.10"},
      "shares": [{"name": "src", "host": "/Users/alice/src", "guest": "/Volumes/My Shared Files/src", "readonly": false}],
      "clipboard": true,
      "pid": 2545,
      "instance_id": "b1482ffc-2da7-45d9-ace5-c5f3193a9172",
      "warnings": []
    }
  ],
  "running": 1,
  "limit": 2
}
字段 取值
state prepared(已创建但未完成首次启动)、starting、running、stopping、stopped、unknown
ready 本次检查通过 SSH 连通客机并验证免密 sudo 成功时为 true
ssh ready、pending(首次启动进行中)、unavailable、offline、unchecked
observed 运行中客机报告的 macOS 版本与基础镜像不一致时出现
window_visible 桌面窗口处于打开状态时出现
error、warnings 最近一次记录的槽位错误,以及本次检查发现的 SSH 告警

生命周期结果

单机操作(up、restart、open、recreate、configure)返回单个结果对象;批量操作(start、stop、destroy)即使只指定一台虚拟机也始终返回 {"machines": [...]}。多台虚拟机操作部分成功时,结果中会同时保留成功项与失败详情,并以退出码 5 返回。

{"name": "mac1", "action": "created", "state": "running", "ready": true,
 "address": "10.10.20.10", "user": "alice", "version": "27.0", "build": "26A428"}
字段 取值
action created、started、running(已在运行)、restarted、recreated、opened、configured、stopped、powered_off、already_stopped、destroyed、absent
forced 正常关机超时、转为强制断电时为 true
window 本次操作打开了桌面窗口时为 true
warnings 非致命提示(例如剪贴板变更将在下次启动时生效)

其他命令的 JSON 输出:

  • exec --json:返回与 Linux barn exec --json 相同的结构(node、exit_code、stdout、stderr)。
  • password --json:返回明文密码;配合 --copy 时返回 {"name": "mac1", "copied": true}。
  • ssh-config --json:默认返回 fragment 字符串;配合 --install 或 --remove 时返回安装状态。
  • logs --json:返回 name 与 logs。
  • doctor --json:返回 ok 与 checks[](每项含 name、ok、detail 及可选的 next),任一检查未通过时退出码为 3。

失败原因

退出码遵循 Barn 命令行退出码表,ssh 与 exec 原样透传远端命令退出码。结构化错误对象包含稳定的 reason 标识与 next 修复建议:

原因标识 退出码 含义与下一步
mac_host_unsupported 3 宿主不是 Apple 芯片,或 macOS 版本低于 27
mac_runner_missing 3 barn 可执行文件旁未安装 Barn.app 原生组件
mac_runner_protocol 3 已安装的组件使用不兼容的 runner 协议版本;请重新安装匹配的 CLI 与 App
mac_root 2 使用了 root 身份调用;请切换回普通登录用户,不要加 sudo
mac_download_consent 2 非交互环境下下载 macOS 镜像需要传入 --yes,或改用 --ipsw 指定本地文件
mac_machine_absent 4 指定名称的虚拟机不存在;请运行 barn mac up NAME 创建
mac_not_initialized 4 虚拟机尚未完成首次启动初始化;请运行 barn mac up NAME
mac_not_running 4 对已停止的虚拟机调用了 ssh/exec;请先执行 barn mac start NAME
mac_running 4 请求的配置变更需要先停机;请先执行 barn mac stop NAME
mac_configuration_conflict 4 up 参数与已有虚拟机配置不一致;请按提示运行 configure 或 recreate
ssh_config_linked 4 ~/.ssh/config 是符号链接或硬链接;请手动将打印出的 Include 行加入配置文件
mac_vm_limit 6 当前 Mac 上已有两台 macOS 虚拟机在运行;请先停止提示中指明的那台
mac_subnet_in_use 6 宿主路由与虚拟机网段重叠;请执行 barn mac configure NAME --subnet auto
disk_full 6 磁盘剩余空间不足以下载或安装 macOS 基础镜像
mac_machine_damaged 7 已完成过初始化的虚拟机丢失了磁盘或身份文件(其槽位目录会原样保留供排查)
mac_readiness_interrupted 130 barn mac stop 中断了首次启动期间的 SSH 就绪等待

文件

$BARN_HOME/mac

  • config.json安装身份标识、默认基础镜像与 ssh_config_off 标记
  • images/
    • ipsw/
      • <build>.ipsw缓存的 Apple 恢复镜像(下载进行中为 .partial)
      • <build>.ipsw.json恢复镜像元数据与校验摘要
    • base/
      • <id>/只读、从未启动过的 macOS 基础镜像目录
  • slots/
    • <name>/
      • state.json虚拟机记录(schema 2)
      • disk.asif基于基础镜像克隆的写时复制 APFS 磁盘层
      • machine-id.binApple Virtualization 机器标识
      • auxiliary-storage.binNVRAM / 引导辅助存储
      • id_ed25519虚拟机专用 SSH 私钥
      • id_ed25519.pub虚拟机专用 SSH 公钥
      • known_hosts绑定到 barn-mac-<instance> 的固定主机密钥
      • password随机生成的客机登录密码(权限 0600)
      • runner.log虚拟机运行日志(由 barn mac logs 读取)
  • runtime/全局状态锁与单机操作锁

其他宿主与客机文件路径:

  • 运行时套接字:/tmp/barn-mac-<uid>-<hash>/。
  • OpenSSH 配置片段:barn mac ssh-config 负责维护 ~/.ssh/barn-mac_config 以及 ~/.ssh/config 中的 # barn-mac:include 区块(与 Linux 环境使用的 # barn:include 区块互不干扰)。执行 barn mac ssh-config --remove 会在 config.json 中写入 ssh_config_off,此后生命周期命令不会再自动写入 SSH 配置,直到你显式运行 barn mac ssh-config --install。
  • 桌面窗口偏好设置:Barn 将窗口位置保存在 ~/Library/Preferences/com.pgsty.barn.plist(0.9.0 使用 ~/Library/Preferences/io.pgsty.barn.mac-runner.plist)。
  • Runner 查找机制:CLI 根据解析符号链接后的自身可执行文件路径定位 runner,兼容 Barn.app 应用包(Barn.app/Contents/MacOS/barn-mac-runner)、安装器与 Homebrew libexec 布局;开发调试时可通过环境变量 BARN_MAC_RUNNER 指定绝对路径、相对路径或 ~/ 路径。执行虚拟机操作前 CLI 会校验 runner 协议版本 2;barn mac doctor 还会检查 runner 的本地代码签名。
  • 客机内部配置文件:Barn 在客机内写入 ~/.ssh/authorized_keys、/private/etc/sudoers.d/80-barn 与 /etc/ssh/sshd_config.d/000-barn.conf,设置电脑名称与本地主机名,并通过 pmset 禁用休眠。

镜像清理会保留中断的 recreate 仍在引用的基础镜像,直至恢复清理完成。恢复日志损坏时,barn mac image ls、barn mac doctor 的空间估算与镜像清理都会失败,直到日志修复,期间所有镜像原样保留。若某台机器的状态无法读取,barn mac ls 会整体失败,按名称操作其他机器不受影响。

2.5 - 镜像

签名镜像目录、内置别名、仓库选择、本地缓存校验、导入与清理。

Barn 通过静态镜像目录与不可变 qcow2 产物解析 Linux 客机镜像。官方仓库与 HTTP 仓库必须提供 Ed25519/minisign 目录签名,用户显式指定的本地目录仓库与 HTTPS 仓库则允许不签名。日常可通过 barn update 激活新版镜像目录而无需升级 barn 二进制;受信任的签名公钥与 qcow2 安全检查规则则由二进制本身固定。

警告

el7(CentOS Linux 7.9)属于 deprecated(已弃用)兼容镜像;内置目录中的其余版本均为 supported。

别名与拉取顺序

Barn 1.2.0 内置镜像目录 2026110502,包含 Debian 13 镜像 20261103.2651.1。目录涵盖 9 个发行版系列,每个系列一个 stable 版本,共 17 个镜像产物:el7 仅提供 amd64,其余系列均同时提供 amd64 与 arm64。缺省请求为宿主原生架构的 u24:stable(Ubuntu 24.04 LTS)。

下表列出内置镜像目录 2026110502 中各系列的 stable 版本快照。运行 barn update 后再执行 barn image list 可查看所选仓库当前的实时目录;宿主平台兼容性详见平台与限制。

镜像系列 内置 stable 可用别名
d12 20261026.2643.1 debian12、bookworm
d13 20261103.2651.1 debian13、debian、trixie
el7 7.9.20221112.0 c7、centos7、centos79
el8 8.10.20240528.3 rocky8
el9 9.8.20260525.2 rocky9、rocky
el10 10.2.20260525.0 rocky10
u22 20261020.0.1 ubuntu22、ubuntu2204、jammy
u24 20261017.0.1 ubuntu、ubuntu24、ubuntu2404、noble
u26 20261016.0.1 ubuntu26、ubuntu2604、resolute

发行版说明:

  • u22、u24、u26 分别对应 Ubuntu 22.04、24.04、26.04 LTS,d12 与 d13 对应 Debian 12 与 13。它们由 Barn 镜像配方基于发行版官方云镜像构建:镜像内置 dba 用户(UID/GID 88),已带 XFS 用户态工具,并提供 en_US.UTF-8 区域设置,默认区域设置保持为 C.UTF-8。
  • el7 为 CentOS Linux 7.9(amd64 BIOS),el8、el9、el10 为 Rocky Linux(amd64 与 arm64 UEFI)。el8 与 el9 同样经过该配方处理(dba,UID/GID 88);el10 与 el7 直接使用发行版未经修改的云镜像。
  • 所有镜像都在首次启动时由 cloud-init 完成账号与网络配置。
  • 运行 barn update 只会更新新节点的 :stable 或版本前缀解析结果,已运行的虚拟机和显式锁定 @version 的节点继续使用原有基础镜像。若现有清单使用的通道或版本前缀在新目录中指向了新版本,后续执行 barn plan 或 barn up 会报告镜像漂移,需显式运行 barn recreate 才会替换节点。
别名 发行版 架构 引导方式 状态
el7 CentOS Linux 7.9 / 2211 amd64 BIOS deprecated
el8 Rocky Linux 8.10 amd64、arm64 UEFI supported
el9 Rocky Linux 9.8 amd64、arm64 UEFI supported
el10 Rocky Linux 10.2 amd64、arm64 UEFI supported
d12、d13 Debian 12 / 13 amd64、arm64 UEFI supported
u22、u24、u26 Ubuntu 22.04 / 24.04 / 26.04 LTS amd64、arm64 UEFI supported
barn image list
barn image info d13
barn image info d13:stable
barn image info el9@9.8
barn image pull d13@20261103.2651.1
barn image pull d13 --arch arm64
barn update

barn image list 会列出当前激活目录中的全部版本、架构以及已注册的 local-* 本地别名。barn image info 与 image pull 一样默认采用本机架构;未缓存时无需安装 QEMU 即可查看目录元数据,已缓存时则会调用 qemu-img 校验本地缓存文件。list 与 info 都不会发起镜像下载。

目录中的 status 字段标识支持等级(supported、testing、deprecated 或 unknown);非 supported 状态的镜像依然可以正常启动,并会在输出中附带状态警告。

拉取镜像时,Barn 依次执行以下四步:

  1. 读取本地活动目录 — 为本次命令加载一次所选仓库的本地活动镜像目录(即二进制内置目录,或最近一次通过 barn update / barn image sync 为该仓库激活的目录)。
  2. 解析选择器与架构 — 解析 image[:channel] 或 image@version-prefix(官方目录缺省为 u24:stable)及目标架构。独立执行 image pull 默认取宿主架构;生命周期命令遵循 vm_arch,未设置时也取宿主架构。Barn 的 --arch/-A 可覆盖上述选择,优先级见配置参考。
  3. 校验本地缓存 — 若本地已存在对应缓存文件,且文件大小、SHA-256 摘要与 qemu-img 结构检查全部通过,则直接复用。
  4. 断点续传与落盘校验 — 若未命中缓存,则从所选仓库下载对应产物(支持自动重试与断点续传),待文件大小、SHA-256 与 qcow2 格式全部校验通过后移入缓存。两个官方源(https://repo.pigsty.io/barn 与 https://repo.pigsty.cc/barn)在下载镜像文件时支持自动互备回退,自定义 --repo 仓库则严格只从指定源下载;目录中记录的上游 URL 仅用于构建溯源。

仓库选择优先级依次为 --repo → --mirror(https://repo.pigsty.cc/barn)→ BARN_REPO → 编译期默认源(https://repo.pigsty.io/barn)。两个官方仓库均要求有效的 minisign 镜像目录签名。

由于每个仓库根路径在 $BARN_HOME/images/manifests/ 下独立维护各自的活动目录记录,使用自定义仓库时请始终传入相同的 --repo(或设置 BARN_REPO);首次切换到带有自定义别名的新仓库时,请先执行 barn update --repo <root> 激活其目录。只要本地已具备激活目录与通过校验的缓存镜像,日常命令即可完全离线运行。

Barn 会自动将通过校验的缓存镜像恢复为只读权限(0444)。如果未被虚拟机引用的缓存文件校验失败,Barn 会先将其重命名为 .corrupt-<timestamp> 留存,再重新下载;若该基础镜像仍被现有虚拟机引用,则保持原文件不动并直接报错。

运行时策略

当客机架构与宿主架构一致时,Barn 默认启用硬件加速虚拟化(macOS 使用 Apple HVF,Linux 使用 KVM),仅有一项内置例外:Rocky Linux 8(el8)的 arm64 原生内核使用 64 KiB 内存页,而 Apple HVF 不支持 64 KiB 页大小,因此 Apple Silicon 宿主运行 el8 时会自动切换为同架构 QEMU TCG 并在状态输出中标注 tcg。跨架构客机(vm_arch 或命令行覆盖后的架构与宿主不同)同样使用 TCG;在 arm64 宿主上模拟 amd64 客机时,Barn 会将 TCG 固定为单翻译线程以保证 x86 内存序正确。

Barn 的 ARM64 TCG 运行时使用 cortex-a72 CPU 模型,避免部分 QEMU/AAVMF 组合在 max 模型下卡住固件。Linux x86-64 宿主运行 ARM64 客机已通过真实 Barn 启动与 SSH 检查。当前 Barn 的目录和运行时只接受 amd64、arm64;发行版或 QEMU 提供其他架构,不代表这些架构已可用于 barn up。

el7 仅支持在 linux/amd64 宿主上原生运行。Linux 宿主的 barn setup 默认只安装本机架构的 QEMU;在通过 up 或 recreate 启动跨架构客机前,请先安装对应架构的 qemu-system-* 模拟器与 UEFI 固件(barn plan 无需安装这些工具即可解析目录镜像,但解析 local-* 导入镜像仍需 qemu-img)。

barn image pull d13 --mirror
barn image pull d13 --repo https://mirror.example/barn
BARN_REPO=/absolute/local/repository barn up

信任与校验

正式发布构建内置了两把生产环境 Ed25519 校验公钥(签名私钥保存在源码仓库之外)。激活镜像目录时,Barn 会拒绝未知签名密钥、格式错误的 JSON、同一修订号下字节不同的内容,以及低于该仓库历史最高已接受修订号的目录(除非在 barn image sync 时显式传入 --allow-downgrade)。缺少签名、签名校验失败或 revision 字节冲突时退出 7(integrity,见退出码)。对相同目录字节的新可信签名会被接受,这也可以修复已损坏的缓存签名。

所有缓存或导入的镜像都必须是文件大小与 SHA-256 严格匹配的独立 qcow2 文件,不得包含后端依赖链(backing file)、外部数据文件、加密或未知的不兼容特性位。通过校验后,Barn 将基础镜像设为只读,并为每个虚拟机节点创建独立的写时复制(CoW)overlay 根盘。

barn update
barn image sync --repo https://repo.example/barn \
  https://repo.example/barn/catalog.json
barn image sync --repo /srv/barn --allow-downgrade /srv/barn/catalog.json
barn image reset --repo /srv/barn
  • barn update:从 --repo 或 --mirror 拉取、验签并激活最新镜像目录。
  • barn image sync:从显式指定的 URL 或本地文件路径恢复镜像目录(对于未签名的自定义仓库,源路径必须指向该仓库根目录下的 catalog.json),支持 --allow-downgrade 显式降级。
  • barn image reset:将 --repo(或默认仓库)的活动目录重置回二进制内置版本,同时保留防回滚所需的历史最高修订号水位线。

静态仓库格式

静态 Barn 镜像仓库的目录结构如下:

/srv/barn

  • repo.yaml人工维护的策略与版本声明文件(schema 1)
  • catalog.json自动生成的运行时镜像目录,含摘要与大小(schema 3)
  • catalog.json.minisigMinisign 签名文件(官方仓库与 HTTP 仓库必需)
  • images/
    • <image>-<version>-<arch>.qcow2不可变 qcow2 镜像产物

repo.yaml(schema: 1)负责声明默认配置、别名、通道、精确版本、架构、引导方式、支持状态、source_user(如上游镜像的 rocky 或经 Barn 官方归一化后的 dba)以及可选的上游溯源 URL,无需手写校验和与文件大小。barn repo build 会检查 images/ 下的 qcow2 文件,并自动生成包含文件名、SHA-256、文件大小与虚拟容量的 catalog.json(schema: 3)。

repo.yaml
schema: 1
revision: 1
defaults: { image: u24, channel: stable, arch: native, boot: uefi }
images:
  u24:
    aliases: [ubuntu24, noble, ubuntu]
    channels: { stable: "1" }
    versions:
      "1":
        status: unknown
        variants:
          amd64: {}
          arm64: {}

未在变体下显式指定 file 时,默认对应 images/<image>-<version>-<arch>.qcow2(例如 images/u24-1-amd64.qcow2 与 images/u24-1-arm64.qcow2)。

静态仓库构建与校验规则(barn repo scan|build|verify /absolute/repo):

  • 仓库根目录接受相对路径、~/ 与目录符号链接,根目录和 images/ 可以共享可写。repo.yaml 可为指向不超过 4 MiB 非空普通文件的符号链接。镜像条目仍须为普通文件,输出 catalog.json 的符号链接不会被覆盖。
  • 引导方式按 variant → family → defaults.boot 继承;状态按 variant → version → unknown 继承。每个系列都必须定义指向已有精确版本的默认通道;系列名与别名全局唯一且不能以 local- 开头。由于清单别名归一化会先查二进制内置目录,请勿将 ubuntu、debian、rocky 等内置别名改指其他系列。
  • 通道与按点号分段的数值前缀(如 el9@9.8、el9@9)会解析为精确版本或匹配的最高版本,最终落定为不可变的三元组标识 (image, exact version, arch):
    d13:stable + native
      -> d13@20261103.2651.1 + arm64
      -> images/d13-20261103.2651.1-arm64.qcow2
  • barn repo scan 为只读检查,不依赖 qemu-img;即使存在 missing(缺失)或 unsafe(命名/类型不安全)的文件也会返回退出码 0,自动化脚本需检查输出中的 missing 与 unsafe 数组是否为空。
  • barn repo build 与 barn repo verify 依赖本机 qemu-img。build 校验 repo.yaml 并完整检查每个 qcow2 文件后原子替换 catalog.json(存在 missing 或 unsafe 文件时拒绝构建,untracked 未声明文件则仅报告而不写入目录);verify 要求现有 catalog.json 与重新生成的结果逐字节一致。每次修改目录内容都必须递增 revision,发布时先上传不可变的 .qcow2 文件,最后同步更新 catalog.json 与 catalog.json.minisig。

本地布局与导入

Barn 将目录记录、下载缓存与本地导入文件统一存放在 $BARN_HOME/images(默认 ~/.barn/images):

$BARN_HOME/images

  • manifests/各仓库独立的活动 catalog.json 与历史最高修订号记录
  • local-images.json已注册的 local-* 本地镜像别名索引
  • local/
    • <sha256>.qcow2按内容摘要索引的本地导入 qcow2 镜像
  • d13/
    • d13-20261103.2651.1-arm64.qcow2按系列分目录存放的只读缓存镜像
  • u24/
    • u24-20261017.0.1-arm64.qcow2

将本地 qcow2 文件导入缓存,或注册为 local-* 命名镜像:

barn image import --sha256 <digest> /path/to/base.qcow2
barn image import --name local-mybase --boot uefi \
  --source-user ubuntu --sha256 <digest> /path/to/base.qcow2

本地导入规则:

  • image import 接受相对路径、~/ 和普通文件的符号链接,并需要 qemu-img。读取以实际本地文件大小或镜像目录声明的大小为界;下载超出声明大小时停止,未声明产物大小的旧协议下载限制在 8 GiB 以内。可选 --sha256 用于核对预期摘要。
  • image import 仅复制并校验 qcow2 文件结构,不会清理凭据、安装 cloud-init 或测试启动。
  • 源文件名可包含空格或 Unicode,无需特定扩展名;Barn 校验实际 qcow2 内容。新导入使用 local/<sha256>.qcow2,同名不同内容可并存,相同内容复用缓存。重新导入已有别名时保留其原有缓存路径。注册表元数据若超过 1 MiB,会在写入前报错并保留已有别名。
  • 命名导入(--name local-<alias>)必须同时指定 --boot bios|uefi 与 --source-user <user>,默认记录宿主架构。可通过 --arch/-A 显式记录 amd64 或 arm64 及其别名;qcow2 元数据不能识别客机 CPU,导入也不会转换架构。使用该镜像时,清单的 vm_arch 或生命周期命令的 -A 须与之匹配。别名一旦注册不可更改,可通过 vm_image: local-mybase 引用;不带 --name 的导入仅预填充缓存,不能传 -A。

清理

barn image prune --dry-run
barn image prune --yes

barn image prune(或 barn image prune --dry-run)只列出可回收的候选文件,传入 --yes 才会实际删除。

prune 会自动保护当前所选仓库活动目录中的全部镜像、已应用节点正在引用的镜像摘要以及已注册的 local-* 别名(因此执行 destroy 或 purge 后基础镜像缓存依然保留)。只有不再受当前目录、节点或本地别名保护的旧镜像及过期暂存文件才会成为清理候选;已隔离的 .corrupt-* 文件会原样保留供排查,未知或不安全的文件则会触发报错。由于 prune --yes 按顺序逐个删除候选文件且在中途出错时不会回滚已删除的文件,清理前请先运行 --dry-run 确认列表(检查自定义仓库时请附上相同的 --repo)。

如需在初始化镜像站时逐字节导出二进制内置的 Schema-3 镜像目录,可在源码仓库下运行 go run ./tools/catalogexport /absolute/new/catalog.json;任何使用内置修订号发布的公开目录都必须与导出的字节完全一致。

2.6 - 镜像流水线

不下载、不上传、不签名地校验或离线归一化显式 qcow2 候选镜像。

在 Barn 源码仓库下使用 packaging/image-pipeline/build.sh,可对照已知的 SHA-256 摘要校验或离线归一化已下载的 qcow2 候选镜像。该工具全程在本地运行,不联网、不读取签名密钥、也不修改 Barn 运行时与网络状态,输出状态为 testing 的候选产物包,供后续真机冒烟测试与发布审核使用。

构建宿主环境要求:

  • 依赖工具:所有模式均需 Python 3 与 qemu-img;offline 模式还需安装可用的 libguestfs 工具(virt-customize 与 virt-cat)。可通过 --qemu-img、--virt-customize、--virt-cat 参数或 QEMU_IMG、VIRT_CUSTOMIZE、VIRT_CAT 环境变量指定工具路径。
  • 工作树外存储:请将源镜像、RPM/DEB 软件包缓存和输出目录放在 Git 工作树之外(源码仓库只跟踪构建配方与锁定清单)。
  • 架构匹配:--arch 用于记录候选镜像的目标架构元数据;执行 offline 定制时,构建宿主上的 libguestfs 必须能够运行目标客机架构。

模式与处理方案

  • validate(校验模式):复制源镜像并重算哈希,调用 qemu-img check 强制检查单文件 qcow2 结构,不修改客机文件与凭据,直接生成证据产物包。
  • offline(离线归一化模式):在暂存副本上运行 virt-customize --no-network 与 virt-cat:确认 UID/GID 88 未被其他账号占用后,配置固定的 dba/admin 管理身份,禁用 SSH 密码登录与 root 登录,清理残留密钥、命令历史、机器标识与 cloud-init 缓存,恢复 SELinux 标签,并读回客机内的确定性标记以验证定制结果。

build.sh 默认使用 --profile base。各处理方案(profile)的作用范围如下:

处理方案 归一化操作 软件包输入
base 仅执行账号、sudo、SSH 与 cloud-init 身份归一化 无(拒绝传入软件包参数)
el8 基础归一化 + 安装 Python 3、加载 SSH 配置片段、清理旧网络配置、配置 chronyd 与恢复 SELinux 标签 锁定的 RPM 依赖包集合
el9 基础归一化 + 清理旧网络配置与恢复 SELinux 标签 无(拒绝传入软件包参数)
d12、d13 基础归一化 + 离线安装 XFS 用户态工具并生成 en_US.UTF-8 / C.UTF-8 区域设置 锁定的 DEB 依赖包集合

validate 模式仅支持 --profile base。在 offline 模式下使用 el8、d12 或 d13 时,必须同时传入与方案及架构匹配的 --package-lock 和 --package-cache。构建官方镜像时,直接使用下方的 build-official.py 封装脚本即可自动传入锁定的软件包集合。

官方候选镜像矩阵

packaging/image-pipeline/build-official.py 封装了八个官方离线归一化目标——Debian 12/13(d12、d13)与 Rocky Linux 8/9(el8、el9)各自的 amd64 与 arm64 变体,所有上游 qcow2 URL、RPM/DEB 依赖包、发布版本号、SHA-256 摘要与 SOURCE_DATE_EPOCH 均锁定在 official-v1.json 中(目录中的 Ubuntu 制品由 pipeline.py 直接按同一配方构建;Ubuntu 云镜像自带 xfsprogs,无需离线依赖包锁定)。

./packaging/image-pipeline/build-official.py --list

./packaging/image-pipeline/build-official.py \
  --source-cache /absolute/source-cache \
  --package-cache /absolute/package-cache \
  --output /absolute/existing-output-root \
  --target d13/arm64 --fetch

使用说明:

  • 运行前请预先创建好 --source-cache、--package-cache 与 --output 目录,并传入规范化的绝对路径。加上 --fetch 时,脚本会从锁定的 HTTPS URL 下载缺失输入并在调用 virt-customize --no-network 前校验 SHA-256;不加 --fetch 时,所有锁定输入必须已存在于两个缓存目录中。
  • 省略 --target 会构建全部八个目标,重复指定 --target 可构建指定子集。--list 会列出当前源码锁定的精确版本。

八个目标全部构建完成后,将 包含各产物包目录的父目录 传给 --assemble-from(若分散在多个父目录可重复传入 --assemble-from),即可组装出静态候选仓库:

./packaging/image-pipeline/build-official.py \
  --assemble-from /absolute/existing-output-root \
  --output /absolute/new-candidate-repository

组装操作要求八个目标各有且仅有一个产物包,输出目标路径 --output 必须尚不存在,并会调用 PATH 中的 barn(或 --barn /absolute/path/to/barn)执行 barn repo build 与 barn repo verify。生成的候选仓库默认使用 candidate 通道(例如 d13:candidate)和 testing 状态,便于在提升为 stable / supported 之前执行真机冒烟测试。

校验单个已下载镜像

SOURCE_DATE_EPOCH=1787486400

./packaging/image-pipeline/build.sh \
  --mode validate \
  --source /absolute/source.qcow2 \
  --expected-sha256 <digest> \
  --output /absolute/new/evidence-directory \
  --name u24 --release 20260801.0.0 --arch amd64 \
  --source-user ubuntu --boot uefi \
  --source-uri https://immutable.example/source.qcow2 \
  --artifact-url 'https://images.example/u24/{sha256}.qcow2' \
  --license NOASSERTION \
  --source-date-epoch "$SOURCE_DATE_EPOCH" \
  --manifest-version 2026082903

路径与容量限制:

  • --source 必须是规范化绝对路径的普通文件(非符号链接),大小不超过 16 GiB;--output 的父目录必须已存在,而目标目录本身必须尚不存在。
  • Barn 按镜像目录声明的大小(或本地导入文件的实际大小,详见本地镜像导入)校验运行时镜像产物;贡献者构建流水线仍遵循构建配方的大小边界。
  • 构建器会在输出路径旁创建排他锁,在权限 0700 的临时目录中完成暂存,最后通过原子重命名发布到 --output(失败时仅清理本次构建的暂存目录)。

每个成功生成的产物包包含以下文件:

文件 用途
<name>-<release>-<arch>-<digest-prefix>.qcow2 通过校验的只读候选 qcow2 镜像文件
build-recipe.json 构建调用参数、工具版本与输入摘要记录
manifest-candidate.json 未签名的候选镜像元数据(status: "testing")
provenance.intoto.json SLSA 构建来源声明
sbom.spdx.json 覆盖流水线声明输入与注入软件包的 SPDX 物料清单
validation.json 处理前后的 qcow2 检查结果、客机标记校验与待完成的发布门禁项
checksums.txt 产物包内所有文件的 SHA-256 校验和
package-lock.json 使用锁定 RPM/DEB 软件包输入时附带的锁定清单

在输入文件与工具版本固定时,validate 模式可逐字节复现;使用 offline 模式准备发布证据时,请对同一候选镜像构建两次并比对结果。将候选镜像正式发布为 supported 状态时,还需在目标宿主与客机组合上完成真机启动测试、在 repo.yaml 中递增 revision 并更新状态、运行 barn repo build 与 barn repo verify、使用生产密钥签发 catalog.json.minisig 并验证公开仓库端点。

3 - 项目

Barn 的适用平台、设计思路、贡献方式与发布工程。

Barn(Bootstrap And Run Nodes)是面向本地数据库实验、Linux 开发与 macOS 测试的 Apache-2.0 开源虚拟机管理工具。当前稳定版为 1.2.0,发布于 2026-11-12,提供 macOS 与 Linux 的 arm64、amd64 二进制发行包,详见下载与安装。

  • 平台与限制 — Barn 1.2.0 的宿主环境要求、客机兼容矩阵与存储规则
  • 设计说明 — 单清单 Linux 实验环境与独立 barn mac 虚拟机的架构设计
  • 安全与信任 — 宿主特权边界、SSH 凭据、共享目录与镜像验签机制
  • 参与贡献 — 源码目录结构、本地构建与测试门禁、打包快照及镜像目录维护
  • Mac 发布 — 原生载荷配对、Developer ID 签名、公证与安装验收
  • Barn 1.2.0 发布 — 规格覆盖、根盘扩容、并发、服务名与升级步骤
  • 1.2.0 发布验收 — 正式签名制品、Linux/KVM 与原生 Mac 验收、公开下载及 Homebrew 升级
  • 验证历史 — 历次版本发布、真机虚拟化测试与镜像校验的归档记录

版本更新记录请查阅发布说明,架构取舍请阅读设计文章。欢迎在 GitHub 提交 Issue 与 Pull Request;安全漏洞请按安全政策私密上报。

3.1 - 平台与限制

Barn 1.2.0 的宿主要求、Linux 镜像兼容性、macOS 运行条件与存储限制。

Barn 专为 本地开发与测试 设计。在搭建实验环境前,可通过本页核对宿主软硬件要求及两类客机的支持范围。

版本

当前文档对应稳定版 Barn 1.2.0(安装方式与版本变更详见安装指南与 1.2.0 发布说明)。可通过 barn version 查看本地安装版本;Linux 镜像目录通过 barn update 独立更新。

  • 稳定版渠道:Barn 1.2.0 于 2026-11-12 作为 GitHub 正式版发布,releases/latest、不带 BARN_VERSION 的下载安装器与 Homebrew 配方都会选择此版本,DEB 与 RPM 软件包从发布页下载;需要固定版本时设置 BARN_VERSION=1.2.0。
  • macOS 原生组件:Darwin arm64 归档与 Apple Silicon Homebrew 安装均包含经过签名、公证的 Barn.app 及配套 CLI/helper,无需安装 Go 或 Xcode,详见 macOS 客机指南。
  • 1.2.0 变更:新增规格与环境变量覆盖、可恢复的根盘扩容、生命周期 --parallel 和清单 hosts 发布。Linux 默认规格改为 1 vCPU / 2 GiB;显式设置 vm_cpu: 2、vm_mem: 4GiB 可保留 1.1.0 的默认值。已应用 VM 的资源会保留到显式执行资源变更操作为止。
  • 历史验证记录:历次真机验收与测试记录归档在验证历史与 Barn 1.1.0 本机完整验收中。

选项可用范围见版本基线,发布证据见 1.2.0 验收记录。

Linux 客机

宿主 架构 原生加速 最低 QEMU 版本
macOS arm64(Apple Silicon)、amd64(Intel) HVF 8.2.1
Linux amd64、arm64 KVM 6.2

Barn 为上述四个平台构建发行二进制,真机虚拟化测试主要覆盖 darwin/arm64 与 linux/amd64。Linux 宿主需要可访问的 /dev/kvm 以及 NetworkManager 或 systemd-networkd。可运行 barn doctor 检查宿主环境,或用 barn setup --dry-run 预览依赖安装与网络配置计划。

Barn 1.2.0 内置镜像目录 revision 2026110502 提供 9 个发行版系列、17 个镜像产物,默认镜像为 u24:stable:Ubuntu 22.04/24.04/26.04 LTS、Debian 12/13、Rocky Linux 8/9/10 与 CentOS 7(具体版本号见镜像参考):

  • 每位用户管理一套 Linux 部署,使用私有 RFC1918 /24 网段;节点数量只受网段可用地址与宿主资源限制。
  • 跨架构客机使用 QEMU TCG 软件模拟;Rocky Linux 8 arm64 因采用与 Apple HVF 不兼容的 64 KiB 页大小内核,在 Apple Silicon 上同样自动使用 TCG。
  • CentOS 7(el7)为 deprecated(已弃用)兼容镜像,仅支持在 linux/amd64 宿主上原生运行。
  • vm_shares(QEMU Virtio-9p)支持 Linux 与 macOS 宿主,要求 QEMU 与客机内核支持 9p。若客机内核不支持 9p,仍可使用 SSH/SCP/rsync。

macOS 客机

barn mac 需要 Apple Silicon 芯片、macOS 27 或更高版本、已登录的图形桌面会话以及 Barn.app 原生组件。客机基于 Apple Virtualization.framework 运行 macOS 27,不依赖 QEMU 或 Linux 宿主网络(详见macOS 客机指南):

  • 磁盘空间:准备首台 macOS 虚拟机约需 65 GiB 可用空间,用于存放 .ipsw 恢复镜像、未启动过的基础镜像及虚拟机的 APFS 写时复制克隆。下载支持断点续传,也可通过 --ipsw 指定本地恢复镜像。
  • 并发上限:受 Apple 虚拟化框架限制,每台 Mac 最多同时运行两台 macOS 虚拟机(跨所有虚拟化工具及正在安装的基础镜像统一计数);已停止的虚拟机数量不受此限制。
  • 隔离与共享:每台虚拟机拥有独立的私有 /24 NAT 子网、SSH 密钥、登录密码和 APFS 克隆磁盘,支持 VirtioFS 目录共享(--share)与纯文本剪贴板同步。
  • 能力边界:不支持 USB 透传、虚拟机快照与挂起恢复;虚拟机内的 Apple 账户登录可能受系统限制。
  • Mac 状态损坏:恢复日志损坏时,barn mac image ls、barn mac doctor 的空间估算与镜像清理会失败,直到日志修复。单台机器的状态无法读取时,barn mac ls 会整体失败,其他机器仍可按名称操作。

请使用 barn mac doctor 与 barn mac ls 检查和管理 Mac 虚拟机;顶层 barn status、destroy 与 purge 仅作用于 Linux 实验环境。

数据与生命周期

请将重要代码与数据保存在宿主目录或版本库中:

  • Linux 实验环境:barn recreate 会替换根盘与非持久数据盘并保留 persistent: true 的持久盘,清单缺少已有节点时整套部署 recreate 会拒绝执行;barn destroy 会删除根盘与非持久盘。恢复客机时,barn up 会格式化没有任何签名的数据盘;已有的 ext4 或 XFS 文件系统只有在检查工具报告可识别的损坏时才会重置。带分区表、签名缺少 UUID、使用不支持的文件系统特性或检查工具未知失败的磁盘会保留数据并给出警告(详见存储与访问)。
  • macOS 虚拟机:barn mac recreate 会用基础镜像的全新克隆替换客机磁盘;barn mac destroy 会删除该虚拟机的磁盘、密钥与状态,宿主上的共享源目录保持不变。

日常排障请参考故障排查,宿主特权、SSH 凭据与镜像信任边界请参考安全与信任,源码构建与发布流程请参考参与贡献。

3.2 - 设计

Barn 如何组织 Linux 实验环境与 macOS 客机,以及配置、网络、存储和生命周期的设计取舍。

Barn 通过同一个命令行入口提供两套独立的虚拟化工作流:多节点 Linux 实验环境与独立命名的 macOS 客机。

维度 Linux 实验环境(barn …) macOS 客机(barn mac …)
虚拟化引擎 QEMU + HVF/KVM 硬件加速(跨架构与 Apple Silicon 上的 el8 使用 TCG) Apple Virtualization.framework
期望配置 兼容 Pigsty 的单份 YAML 主机清单(barn.yml) 通过 barn mac 参数管理的具名虚拟机
状态目录 $BARN_HOME(默认 ~/.barn) $BARN_HOME/mac(默认 ~/.barn/mac)
网络模型 用户态管理网卡 + 共享固定 IP /24 实验子网 每台虚拟机独立的 /24 NAT 子网与 .10 DHCP 预留
典型场景 数据库集群、Ansible 剧本演练、多节点 Linux 联调 macOS 编译打包、桌面应用测试、隔离开发环境

下文概述 Linux 实验环境的核心设计,各模块的深层取舍见设计注记。原生 Mac 生命周期解释网络归属、锁、凭据与恢复机制,具体用法见macOS 客机指南与 Mac 命令参考。

每位用户一套 Linux 实验环境

每位系统用户通过一份兼容 Pigsty 的 YAML 清单管理唯一一套存放在 BARN_HOME(默认 ~/.barn)中的 Linux 部署(详见为什么 Barn 没有项目)。由于部署状态与工作目录解耦,日常生命周期与节点访问命令可在任意目录下执行。

节点级收敛

Barn 根据文档规定的 vm_* 字段与 Pigsty 身份字段为每个节点计算规格哈希,并将其与已提交状态及 QEMU 进程身份一同落盘:

  • barn up 会创建新增节点、启动已停止节点、在不中断运行中 QEMU 进程的前提下重试未完成的客机初始化,并刷新受管的 /etc/hosts 与 SSH 配置。
  • 修改已有节点的规格或从 barn.yml 中删去节点绝不会在后台静默销毁虚拟机——CPU 与内存变更使用 barn resize,其他配置变更需显式运行 barn recreate,删除节点需显式运行 barn destroy。清单缺少已有节点时,整套部署 recreate 会拒绝执行(详见声明式不等于破坏式)。

运行时选择

--arch/-A 临时覆盖清单的 vm_arch;二者都未指定时跟随宿主,-A native 可覆盖清单并恢复跟随宿主。镜像参数 -I 不改变架构,已有 VM 切换架构需要重建,详见配置规则。

vm_arch 作用于整套部署(省略或设为 native 时取宿主架构;显式指定 amd64 或 arm64 时选用对应架构镜像)。当客机与宿主架构一致时,Barn 默认使用 HVF/KVM 原生硬件加速;仅在跨架构运行或命中目录声明的内核兼容例外(Apple Silicon 上的 el8 arm64)时才使用 QEMU TCG。若原生加速因其他原因失败,Barn 会直接报错停止,而不会静默退化到软件模拟。

每个节点的已提交状态都会记录实际架构与加速器(可通过 barn status 查看)。在执行破坏性的 recreate 之前,Barn 会预先校验 QEMU 二进制、版本号、网络后端、基础镜像字节、引导方式与固件,确保缺少依赖时不会误删现有的正常节点。

双网卡与单个固定子网

每台 Linux 虚拟机均挂载两张虚拟网卡(详见为什么每个 Barn 节点都有两张网卡):

  • 管理网卡:基于 QEMU 用户态网络,无需修改宿主防火墙即可提供 DHCP、DNS、外网访问与宿主回环端口 SSH 转发。
  • 固定 IP 实验网卡:承载 barn.yml 中声明的 RFC1918 /24 静态地址,供宿主与节点互访、节点间复制及 Ansible 连接使用。

为了在保持 QEMU 非特权运行的同时提供固定 IP 子网:

  • macOS 宿主:使用固定版本的 socket_vmnet 服务。
  • Linux 宿主:优先复用活跃的 NetworkManager(通过 nmcli 管理 barn0 网桥),否则使用 systemd-networkd 配合发行版 qemu-bridge-helper(启动未激活的 systemd-networkd 前会先扫描现有配置,确保不会误接管宿主物理网卡)。在 Debian 上,setup 会向当前用户所属组授予 qemu-bridge-helper 权限,并以普通用户身份实际运行一次 QEMU 挂桥测试,验证通过后才提交网络安装事务。

存储与配置生命周期分离

期望配置(barn.yml)、已应用状态($BARN_HOME)与基础镜像缓存($BARN_HOME/images)拥有各自独立的生命周期:

  • 更新镜像目录通道(barn update)不会改写已创建节点的根盘。
  • 通过校验的基础镜像以只读权限共享,每台虚拟机将根盘写入各自独立的写时复制层(root overlay)。
  • 普通 destroy 与 recreate 会保留 persistent: true 的持久数据盘。恢复客机时,up 只会格式化没有任何签名的数据盘,或检查工具报告可识别损坏的 ext4/XFS 文件系统;无法判定的情况会保留数据并给出警告(详见数据盘配置与存储与访问)。
  • barn image prune 自动保护活动镜像目录、已应用节点与 local-* 别名所引用的镜像(详见镜像参考)。

安全边界

QEMU 进程与镜像下载均以当前普通用户身份运行;仅安装宿主依赖(setup)、配置宿主网络(network install/uninstall)与更新系统 /etc/hosts(hosts install/uninstall)需要管理员权限。在向进程发送信号或删除节点文件前,Barn 会逐一核验文件属主、路径边界、QMP UUID/名称身份、进程启动时间与命令行哈希元组以及操作日志白名单,任何一项存疑都会立即中止操作(详见PID 不是虚拟机身份)。

3.3 - 安全与信任

Barn 1.2.0 的宿主权限、客机凭据、共享目录,以及应用与镜像的独立信任边界。

Barn 面向受信任的本地开发工作站。同一套 Linux 实验环境中的所有节点共享同一个私有子网,且控制节点持有可管理其余节点的部署级 SSH 私钥。Barn 的属主与身份检查旨在防止误删无关宿主文件或误杀进程,而非在共享服务器上隔离互不信任的多租户用户。

宿主权限

日常请始终以普通登录用户运行 barn。QEMU 进程、Barn.app 虚拟机、镜像下载、虚拟磁盘与状态文件均归当前普通用户所有并以该身份运行。只有以下三项宿主级操作需要管理员(sudo)权限:

操作 特权变更范围
barn setup(安装 Linux 宿主依赖) 调用发行版包管理器(apt/dnf)安装 QEMU、固件与 OpenSSH(macOS 上的 Homebrew 以普通用户身份运行)
barn network install / uninstall 安装或卸载宿主全局固定 IP 网络后端(Linux 上的 barn0 网桥,macOS 上的 socket_vmnet launchd 服务)
barn hosts install / uninstall 通过独立的 barn-hosts-helper 修改 /etc/hosts 中由 Barn 标记界定的区块

在请求 sudo 授权前,setup、network 与 hosts 都会先打印完整的变更计划。在终端中,如果宿主缺少依赖或 Barn 网络不完整,up、start、restart 与 reload 会提议准备宿主:它们执行同一份 setup 计划、同样只询问一次,且从不默认 --yes。没有终端时这些命令只报告缺少的条件,无人值守准备请执行 barn setup --yes。

请确保 barn 与 /opt/barn/libexec/barn-hosts-helper 来自同一次构建:CLI 调用 helper 前会核对其内嵌 SHA-256 摘要,helper 在每次写入前后都会校验 /etc/hosts 的属主、权限、硬链接数及预期内容摘要。

相比之下,原生的 barn mac 工作流在虚拟机启动时按需创建用户态 vmnet 网络,不安装任何 root 守护进程或特权网络服务(详见设计说明与卸载指南)。

客机访问与 SSH 信任

Linux 实验环境的默认客机管理账号为 dba(密码已锁定、具备免密 sudo 权限,并使用 $BARN_HOME 中生成的 Ed25519 部署密钥登录)。Barn 同时会将该私钥分发到控制节点,以便在控制节点上运行 Ansible 剧本管理其他节点——因此能够登录控制节点的用户即拥有整套 Linux 实验环境的管理权限。

Barn 针对三类 SSH 连接路径采用不同的主机密钥校验策略:

连接路径 主机密钥策略
宿主 → Linux 客机(经由 barn 或 ~/.ssh/barn_config) 使用独立 known_hosts 文件与虚拟机 UUID 别名,并启用 StrictHostKeyChecking accept-new(首次连接自动记录密钥,后续若密钥不匹配则拒绝连接;显式 recreate 会生成新的虚拟机 UUID)
Linux 控制节点 → 实验环境其他节点 对 Barn 管理的节点别名配置 StrictHostKeyChecking no 与 UserKnownHostsFile /dev/null,使实验节点频繁重建后仍可直接连通
宿主 → 已初始化的 macOS 客机 对照绑定到 barn-mac-<instance_id> 的单机专属 known_hosts 严格校验主机密钥,并禁用 SSH agent forwarding

每台 macOS 虚拟机拥有独立的 Ed25519 SSH 密钥对与随机生成的桌面管理员密码(保存在虚拟机目录内权限为 0600 的 password 文件中,可通过 barn mac password 查看)。首次初始化完成后,Linux 与 macOS 客机均强制使用 SSH 公钥认证,关闭 SSH 密码认证与 root 远程登录,并为管理账号配置免密 sudo。提交 Issue 或分享配置时,请先剔除日志和状态文件中的私钥与密码。

首次连接 Mac 客机时,信任依据来自 runner 独占的私有网络,以及 SSH 连接前后的 runner 身份核验,随后将观察到的主机密钥固定到实例 UUID。GUI 密码与 SSH 私钥采用相同的文件权限边界;私钥已经授予客机 sudo 权限,单独将密码存入 Keychain 只会增加签名身份和锁定状态故障,无法进一步保护客机权限。详见原生 Mac 生命周期。

共享文件与测试磁盘

  • 宿主目录共享:可写共享(Linux vm_shares 中设 readonly: false 或 barn mac --share 使用 :rw)允许客机进程直接修改所挂载的宿主目录,且客机写入的内容在删除虚拟机后依然保留。请仅共享专门的工作目录;若客机无需写入宿主文件,请优先使用只读共享。
  • 持久盘与测试数据盘:普通 Linux destroy 与 recreate 会保留 persistent: true 的持久数据盘。恢复客机时,up 会格式化没有任何签名的数据盘;已有的 ext4 或 XFS 文件系统在检查工具报告可识别的损坏时会被重置,持久盘也不例外;其他探测或检查失败会保留数据并给出警告。重要数据请在实验环境之外做好备份(详见存储与访问)。

下载与镜像信任

Barn 将软件分发与镜像校验划分为四个彼此独立的信任机制:

机制 校验范围
发布资产 checksums.txt 列出每个发布资产的 SHA-256 摘要,包括 CLI 归档、.deb/.rpm 软件包、SPDX 物料清单、Homebrew Formula、安装脚本与发布元数据;安装脚本会按它校验所选归档
macOS 发行包代码签名 正式发布的 Apple Silicon CLI、helper 与 Barn.app 均使用 Developer ID 签名并通过 Apple 公证,App 已装订票据;本地源码构建默认使用 ad-hoc 签名
Linux 镜像目录签名(catalog.json.minisig) 使用二进制内置的 Ed25519 生产公钥校验 catalog.json 签名,并执行按仓库隔离的修订号防回滚检查
镜像产物校验 在启用镜像前逐一核对 .qcow2 文件的字节大小、SHA-256 摘要、虚拟磁盘容量与独立 qcow2 结构安全性

发布资产均从对应标签的源码构建:配齐 Mac 签名密钥时由标签工作流构建,否则走文档中的本地发布流程。发布提交必须先通过源码 CI;两条路径都要求软件包、归档、SBOM 与校验和验证通过后才能创建 GitHub Release 草稿,本地发布步骤见 Mac 发布手册。

1.2.0 的 release.json 用 signed:false, attested:false 描述通用发行元数据的范围:Git tag、通用校验和及发布元数据没有独立密码学签名或 attestation。目录的 Minisign 校验与 Apple Silicon 代码签名/公证仍分别适用于上表中的对象,最终验收记录逐项验证了这些机制。

两个官方镜像仓库(https://repo.pigsty.io/barn 与 https://repo.pigsty.cc/barn)无论通过默认配置还是 --repo 显式选中,均强制要求有效的 minisign 目录签名。通过 --repo 或 BARN_REPO 显式指定的自定义 HTTPS 仓库或本地目录仓库可以使用未签名目录,请仅添加你信任的镜像源(详见镜像参考)。

报告安全漏洞

发现安全漏洞时,请通过 GitHub 私密安全通告或发送邮件至 [email protected] 私下报告,并附上 barn --json version、宿主系统与架构以及脱敏后的最小复现步骤。安全修复发布在最新的 1.x 补丁版本中:只有最新的 1.x 版本受支持,0.x 版本不再提供修复。完整政策见 SECURITY.md;日常功能缺陷请提交至 GitHub Issues。

3.4 - 参与贡献

参与 Barn 源码、文档、软件包与镜像目录的维护。

Barn 采用 Apache-2.0 开源许可证,欢迎参与命令行工具、macOS 原生组件、文档站点与镜像构建流水线的改进。

选择仓库

修改内容 所在仓库
命令行行为、虚拟机生命周期、macOS 原生组件(Barn.app)、安装脚本与软件包 pgsty/barn
文档网站、上手指南、命令参考手册与双语内容 pgsty/barn.pgsty.com
官方 Linux 镜像定义与离线归一化规则 pgsty/barn 中的 packaging/image-repository/ 与 packaging/image-pipeline/

提交问题报告时,请附上 barn version 输出、宿主操作系统与架构、执行的完整命令以及脱敏后的报错信息(移除私钥与密码)。安全漏洞请按安全政策私下报告。准备进行较大规模的实现调整前,建议先提交 Issue 对齐方案;代码规范与 PR 要求详见 CONTRIBUTING.md。

定位源码实现

当前稳定版对应 v1.2.0 标签,相对 1.1.0 的变更见 1.2.0 发布说明。各子系统的实现位置如下:

子系统 源码路径
命令定义、参数解析、JSON/YAML 输出与错误渲染 cmd/barn/、internal/failure/
主机清单解析、默认值填充与节点规格哈希计算 internal/config/, internal/spec/
Linux 节点收敛、事务日志、磁盘管理与 SSH 就绪检查 internal/private/、internal/vm/、internal/cloudinit/、internal/state/
宿主网络、进程身份核验与特权 /etc/hosts 更新 internal/network/、internal/process/、internal/hostconfig/、cmd/barn-hosts-helper/
镜像目录验签、qcow2 结构检查与静态仓库构建工具 internal/image/、tools/catalogexport/、tools/catalogsign/
原生 macOS 虚拟机生命周期与桌面应用 internal/macvm/, native/mac-runner/
打包配置、CI 工作流与集成测试套件 packaging/、.github/workflows/、tests/

阅读实现代码时请同步查看同目录下的单元测试——测试完整界定了哪些故障支持自动恢复、哪些歧义状态必须安全中止。

构建与测试

按从源码构建安装锁定版本的工具链后,运行完整本地门禁:

make check

make check 会依次执行 Go 模块与 Shell 脚本检查、单元测试与竞态检测、go vet、staticcheck、govulncheck、四平台交叉编译(darwin/arm64、darwin/amd64、linux/amd64、linux/arm64)、安装器与镜像流水线测试以及许可证检查。如果改动涉及虚拟化加速、宿主网络或 Barn.app 行为,请在对应宿主平台(macOS HVF / Virtualization.framework 或 Linux KVM)上执行真机虚拟机生命周期测试,并在 PR 中注明实测环境。

修改打包逻辑时,安装 packaging/toolchain.env 中声明的工具版本并运行本地快照检查:

make release-check
make release-snapshot SNAPSHOT_DIST=.goreleaser-review

SNAPSHOT_DIST 需指定工作树根目录下尚不存在的新目录;release-snapshot 会在本地生成并校验归档包、.deb/.rpm 软件包、SBOM 与校验和,不会上传任何产物。

编写与校验文档

新的设计决策、研究结论与验收记录统一维护在本站的 content/blog/design/ 与 content/blog/release/,注明日期、实现状态、来源依据和验收条件,入口为设计文章。任务指南和参考契约放在 content/docs/;源码仓库不再维护 docs/ 目录。

文档站点的每篇文档均由英文 page.md 与中文 page.zh.md 成对组成。修改时请保持中英文的命令、默认值、显式 {#id} 标题锚点(供 OINK v1.5.1 双语对照模式 compare: true 同步章节)、表格与注意事项严格对齐,先说明用户要完成的任务,再展开实现细节,并将 Linux 实验环境与 barn mac 工作流区分清楚。

在网站仓库根目录运行:

make check

make check 会校验 Go 模块、在清除本地主题替换并关闭 Go workspace 的纯净环境下使用 Hugo Extended 与锁定的 OINK v1.5.1 构建全站,随后调用 bin/check_internal_links.py public 检查全部内部链接、标题锚点与静态资源。需要联调本地相邻的 OINK 主题工作区时,请使用 make check-local 或 make build-local。文中的命令行示例请对照 barn <command> --help 核验,YAML 清单示例请使用临时 BARN_HOME 跑通 barn validate 与 barn plan。

发布产物与门禁

自 1.0.0 起的稳定版作为 GitHub 最新正式版(latest)发布;低于 1.0.0 或带预发布后缀的版本标记为 pre-release(预发布版),使用安装脚本时需显式指定 BARN_VERSION。每次发布包含 darwin/linux .tar.gz 归档(含 bin/barn、bin/barn-hosts-helper 与 licenses/)、Linux .deb 与 .rpm 软件包(安装至 /usr/bin/barn 与 /opt/barn/libexec/barn-hosts-helper)、checksums.txt、release.json 及 SPDX 物料清单。

从 0.9.2 开始,Darwin arm64 归档还包含 bin/Barn.app,CLI、helper 与 App 均经过 Developer ID 签名与 Apple 公证。Homebrew 将 App 安装在 libexec 下,普通安装无需 Go 或 Xcode。

自动发布工作流要求配齐全部 6 项 Apple 签名/公证密钥,并成功构建原生组件。6 项均未配置时跳过自动创建发布;仅配置部分时直接报错。Mac 发布手册说明本地签名发布流程、载荷身份、CI 密钥与安装验收。

正式发布版本的验收步骤:

  1. 执行 make catalog-check:在全新临时数据目录中验证两个官方源的签名,要求目录与内置 JSON 逐字节一致,并检查全部 stable 产物的 URL 与大小。目录有变更时先同步内置快照、修订号、时间及 repo.yaml。再运行镜像目录测试,并用全新临时 BARN_HOME 执行 barn update;go run ./tools/catalogcheck -verify-bytes 还会下载并校验全部 stable 产物摘要,不保留下载文件。正式原生构建与两条发布路径均强制执行目录门禁。
  2. 在目标提交上跑通源码 CI 与打包工作流,核对版本号、配对的 barn-hosts-helper 摘要、许可证、SBOM 与 checksums.txt。
  3. 完成 Linux 真机虚拟机验收测试(分发 Barn.app 时同步完成 Mac 真机虚拟机验收)。
  4. 公开 GitHub Release 并更新 Homebrew Formula(pgsty/infra/barn),最后发布文档站并验证公网安装脚本与包管理安装链路。

维护镜像目录

使用镜像流水线工具(packaging/image-pipeline/build.sh 与 build-official.py)校验并离线归一化候选 qcow2 镜像,完成真机启动测试后更新 repo.yaml 并签发 catalog.json。

将二进制内置的 Schema-3 镜像目录逐字节导出到新路径:

go run ./tools/catalogexport /absolute/new/catalog.json

catalogexport 采用原子写入并要求目标路径尚不存在,支持相对路径、~/ 与目录符号链接,并自动创建缺失的父目录。使用 make catalog-sign 与 make catalog-verify 配合离线保存的 Minisign 密钥完成签名与验签(生产环境私钥严禁进入源码仓库或 CI)。客户端侧的验签与缓存策略见镜像参考。

3.5 - 发布 Mac 原生组件

构建、签名、公证并验证 Barn 的原生 macOS 发布载荷。

维护者通过常规的 barn_VERSION_darwin_arm64.tar.gz 归档交付 Mac 原生组件。从 0.9.2 起,标准安装脚本与 pgsty/infra/barn Homebrew Formula 会一并安装 CLI、配套的 hosts helper 与 macOS 宿主上的原生应用包 Barn.app。本文是维护中的发布手册,于 2026-11-12 对照 v1.2.0 发布脚本核验;开发构建请参阅从源码构建。

统一发布身份

原生载荷与 GoReleaser 归档必须使用同一个版本号和源码提交。packaging/mac-release.py 导出 MACOS.md、MACOS.json、bin/barn、bin/barn-hosts-helper 与 Barn.app,清单记录文件权限、摘要和签名状态。VM 磁盘、凭据、恢复镜像与已安装服务不属于发布载荷。

App 的 Bundle ID 为 com.pgsty.barn,内部可执行文件为 barn-mac-runner。CLI 会检查带版本号的 runner 协议,也识别早期的 Barn Mac.app 包名。替换 App 时,$BARN_HOME/mac 下的 VM 状态保持不变。

CLI 内嵌了 helper 的摘要,因此必须按以下顺序签名:

  1. 构建并签名 barn-hosts-helper。
  2. 构建 barn 时嵌入已签名 helper 的 SHA-256,再签名 CLI。
  3. 为 Barn.app 签名,启用 hardened runtime 与安全时间戳。
  4. 将 CLI、helper 与 App 一同提交 Apple 公证;获准后为 App 装订票据(staple),验证票据并检查 Gatekeeper。
  5. 导出并重新解包载荷,再次核验签名与票据。组装发行包时,将 Darwin arm64 归档中的 CLI/helper 替换为这批已签名的字节,重新生成 SPDX 文档与校验和。

载荷构建器与归档检查器会强制核对配套关系。构建 CLI 后再次签名 helper 会改变摘要,导致配对失败。

在本地构建正式版本

准备运行 macOS 27+ 的 Apple Silicon Mac、Xcode 27+、锁定的工具链、Developer ID Application 身份及已保存的 notarytool 配置。用 security find-identity -v -p codesigning 选择签名身份,用 xcrun notarytool store-credentials 创建公证配置;证书私钥和密码保存在仓库外。

检出带有 v$RELEASE_VERSION 标签的干净源码,将 RELEASE_VERSION 设为目标发布版本,并在源码仓库外选择新的制品目录:

export BARN_CODESIGN_IDENTITY='Developer ID Application: your organization (TEAMID)'
export BARN_NOTARY_PROFILE=barn-release
export BARN_MAC_REQUIRE_NOTARIZATION=1
VERSION="${RELEASE_VERSION:?Set RELEASE_VERSION to the checked-out release tag version}"
COMMIT="$(git rev-parse HEAD)"
export SOURCE_DATE_EPOCH="$(git show -s --format=%ct HEAD)"
export BARN_BUILD_DATE="$(date -u -r "$SOURCE_DATE_EPOCH" +%Y-%m-%dT%H:%M:%SZ)"
RELEASE_DIR="$(mktemp -d "${TMPDIR:-/tmp}/barn-release.XXXXXX")"

python3 packaging/mac-release.py build \
  "$VERSION" "$COMMIT" "$SOURCE_DATE_EPOCH" "$RELEASE_DIR/native.tar.gz"
BARN_MAC_PAYLOAD="$RELEASE_DIR/native.tar.gz" \
  make release-local VERSION="$VERSION" OUTPUT="$RELEASE_DIR/assets"

正式原生构建与 release-local 都会在构建前执行 make catalog-check 对应的门禁。官方镜像目录发生变化时,先按发布门禁同步并测试。快照或 uncommitted 载荷不能用于正式本地发布。release-local 核验归档、软件包、SBOM、校验和与 CLI/helper 配对,将完整制品写入指定目录。

开发打包逻辑时,可用 BARN_MAC_PAYLOAD=/absolute/native.tar.gz make release-snapshot 验证原生载荷合并。载荷版本必须匹配 .goreleaser.yaml 选择的快照版本,例如 v1.2.0 之后为 1.2.1-next;脏工作树使用 uncommitted,干净源码使用完整提交号。快照接受 ad-hoc 签名,正式发行检查要求载荷已经过 Developer ID 签名与公证。

配置自动签名

标签工作流使用以下 6 项仓库密钥。全部未配置时跳过自动创建发布,维护者可使用本地流程;只配置部分时立即失败;全部配置后,原生构建、签名或公证任一失败都会阻止组装发行包。

密钥 内容
MAC_CERTIFICATE_BASE64 包含私钥的 Developer ID Application .p12 文件,经 Base64 编码
MAC_CERTIFICATE_PASSWORD .p12 的保护密码
MAC_CODESIGN_IDENTITY 导入后的身份名称或证书指纹
MAC_NOTARY_KEY_BASE64 App Store Connect API .p8 密钥,经 Base64 编码
MAC_NOTARY_KEY_ID API 密钥标识符
MAC_NOTARY_ISSUER API 签发者标识符

Mac 工作流将签名材料导入临时 runner 钥匙串,并在任务结束时删除。PR 与快照使用 ad-hoc 构建。发布工作流验证完整载荷后创建发布草稿。

验证安装并发布

运行 make check、make mac-native-test 以及包含原生载荷的完整快照。在隔离目录中验证首次安装、重复安装与升级,并在受支持的物理 Mac 上使用打包后的 App 验证启动、SSH、桌面窗口与正常关机。替换 App 必须保留实例 ID、机器 ID、SSH 密钥和已固定的主机密钥。

已有的 tests/mac-live-acceptance.py 要求绝对 --barn 路径、专用可丢弃的 --home、与其分离的新建或空 --output 证据目录,并用 --allow-test-root 显式授权该测试目录。先用 --plan 查看流程;--gui 增加桌面/剪贴板检查,--allow-download 允许在未准备基底时从 Apple 下载。脚本保留失败现场与证据。测试 SSH 集成时,除了 BARN_HOME 还应隔离进程的用户主目录,因为受管的 ~/.ssh/config 条目位于 VM 状态目录之外。

发布组装从 packaging/homebrew/barn.rb.tmpl 生成 barn.rb。Formula 将 barn 安装到 bin,将 helper 与 App 安装到 libexec;安装与测试逻辑应与 Tap 保持一致。带后缀的版本需要显式 version 行,避免 Homebrew 从架构后缀误推导出 64;普通版本省略该行。0.9.1 的公开归档早于 App 随包交付,仅支持 Linux 客机。

核对本地制品后,推送源码与标签,上传到 GitHub Release 草稿并核验上传字节,再公开发布。低于 1.0.0 或带预发布后缀的版本标记为 pre-release,稳定版设为 latest。公开制品可用后更新 Homebrew 四个平台的 URL 与摘要,随后用已发布的字节验证公开归档、安装脚本与 Homebrew 升级。签名、公证、VM 验收与公开安装的结果分别记入验证历史。

3.6 - 验证历史

Barn 历次发布、原生虚拟机测试、镜像校验与设计演进的原始记录。
说明

本页汇集截至 1.2.0 的源码、打包、VM 与公开安装验证记录,每条保留原有日期、测试版本和范围。当前宿主支持与版本行为请查阅平台与限制及发布说明。

Barn 1.2.0 最终验收 — 2026-11-12

项目 记录的身份
标签与提交 v1.2.0 → 90f615804b823b4eb491101e642073dcd37a9700
构建时间 2026-11-11T23:38:07Z;SOURCE_DATE_EPOCH=1794440287
GitHub Release ID 442314866;于 2026-11-12T00:05:32Z 作为 stable/latest 发布
Apple 公证 提交 165b486b-5055-4eca-a595-54bed6bdd6c1 获得 Accepted
签名目录 Revision 2026110502;SHA-256 d41e46d20bc57cb1b071e3919a27a8f7f703df2addca879970a528e7ab004065
  • CI 与打包:源码/Mac CI与完整打包 CI均通过发布提交。标签工作流通过签名配置检查并跳过远端组装;正式发行包按文档中的本机签名流程构建。make release-local、签名、公证、staple 与 Gatekeeper 均通过。
  • 最终制品与目录:全部 20 个 draft 附件及 20 个匿名公开下载的大小与 SHA-256 均匹配已核验本地字节。两个官方目录均通过验签、全新数据根激活和内置字节比对,每个镜像源的 17 个 stable 制品通过可达性/大小检查;运行时选用镜像的下载也核验了制品摘要。
  • 最终运行时:回下载 Linux 归档通过 18 步 KVM 验收,覆盖 ext4/XFS 根盘扩容、幂等性、拒绝缩盘、客机工具失败、CLI 中断、身份/数据保留、并发与销毁。原生 Mac 回下载载荷完成全部 15 阶段,补充通过桌面、双向剪贴板、关窗后后台运行、SSH 与正常关机检查。一次 Apple HTTPS 超时保留日志,重新核验身份与基底后续跑成功,产品字节未改动。
  • 公开交付:darwin/arm64、linux/amd64 均通过公网 latest 与指定版本安装;隔离的 1.1.0 安装器升级及重复安装通过。Homebrew 更新通过真实 1.1.0 → 1.2.0 升级、brew test、style 与严格在线 audit。双语参考按 1.2.0 记录 57 个命令,每种语言含 174 项本地选项。

物理宿主运行覆盖为 darwin/arm64 与 linux/amd64;darwin/amd64 和原生 linux/arm64 完成交叉构建及制品检查。首页历史 1.1.0 录像已明确标注版本。候选升级证据、重试记录及范围限制见完整发布核对。

Barn 1.2.0 发布准备 — 2026-11-12

1.2.0 发布准备核对记录了未提交候选版本的源码、镜像目录、完整 snapshot、Linux/KVM 与原生 Mac 检查,以及随后完成的提交、CI、签名和公开发布门禁。

Barn 1.1.0 最终验收 — 2026-11-09

项目 记录的身份
标签与提交 v1.1.0 → b2cc8da8983e710255d504bf26bf5d7b3f182790
构建时间 2026-11-09T01:28:55Z;SOURCE_DATE_EPOCH=1794187735
GitHub Release ID 438656123;于 2026-11-09T01:46:13Z 作为 stable/latest 发布
签名目录 Revision 2026110502;SHA-256 d41e46d20bc57cb1b071e3919a27a8f7f703df2addca879970a528e7ab004065
  • 源码与打包:发布提交在打标签前通过源码/Mac CI与完整打包 CI。本地 make check、make mac-native-test 和 make release-snapshot 也全部通过。Tag 工作流通过签名配置检查;仓库未配置自动签名密钥,因此完整发行包按发布手册在本机签名构建。
  • 回下载制品:重新下载 draft 的全部 20 个附件,大小与 SHA-256 均与本地原件一致。19 项校验清单、归档/软件包一致性、四平台二进制架构、文件权限、helper 配对与 SPDX 物料清单全部通过检查。Apple 接受公证提交 cabe1b9c-fc54-4f07-b8bf-d834f0226013;下载后的 App 通过签名、票据装订与 Gatekeeper 检查。移入 Homebrew 的 bin/libexec 布局后,CLI 仍能找到匹配的原生组件。
  • 镜像目录:两个官方源均通过签名验证、临时数据目录激活及内置字节比对,两个镜像源各自的 17 个 stable 制品均通过 HTTP 可达性与大小检查。最终下载的二进制也在全新的 BARN_HOME 中激活了官方目录。
  • Linux 运行时:下载的 linux/amd64 二进制通过 -I d13 -A x86_64 创建 Debian 13 客机,清单文件保持原样。CPU/内存 2/2 GiB → 3/3 GiB → 2/2 GiB 调整、停止/启动、远程参数与退出码 17 均通过检查;VM UUID、SSH 公钥、machine ID 与持久盘数据哨兵在资源调整和重启后保持不变。随后通过 -A aarch64 启动 ARM64 Debian 13 客机,QEMU 使用 TCG 与 cortex-a72,SSH 返回 aarch64。两台测试客机均在验收后删除。
  • Mac 运行时:新建的隔离 macOS 27 客机通过创建、SSH、远程退出码 17、停止/启动、身份与数据保留、销毁检查。用户现有 SSH 文件保持不变,原先运行的 Mac 虚拟机继续运行。公开签名安装器在独立目录中的安装与重复安装也通过验证。
  • 公开交付:全部 20 个公开附件均可匿名下载,字节与已核验 draft 一致。默认安装器与显式 BARN_VERSION=1.1.0 均安装了公开版本。Homebrew 更新同步了四个平台的归档 URL 与摘要。首轮公开安装录像在 Ubuntu 26.04 上验证了公网安装与首次 Linux VM 启动;当前首页录像展示 Apple Silicon macOS(macOS 27.0.1、QEMU 11.1.3)上的真实 brew install pgsty/infra/barn、./configure -c full、四节点 barn up 与 barn status 过程。随后的 Apple Silicon 16 阶段原地升级与多发行版完整验收记录见 Barn 1.1.0 本机完整验收。

物理宿主覆盖 darwin/arm64 与 linux/amd64,另验证了 TCG 下的 linux/arm64 客机;darwin/amd64 与原生 linux/arm64 的证据范围是交叉构建与制品检查。GUI 和剪贴板保留此前记录的验证日期与范围。早期验收脚本重试修正了不存在的超时参数、需要客机 sudo 的测试写入,以及未接受 thread=multi 选项的 TCG 断言;失败日志与成功结果一并保留。

Barn 1.0.0 最终验收 — 2026-11-05

最终验收记录将下载制品与公开安装检查绑定到以下发布身份:

项目 记录的身份
标签与提交 v1.0.0 → 69ef7f1d6ffc7c6fbffffe178b2fa48e799dc02d
构建时间 2026-11-04T17:54:45Z;SOURCE_DATE_EPOCH=1793814885
GitHub Release ID 434268111;于 2026-11-04T23:18:10Z 发布为 stable/latest
签名目录 Revision 2026110502;SHA-256 d41e46d20bc57cb1b071e3919a27a8f7f703df2addca879970a528e7ab004065
  • 源码与下载制品:最终提交通过源码/Mac CI与打包 CI。自动签名密钥未配置,本轮使用本地 Developer ID 签名流程。20 个上传附件全部重新下载,大小与 SHA-256 和原始制品一致;19 项校验和,以及归档/软件包、CLI/helper 配对、架构、权限、SBOM 与身份核验全部通过。
  • 镜像实际字节:两个官方目录验签通过,与内置字节一致;从每个源流式下载全部 17 个 stable 制品,共 34 次大小和摘要检查通过。全新 BARN_HOME 的 barn update 成功激活目录。
  • Mac 下载件验收:CLI/helper/App 的 Developer ID、公证、staple 与 Gatekeeper 检查通过,安装后及移动到 Homebrew 布局后再次验证通过。隔离安装器完成 0.9.3 → 1.0.0 升级,保留旧版本及已有 VM 的身份、SSH 密钥和数据哨兵;新 VM 通过 SSH、写入、stop/start、身份/数据保持及销毁检查。
  • Linux 实机:下载的 linux/amd64 程序在全新状态目录中创建两台 Debian 13 客机,固定 IP、账号、XFS 数据盘、stop/start/restart、参数边界与远端退出码 17 均通过。清单缺节点时重建在停机前拒绝;删除控制节点后接任成功;destroy 后重新 up 更换机器身份并保留持久盘哨兵。
  • 公开渠道:正式发布后,默认安装器与显式 BARN_VERSION=1.0.0 均完成公开安装。真实 Homebrew 从 0.9.2 → 1.0.0 升级,通过 brew test、在线 audit 与 Tap 测试。Tap 更新和站点更新完成发布,公开双语发布页及安装页通过检查。

物理宿主运行覆盖为 darwin/arm64 与 linux/amd64,darwin/amd64 与 linux/arm64 完成交叉构建及制品检查。前一轮候选的 GUI、剪贴板与故障注入实验保留下方原有身份。

加固与候选演练 — 2026-11-04–05

377061c 的加固检查点通过源码检查及不含 Mac 原生载荷的 0.9.4-next 打包快照。随后真机测试从 0.9.4-next 开始,修复后完成定向复测,再构建签名公证的 1.0.0-rc.1,使用目录 2026102802。候选演练覆盖数据盘保留、取消 sudo 后锁释放、共享 networkd 卸载、Mac 15 阶段生命周期、GUI/剪贴板与中断 recreate 恢复。最终发行包随后改用目录 2026110502 和上方正式身份。

记录同时保留失败与成功重跑:短时 SSH 探测需要有界重试,资源不足的构建和共享模块缓存故障需要修正环境,一处验收断言错误地要求成功空输出必须含有 stdout 字段。dm-error 实验在整盘保护分支就被拒绝,尚未进入文件系统检查器。这些观察明确了实际执行过的产品路径,以及属于测试脚本或环境的失败。

Barn 0.9.1 本地候选验收 — 2026-10-22

0.9.1 记录包含通过的 make check、原生组件测试、四平台打包与 ad-hoc 原生载荷。CLI 候选为 0.9.1-dev.1,完整快照为 0.9.1-next;通过本地下载夹具,从真实 0.9.0 归档完成隔离升级,验证重复安装、旧版本保留、helper 配对与 App 发现。Homebrew 检查覆盖 bin/libexec 布局,原生测试和 mac doctor 没有启动 VM。公开 0.9.1 制品只有 CLI/helper 归档与 Linux 软件包,不含 Barn.app;原记录后半的公开发布清单描述后续流程,不能当作已完成的运行证据。

0.9.0 发布前检查点 — 2026-09-29

在 2026-09-29 检查点时,Barn 0.9.0 是完成项目更名后的首个候选发布版本。现行安装方式请参见快速上手。

文档基线

对象 2026-09-29 检查点状态 范围说明
程序与文档 Barn 0.9.0 候选版本 基于完成更名的源码树构建
CLI 与配置文件 barn、barn.yml、BARN_* 全面启用新命令名与环境变量,不保留旧内部名称回退
状态与宿主资源 ~/.barn、Barn 网络与 barn-hosts-helper 使用全新 ~/.barn 状态目录,不迁移更名前的旧开发状态
镜像仓库 官方端点 /barn 路径 强制校验 minisign 镜像目录签名

macOS 客机

在 2026-09-29 检查点,barn mac 通过 Barn Mac.app(签名标识 io.pgsty.barn.mac-runner,后于 Barn 0.9.1 统一为 Barn.app / com.pgsty.barn)在 Apple Silicon 上运行 macOS 27 客机,状态独立保存在 $BARN_HOME/mac 下(现行用法见macOS 客机指南与 Mac 命令参考)。

2026-09-29 完成更名后,本地 CLI 与 barn-hosts-helper 单元测试、原生 Bridge/镜像/退出提示/菜单测试、runner 编译、ad-hoc 签名校验与 probe 探测全部通过,与同日早些时候完成的 16 阶段 Mac 真机生命周期验收相衔接。

更名记录明确将更名后构建的证据限定为上述检查,没有重跑 VM 生命周期。2026-10-03 的归档更正保留原有日期、版本、提交与测试范围,没有把更早的 VM 实验归到更名后构建。

0.9.0 发布前待收口项

在 2026-09-29 检查点,正式公开 0.9.0 前剩余的门禁项包括:

  • 最终发布标签提交上的完整源码测试、四平台归档、DEB/RPM 软件包、安装脚本与跨平台检查。
  • 新名称下的全新宿主环境准备、Linux/macOS 虚拟机生命周期与卸载清理复核。
  • macOS 原生组件的 Developer ID 签名、公证与发布。
  • GitHub 仓库、Homebrew Tap、两地 /barn 官方镜像源与 barn.pgsty.com 公开可用性核验。

早期 Mac 实现记录

  • 2026-09-26–27:初期实现日志记录完整 IPSW 下载与 CLI 恢复安装、基础镜像不变性、双客机生命周期及安装器拒绝篡改包。最终 12 阶段流程耗时 140.305 秒,起点是已经初始化的客机,使用退役的固定槽位/共享网络实现及 ad-hoc 开发签名。
  • 2026-09-28:复杂度复核在简化实现时保留身份、锁与恢复保护,并验证就绪检查不重写 SSH 材料。首轮关机超时与客机高负载同时出现,随后完整重跑通过,没有强制断电或调整超时;记录将高负载保留为观察,没有将其认定为根因。

Barn Mac 实机记录:2026-09-29

2026-09-29,更名前的开发源码在搭载 Apple Silicon、运行 macOS 27.0(26A428)的 Mac 上使用 ad-hoc 签名构建完成全套实机验证;测试复用 2026-09-26 基于 Apple 27.0 恢复镜像准备好的基础镜像 APFS 克隆:

  • 源码与组件包检查:完整 make check、原生 Swift 组件测试,以及应用包构建、解包校验和、代码签名与 probe 检查全部通过。
  • 16 阶段自动化真机验收(耗时 244.9 秒):覆盖从基础镜像创建虚拟机、带 VirtioFS 共享目录的命名虚拟机、独立机器标识与 sshd 策略、磁盘隔离、每台虚拟机独立的子网隔离、DNS 与公网 HTTPS、退出码透传、exec 参数边界、共享目录双向读写、正常 stop/start、configure、拒绝启动第三台并发虚拟机、recreate 重置身份、打开桌面窗口、双向纯文本剪贴板同步、重复 up 幂等性以及 destroy。
  • 人工计时与恢复验证:从已准备好的基础镜像创建虚拟机到 SSH 就绪耗时 22 秒,正常关机耗时 6.5 秒,二次启动到 SSH 就绪耗时 6–12 秒,强制断电耗时 0.7 秒。同时验证了引导进入 macOS 恢复模式(--recovery)、更换 --subnet 后保持固定 SSH 主机密钥,以及通过已安装的 ~/.ssh/barn-mac_config 直接执行 ssh mac1。

当时留待后续里程碑验证的事项:

  • 原生应用包的 Developer ID 签名、Apple 公证与公开发布。
  • 通过 CLI 从零下载 IPSW 并准备基础镜像(无基础镜像时首次 barn mac up 或 barn mac image update)。
  • 桌面窗口菜单中的 Restart… 与 Shut Down… 动作、更多 Apple Silicon 机型以及物理宿主重启验证。

同一份具名机器记录还包含稍后的 07ebfd4 候选重跑:首轮五秒 SSH 探测失败、后续观察恢复应答后,全部 16 阶段在 298.9 秒内通过。两次都复用了已有 26A428 基底,该检查点未覆盖从零下载与恢复安装。

更名前的 Linux 验证概览

宿主或产物 验证路径 验证日期 结果
两台 Linux amd64 宿主(m0、m3) KVM,每机 7 个发行版 2026-09-21(0.8.0) 从零初始化、首次 SSH、候选版本原位升级、重复 up、stop/start、磁盘身份与 Ansible 配置读取全部通过
两台 macOS arm64 宿主(m1、m5) HVF,每机 7 个发行版 2026-09-21(0.8.0) 完成相同生命周期检查,并通过每机 7 节点 ansible all -m ping
镜像目录 2026092001 9 个系列、37 个产物(9 月 Debian/Ubuntu 更新) 2026-09-21 内置、本地、局域网与公网目录字节一致(23e8dbf6...);10 个新镜像在两个公网端点大小匹配并通过四机真机验收
Ubuntu 26.04 amd64 KVM、QEMU 10.2.1、Ubuntu 24.04 客机 2026-09-16(0.7.0 恢复) 损坏数据盘重置、探测失败保护、忙碌挂载、保留盘重建、共享目录恢复与幂等 up 全部通过
macOS arm64 HVF、Ubuntu 24.04.4 客机 2026-09-05(0.6.0 生命周期) 创建、扩容、节点间 SSH、stop/start、reload、recreate、降级 status 与缩容全部通过
macOS 26.6.2 arm64 HVF、QEMU 11.1、socket_vmnet 2026-09-01(v0.2.0) 选定节点创建/SSH/停启、增量创建已缓存镜像、全局 status 与全局 destroy 通过
macOS 26.6.2 arm64 HVF、QEMU 11.1、socket_vmnet 2026-08-27 单节点与增量四节点生命周期通过
Ubuntu 26.04 amd64(mx) KVM、QEMU 10.2.1、NetworkManager 2026-09-01(v0.2.0) 审计现存四节点运行中部署并连通控制节点
Ubuntu 26.04 amd64(mx) KVM、QEMU 10.2.1、NetworkManager 2026-08-27 宿主 setup、单节点、增量四节点与网络卸载通过
macOS arm64 HVF 宿主、Rocky Linux 8.10 arm64 TCG 兼容规则 2026-08-28 启动、stop/start 并在 44.2 秒内达到 SSH 就绪
已发布镜像目录 2026090501 9 个系列、27 个 qcow2 产物 2026-09-05 产物校验、内置与公网字节一致,以及两个官方端点的签名 barn update 通过
已发布镜像目录 2026082903 9 个系列、27 个签名 qcow2 产物 2026-08-29 19 GiB 全量 SHA-256 校验与干净客户端拉取 d13:stable 通过

在 0.8.0 四机验收中,每台宿主均实测了 Rocky Linux 9.8/10.2、Debian 12.15/13.7 与 Ubuntu 22.04.5/24.04.5/26.04.1(共 28 个客机实例全部通过,验收后已清理测试虚拟机)。两个公网端点提供的镜像目录 2026092001 摘要均为 23e8dbf6c19bd192d56c6d71eb30901f17945b3487e427a43abe108463780306,并通过了隔离客户端 barn update 验签以及 10 个新增镜像对象的 HTTP HEAD 长度核对。

当时待补充的测试覆盖

  • 启用 NetworkManager + firewalld 的 EL9 宿主,以及最新 systemd-networkd 宿主重放。
  • 物理宿主重启后的部署状态保持。
  • darwin/amd64 与 linux/arm64 宿主的真机虚拟化运行(除交叉编译与打包检查外)。
  • linux/amd64 原生 el7 完整生命周期重放。
  • 完整 Pigsty configure → barn up → install.yml 部署流程。
  • 通过公网安装脚本、Homebrew Formula 或已发布 DEB/RPM 软件包在全新宿主上从零执行 setup 与创建虚拟机。

Barn 历次版本验证记录

Barn 0.8.0 — 2026-09-21

  • 发布 CI 与公开制品:标签 v0.8.0(320a32afa8f6fca02592215aa0d5607ca4e852b2)通过源码 CI、打包快照工作流与标签发布工作流,产出 20 个发行资产(含 19 项校验和载荷)。全部 20 个公开资产通过匿名下载与 SHA-256 校验,公网安装脚本在 darwin/arm64 与 linux/amd64 的隔离用户目录中成功安装并验证 0.8.0(320a32a)。
  • Homebrew Tap:提交 9c34019 将四平台 Formula 更新至 0.8.0,通过本地 brew fetch、audit 及 Tap CI。
  • 四机七系统真机验收:在基线提交 6d7870e26cb2f4082a00c188f746783fc027687e 上清空四台宿主(两台安装 .deb 的 Linux amd64 宿主 m0/m3,两台使用校验归档安装的 macOS arm64 宿主 m1/m5),从局域网镜像源从零拉起七系统 pro 清单。随后将包含 Homebrew 认证顺序修复的候选提交 1c054a027420b5410c6f6feb344e27e001ae1af1 原位更新到四台宿主,验证幂等 up(保持 QEMU 进程、VM UUID 与磁盘 inode 不变)、两轮客机 SSH、stop/start、/data 数据盘读写、Debian locale/XFS、控制节点到各节点 SSH 以及 Ansible 配置读取(两台 Mac 额外跑通 7 节点 ansible all -m ping)。详细计时样本见 0.8.0 发布说明。

Barn 0.7.0 — 2026-09-16

  • 发布 CI 与公开制品:提交 9c6d4896d93733d1cb60a7e5d8591e9a06659c9d(v0.7.0)通过源码 CI、打包快照工作流与标签发布工作流。全部 20 个公开资产通过匿名下载与摘要核验,darwin/arm64 与 linux/amd64 公网安装脚本验证通过,pgsty/infra/barn Formula 通过本地升级与 brew test。
  • Ubuntu amd64/KVM 存储与中断恢复矩阵:实测损坏的 ext4/XFS 数据盘自动重置(3.2 秒恢复并保留运行中 QEMU 进程)、recreate 保留持久盘、探测失败与忙碌挂载保护(保留原有数据与磁盘 UUID)、只读 9p 共享降级回退,以及在 3.3 秒内接续恢复一台此前因出网探测失败而中断的 0.6.0 虚拟机(由于 0.6.0 已清理暂存的控制节点私钥,恢复后按预期报告 control-ssh 告警,详见 0.7.0 发布说明)。镜像目录保持 2026090501。

Barn 0.6.0 — 2026-09-05

  • 发布 CI 与公开制品:完成生命周期、命令交互、发布元数据与 CI 测试夹具审查后,提交 057774e3a13477782a2ae07bd71127d03c0f1ae7(v0.6.0)通过 Go 1.27.1 源码 CI、打包检查(13d9d70)与标签工作流,生成并校验全部 20 个发布资产。在 darwin/arm64 隔离目录中验证了从 0.5.0 升级至 0.6.0、barn init 与 Ubuntu 24.04 barn plan。
  • macOS arm64/HVF 生命周期验收:验证首次启动、不重启控制节点的在线扩容、控制节点到同伴节点 SSH、stop/start、reload、局部 recreate、缩容、客机 /etc/hosts 刷新、无效镜像 reload 与冲突局部 recreate 的停机前拦截、部分节点异常时的 status 展示,以及 SSH 退出码 255 原样透传。
  • 镜像目录 2026090501:将默认镜像切换为 u24:stable,合并 2026090302 的 Debian/Rocky 更新,全部 27 个产物通过字节校验并在两个官方端点完成隔离客户端 barn update 验签。

Barn 0.5.0 — 2026-09-03

提交 fc85b65ff6a24b0933b56ae1179be9ada2ba91b1(v0.5.0)通过 Go 1.27.1 源码门禁与 GoReleaser 打包检查并发布 20 个预发布资产。0.5.0 新增无需确认的整套部署清理命令 barn purge,将全球默认镜像源设为 https://repo.pigsty.io/barn 并提供 --mirror 切换 https://repo.pigsty.cc/barn,移除镜像下载时的隐式上游 URL 回退,并新增锁定摘要的八目标 Debian/Rocky 官方候选镜像构建脚本 build-official.py。

Barn 0.4.0 — 2026-09-02

通过 make check 及发布工作流的归档、DEB/RPM、SBOM、校验和、安装脚本与 Homebrew Formula 门禁。barn up 支持在未初始化的交互式终端宿主上自动引导执行 setup,vm_disks[].fs 默认值改为 auto,客机就绪失败报错附带最后一行错误详情,并统一了全命令行的输出样式。

Barn 0.3.0 — 2026-09-02

通过 make check 及全部发布打包门禁。将镜像目录刷新改为显式的 barn update 与 barn image sync 操作,并在客机就绪失败时输出各节点所处阶段与对应的 barn logs 排查命令。

Barn 0.2.0 — 2026-09-01

提交 59d1b62aebb3d044a317e4006cc8a0bf56f4feaf(v0.2.0)通过源码 CI、打包工作流及本地四平台归档、DEB/RPM 与 SPDX 校验。darwin/arm64 HVF 真机重放验证了选定节点 u24-1 的创建/SSH/停启、已缓存 el9-1 的增量创建、包含未创建节点的全局 status,以及全局 destroy 与 SSH 配置片段清理;Ubuntu 26.04 amd64/KVM 验证了存量四节点部署的状态审计与控制客机连通。

Schema-3 镜像目录收口 — 2026-08-29

镜像目录 2026082903(9 个系列、27 个产物,SHA-256 571b1ff9c7d4d42355df3392ea62a339471c2d01d868669a7625fac8b93f245d,生产公钥 4686B39A40F9B562 签名)通过了内置目录与公网端点逐字节比对、全部 27 个 qcow2 文件(共 19 GiB)全量 SHA-256 扫描,以及 darwin/arm64 空白客户端拉取 d13:stable(409.3 MiB)与 qemu-img 结构检查。

0.1.0 候选验证 — 2026-08-28 与 2026-08-29

在 0.2.0 发布前验证了两项关键修复:

  • QMP 套接字局部恢复:在 darwin/arm64 四节点环境中,当其中两台运行中节点的 QMP 套接字被外部删除后,Barn 仅重启受影响的两台节点(13.7 秒恢复就绪),其余两台正常节点的 boot ID 保持不变。
  • 无 QEMU 环境下的目录查询:消除了 barn image list 与源码测试在不校验本地 qcow2 缓存时对 qemu-img 的依赖,使 make check 在未安装 QEMU 的纯净机器上即可跑通。

EL7/EL8 兼容性恢复 — 2026-08-28

提交 7c666c7 修复了破坏性操作前的运行时预检顺序与签名镜像目录基线迁移逻辑,补充回归测试并恢复了 el7/el8 支持。镜像目录 2026082801(9 个系列、17 个镜像产物及 2 份 socket_vmnet 归档)通过全量 SHA-256 与签名校验;darwin/arm64 隔离重放通过内置 TCG 兼容规则启动 Rocky Linux 8.10 arm64,stop/start 后在 44.2 秒内达到就绪状态,验证了 NetworkManager、固定 IP、dba UID/GID 88 与客机初始化标记。

真机重放基线 — 2026-08-27

在 darwin/arm64 与 linux/amd64(mx)两台宿主上验证了固定 IP、SSH 就绪、默认 CPU/内存/根盘/数据盘、cloud-init、stop/start、跨目录命令执行、扩容期间保持控制节点 boot ID 不变、控制节点到同伴节点 SSH、忽略非 Barn 管理的 Pigsty 字段变更,以及仅在显式 destroy 时删除虚拟机。Linux 宿主额外验证了免密 sudo 自动化、Debian qemu-bridge-helper 用户组授权、普通用户 QEMU 挂桥测试、挂有四个 tap 接口时拒绝卸载网络,以及 destroy 后精确还原宿主状态。

3.7 - Barn 0.9.3 变更

Barn 0.9.3 的资源调整、中断恢复、路径、共享、节点选择、镜像与限制。

本页记录 Barn 0.9.3(2026-10-31)中已经发布的用户可见变更。路径、共享与工作流调整始于源码提交 27f17bb,其余恢复与资源变更在后续提交中完成。核对其他构建时请使用 barn version。

升级摘要与完整双语说明见 Barn 0.9.3 发布说明。

资源调整与中断恢复

修改 vm_cpu 或 vm_mem 后执行 barn resize [node...]。运行中的虚拟机有预留容量且 QEMU 后端支持时,增加的资源会热插拔;减少资源、旧虚拟机或不支持的后端会自动停机再启动。虚拟机身份、磁盘与 SSH 密钥保持不变。resize 会拒绝镜像、磁盘、网络、共享目录、创建、删除和部署级变更,应根据 next: 字段使用 recreate、up、destroy 或完整的选择操作。

Linux 与 macOS 的生命周期、持久盘及替换操作会记录转换状态。进程被中断或收到 SIGINT、SIGTERM 后,下一次生命周期命令可以继续恢复;取消的命令返回结构化的 cancelled 结果。在 macOS 上,barn mac up --no-wait 在虚拟机进程启动后返回,首次启动的 SSH 与 sudo 初始化可能仍在进行;请再次执行 barn mac up NAME 等待就绪。

路径

barn init 与 setup 支持通过目录符号链接工作,init -o ./lab/config/barn.yml 还会自动创建缺失的父目录。覆盖已有文件仍需 --force,写入不会跟随或替换输出文件本身的符号链接。

用户传入的路径支持常见开发目录布局:

输入 解析方式
BARN_HOME 支持相对路径、~/ 与目录符号链接,也可以是当前工作目录
清单与 provision --script 支持指向普通文件的符号链接;每个文件仍有 4 MiB 上限
Linux vm_shares.host 相对于清单真实文件所在目录,也接受绝对路径、~/ 与目录符号链接
本地镜像仓库与 image import 支持相对路径、~/ 与符号链接输入
catalogexport 输出 支持相对路径、~/、父目录符号链接及自动创建父目录;目标文件须不存在
BARN_MAC_RUNNER 与本地 socket_vmnet 归档 支持相对路径与 ~/;归档输入可为符号链接,仍需通过摘要校验

命令行相对路径以当前工作目录为基准,相对 BARN_HOME 也遵循这条规则。跨目录操作同一部署时,请使用绝对 BARN_HOME。Barn 仍拒绝将 / 或用户主目录作为数据根目录,并校验受管状态的属主与结构。归当前用户所有的 ~/.ssh 目录可以通过目录符号链接访问;若 ~/.ssh/config 本身是链接,仍需手动添加 Include。

共享目录与挂载路径

Linux 客机使用 QEMU Virtio-9p,现已支持 macOS 与 Linux 宿主,但 QEMU 和客机内核均须支持 9p。原生 macOS 客机继续通过 barn mac --share 使用 VirtioFS。

  • Linux 共享源按当前用户的实际文件系统权限访问,可归其他用户所有、与其他源重叠,或由多个客机同时读写。并发写入由用户协调,与多个宿主进程共用目录相同。
  • 宿主源路径支持空格、Unicode 与逗号。Linux 客机挂载路径会自动规范化,并正确转义 Shell 命令与 fstab 中的空格、Unicode 和 Shell 标点。
  • Mac 共享名称支持空格与中文,须为 1–255 字节的有效 UTF-8,不能是 .、..,也不能含 / 或 ASCII 控制字符;共享源支持目录符号链接。
  • 移除 8 个共享的固定上限,实际仍受后端设备与宿主资源约束。Linux 共享源不能与 BARN_HOME 重叠,客机挂载目标不能与其他目标、系统目录、数据盘挂载点或客机 SSH 目录重叠。

Linux 共享示例见存储与访问,原生 macOS 共享见 Mac 命令。Barn 不会为了让共享可写而修改宿主文件属主。

仅应用选定节点的变更

显式选择节点执行 plan、up、reload 或 recreate 时,其余节点保留已应用定义,即使当前清单已修改或省略它们。未创建且未选中的节点不要求解析镜像,因此可以一次编辑多个节点,再分批应用:

barn plan node-1 -f barn.yml
barn recreate node-1 -f barn.yml
barn plan node-2 -f barn.yml

整份清单仍须通过语法解析。与已应用节点的地址、别名、控制节点角色或部署公共设置发生冲突时,Barn 会在停机删盘前报错。不传选择器时仍检查整份清单,删除 YAML 条目不会自动删除虚拟机。操作流程见日常管理。

生成模板时选择镜像

barn init [模板] --image <引用> 会把显式的 vm_image 写入 all.vars,让所有生成节点继承该镜像。准备生成模板时,barn setup [模板] --image <引用> 也采用同样的行为。引用可以是镜像别名、频道或版本选择器;该参数不会下载镜像。通过 -f 指定或自动发现的已有清单不会被此参数改写。

镜像与开发工作流限制

项目 新行为
Linux 节点数 不再另设 20 节点上限;节点须使用部署 /24 中互不重复的可用地址,且宿主资源充足
外部清单主机 vm_skip: true 可使用主机名或 IPv6 键;托管虚拟机仍使用 IPv4,清单至少保留一个托管节点
Linux 容量字符串 单位大小写不敏感;K/M/G/T 与 KiB/MiB/GiB/TiB 为二进制,KB/MB/GB/TB 仍为十进制
Provisioning --parallel 接受正整数,最多启动与所选节点数相同的工作线程;--timeout 接受任意正时长,移除原有 4 并发与 24 小时上限
镜像大小 本地导入及声明了大小的目录产物不再限于 8 GiB;未声明大小的旧协议下载仍保留 8 GiB 边界
镜像导入 源文件可任意命名;新缓存使用 local/<sha256>.qcow2,同名不同内容可共存,相同内容复用缓存
本地别名 移除 256 个别名上限;注册表元数据超过 1 MiB 时在写入前报错,重新导入已有别名时保留原缓存路径
本地仓库 支持相对根目录、目录链接与共享可写目录,repo.yaml 可以是指向普通文件的符号链接
Mac 日志 --lines 接受任意正整数,不再按 1 MiB 或 10000 行静默截断请求的日志
备用端口 按 首选端口 + n × 10000 尝试至 65535,不再仅尝试前五个候选值

Provisioning 仍默认串行、超时一小时,每个节点分别最多捕获 1 MiB 的 stdout 与 stderr。这些用户参数与内部虚拟机启动调度并发是不同的设置。镜像摘要、声明大小、qcow2 结构、持久盘兼容性及进程身份仍需通过校验;贡献者镜像流水线也保留自身的配方边界。

3.8 - Barn 1.1.0 本机完整验收

在 Apple Silicon 宿主上原地升级、重建 Linux 与 macOS 实验环境,并录制可回放的逐项验收。

本次验收从本机已安装的 Barn 1.0.0 出发,安装公开的 1.1.0 Homebrew 配方,验证升级与日常使用,再重建测试环境。剧本先于执行编写;本轮已结束,主要功能通过,发现一项恢复问题,另有剪贴板与宿主提权检查未完成。 已获授权删除本机现有 Barn 虚拟机。

环境与证据

  • 宿主:macOS 27.0.1、Apple Silicon、18 个逻辑 CPU、128 GiB 内存;QEMU 11.1.3。
  • 初始环境:8 台运行中的 Linux VM 与 1 台运行中的 macOS VM mac1;正常安装路径为 /opt/homebrew/bin/barn。
  • 升级对象:公开版本 v1.1.0,提交 b2cc8da8983e710255d504bf26bf5d7b3f182790。
  • 录像、原始输出、断言结果与执行脚本保存在仓库外的独立验收目录。每阶段产生一个 asciicast v2 文件,保留原始时间轴,并生成限制等待时长的观看版本。
  • Linux 验收使用真实用户的 ~/.barn。原生 Mac 深度验收复用源码中的 tests/mac-live-acceptance.py,使用专用测试数据目录及已有基础镜像的 APFS 克隆;最后验证正常用户路径。
  • 终端录像不采集键盘输入、不输出密码或 SSH 私钥。桌面通过原生应用界面验收,截图在本次验收聊天中;剪贴板结果见下文。

执行顺序

阶段 操作 通过条件
U01 升级基线 记录旧版本、节点身份、公开 SSH 指纹与数据哨兵,停止 Linux 与 Mac VM 基线可复查;所有目标正常停止
U02 本机安装 brew upgrade pgsty/infra/barn,检查版本、helper、签名、公证与 brew test 正常 PATH 解析到公开 1.1.0;CLI、helper 与 App 配套
U03 升级恢复 启动旧 VM,核对身份、数据与 SSH;随后清理旧 VM 升级保留身份与数据;显式清理成功
L01 首次运行 空工作目录执行 barn up,检查生成清单、确认提示、启动进度与 SSH 默认 Ubuntu 24.04 原生架构客机就绪
L02 清单与目录 四种模板;合法/非法 YAML;-I/-A 与别名;两个官方签名源;镜像查询与缓存 合法输入解析一致;错误分类和退出码正确;覆盖参数不改写清单
L03 双节点与存储 Ubuntu/Debian 双节点;持久 ext4、临时数据盘、XFS、带空格/中文的路径;只读/可写 9p 共享 挂载类型与权限符合配置;宿主与客机双向读写符合预期
L04 网络与访问 固定 IP、控制节点到对端 SSH、DNS/HTTPS、SSH 配置;exec 参数边界和远程退出码 地址、目标节点、标准输出/错误与退出码正确
L05 生命周期 重复 up、按节点停止/启动/重启、CPU/内存增减、reload、选点重建 幂等操作保留 PID;资源实际生效;未选节点与持久数据不变
L06 故障与删除 配置遗漏、缺失共享目录、客机进程中断后恢复、provision 成功/失败/超时、purge --ask 取消 无隐式删除;失败可定位;重试恢复;取消不改状态
L07 数据保留 recreate、选点 destroy、全量 destroy、重新创建、purge 根盘/临时盘重置;持久盘按命令语义保留或删除
L08 镜像矩阵 本机支持的 8 个 arm64 镜像系列;Debian amd64 的 TCG 启动 SSH、架构、系统版本与数据盘可用;el8 arm64 使用预期的 TCG
M01 多机与身份 原生 Mac 自动验收:双机、独立身份与磁盘、基础镜像不变 各项身份独立;克隆与生命周期操作不修改基础镜像
M02 Mac 网络与共享 独立子网、宿主连通、客机隔离、DNS/HTTPS、VirtioFS 与远程参数 网络与共享语义符合参考手册
M03 Mac 生命周期 停止/启动、资源配置、第三台运行限制、重建身份轮换、选点销毁 身份保留/轮换符合操作;另一台 VM 不受影响
M04 桌面与剪贴板 打开桌面、登录状态、双向文本剪贴板、关闭窗口后 SSH 桌面可用;双向文本一致;关闭窗口不停止 VM
F01 收尾 清理专用测试 VM,核对正常安装、状态、诊断与 SSH 配置,汇总录像 无遗留测试进程;每个结果有日志或画面依据

判定与重试

每条命令记录参数、退出码、耗时与原始输出。断言失败立即保留现场;修正剧本错误后另起重试记录,产品缺陷单独记录,不把失败片段从录像中删去。长等待只在观看副本中加速,原始记录保留。

已有宿主网络先通过只读检查与复用路径验证。需要宿主 sudo 的安装、卸载或 hosts 操作先检查实际授权与执行计划;不能完成的项目明确标记阻塞。Apple 系统镜像更新、Intel Mac 实机与 Linux KVM 属于其他环境的验收范围。

结果与回放

本轮于 2026-11-09 11:08(Asia/Shanghai)结束。正常 PATH 已指向公开的 Barn 1.1.0;旧有 8 台 Linux VM 和 1 台 Mac VM 的升级恢复检查通过后,按授权删除。验收创建的 VM、专用 Mac 数据目录和额外的 120 GiB 基础镜像均已清理,原有默认 macOS 基础镜像保留。

阶段结果

项目 结果与依据
Homebrew 安装与升级 通过;CLI、原生组件、签名、公证与 brew test 正常,原 VM 的身份和持久路径数据保留
CLI、清单与镜像目录 通过;首次运行、四种模板、架构别名、错误输入、两个官方签名源、本地目录构建/验证/导入/清理
Linux 双节点与生命周期 通过;固定 IP、控制节点 SSH、DNS/HTTPS、参数/退出码、ext4/XFS、只读/可写 9p、资源调整、重建和持久盘重挂载
故障与恢复 缺失共享目录、provision 失败/超时、取消 purge 和同步磁盘后的进程中断恢复通过;立即断电的就绪标记问题见下节
原生 Mac 自动验收 15 个阶段通过;双机身份/磁盘/网络隔离、基础镜像不变、资源配置、并发上限、重建与选点删除
正常 Mac 路径 通过;从已有 IPSW 完整安装 120 GiB 新基础镜像、只读/可写 VirtioFS、SSH Include、默认基础镜像保留及新增缓存清理
交互式终端 Linux 和 Mac 均通过;实际分配客机 TTY,交互 shell 的退出码 17 原样返回;三类 Linux 日志可解析为 JSON
桌面 已目视确认登录后的 Finder 桌面;关闭窗口后同一 VM 进程和 SSH 继续运行;双向剪贴板未完成
源码检查 发布提交上的 make check 和 make mac-native-test 均通过
最终状态 Linux 和 Mac VM 均为零;无遗留测试 VM 进程;barn doctor、barn mac doctor 与网络状态正常

删除控制节点后,Barn 会提升剩余节点的控制角色。本次按提示更新清单中的 admin_ip 后重新创建原节点,保留盘重新挂载,另一节点的 PID 和数据保持不变。旧清单要求恢复原控制角色时,up 明确拒绝隐式重建。

镜像矩阵

以下 9 组均通过镜像获取、启动、SSH、系统/架构核对、数据盘写入、停止/启动和清理。-I/-A 未修改清单文件。EL7/arm64 因目录无对应制品返回 usage / 2;本宿主上的 EL7/amd64 返回 capability / 3,没有创建部署。

镜像 客机架构 加速器 结果
u22@20261020.0.1 arm64 hvf 通过
u24@20261017.0.1 arm64 hvf 通过
u26@20261016.0.1 arm64 hvf 通过
d12@20261026.2643.1 arm64 hvf 通过
d13@20261103.2651.1 arm64 hvf 通过
el8@8.10.20240528.3 arm64 tcg,thread=multi 通过
el9@9.8.20260525.2 arm64 hvf 通过
el10@10.2.20260525.0 arm64 hvf 通过
d13@20261103.2651.1 amd64 tcg,thread=single 通过

强制终止后的就绪标记问题

在 Ubuntu 24.04 arm64/HVF 节点重建成功后立即强制终止 QEMU,随后 up 启动了客机,但 /var/lib/barn/ready.json 与 error.json 均不存在。SSH 和持久数据可用,cloud-init 已结束,up 等待 180 秒后以退出码 5 失败。这是本轮实际观察到的一项恢复缺口,记录在 03-linux-lifecycle-r3 与 03-power-loss-investigation。

本次通过以下操作恢复就绪状态,运行中的 VM PID、对端节点和持久数据均保留:

barn exec meta -- sudo -n /usr/local/libexec/barn-finalize
barn up meta -f barn.yml

再次试验时先在客机执行 sudo sync,再核对 QEMU 命令行和 QMP UUID 后强制终止;这次 up 自动恢复成功。立即断电的现象仅在上述条件下观察到一次,落盘时机与其他镜像的表现仍需进一步定位。代码依据为 1.1.0 的 就绪探测 和 初始化重试入口。

未完成的检查

  • 双向剪贴板:桌面自动化未能可靠注入宿主系统剪贴板,浏览器工具的剪贴板又是隔离的;本轮结束时尚未取得宿主端人工复制输入,保留为未验证项。
  • 宿主提权变更:sudo -n 要求密码,网络安装/卸载读取 root 所有的状态也需要提权。已验证现有网络复用、权限拒绝分类和只读 hosts 计划,未执行系统网络重装/卸载或 /etc/hosts 写入。
  • 本轮宿主为 Apple Silicon;Intel Mac、Linux/KVM 和 Apple 系统镜像更新仍属于其他环境的覆盖范围。

本地证据

证据目录为 ~/barn-acceptance/1.1.0-20261109-101029/。打开 player/index.html 可离线播放 23 段 asciicast;原始时间轴合计约 58.9 分钟,观看版约 12.1 分钟。观看版只调整时间戳,逐段核对输出字节和 SHA-256。终端录像不包含桌面画面,桌面截图在本次验收聊天中。

evidence/plan-before-execution.md 与 .zh.md 保存执行前剧本;各阶段目录保存执行脚本快照、命令、退出码和原始输出;findings.json 记录恢复问题与未完成项。Homebrew 提示、SSH 别名、计划中的 create/recreate 分类、控制角色提升、TCG 参数和错误分类等剧本修正均保留初次录像及后续重试。完整记录存放在本机,本站只保存这份验收说明。