设计
4 分钟阅读
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 不是虚拟机身份)。