在 Apple Silicon 上用 KVM 构建隔离的 WeKan 测试环境:Fedora Asahi Remix 完整指南
【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan
本文基于仓库 docs/Security/Sandboxes/KVM/AsahiFedora/README.md 及其配套的install.sh、start.sh、stop.sh脚本,讲解如何在 Fedora Asahi Remix(ARM64 / Apple Silicon)上创建一台专用的 KVM 虚拟机,用于隔离运行 WeKan 与 FerretDB 的完整测试栈。读完本文,你将掌握:KVM 可用性检查、一键创建与安装 ARM64 虚拟机、安全优雅的启停流程、客户机内的测试栈配置,以及从仓库源码层面理解这套隔离边界的原理与取舍。
为什么测试需要一个真正的虚拟机边界
WeKan 是使用 Meteor 构建的开源看板应用,其测试体系包含 Playwright 浏览器测试、数据库一致性(conformance)测试和 FerretDB 兼容性测试。完整的测试栈会引入 Docker、浏览器、数据库、源码目录与开发凭据,这些组件如果散落在宿主机上,会显著扩大攻击面。
仓库 docs/Security/Sandboxes/vscodium/README.md 描述的 VSCodium Flatpak 沙箱、Toolbox、Distrobox、开发容器等方案,都刻意与宿主共享了一部分资源。而本文的 KVM 虚拟机方案是更强的隔离边界——这台 VM:
- 不共享任何宿主目录;
- 不转发 SSH agent;
- 不挂载 Docker socket;
- 不启用剪贴板通道;
- 不直通 USB 设备;
- 不接入桥接网络(bridged network)。
即:即使客户机中的测试代码或恶意输入被攻破,也不会直接触及宿主机的文件、凭据或容器守护进程。
主机要求与 KVM 可用性检查
在动手安装任何东西之前,先确认宿主机满足条件:
- Fedora Asahi Remix 运行在 ARM64 Apple Silicon 设备上;
- 硬件虚拟化以
/dev/kvm形式暴露; - 建议至少 16 GiB 宿主内存与 120 GiB 空闲存储;
- 准备一份 Fedora ARM64(
aarch64)Server 或 Workstation 安装 ISO。
执行以下命令检查架构与 KVM 设备:
uname -m test -r /dev/kvm && echo "KVM is available"架构必须是aarch64。不要使用 x86-64 的 ISO:那样 QEMU 只能通过软件模拟 x86-64 CPU,而不是使用 KVM 加速,性能会大幅下降。这一检查在install.sh中也有硬性校验——脚本会直接拒绝在非 ARM64 宿主机或无/dev/kvm的环境下继续执行(见 install.sh 第 20–21 行的fail分支)。
创建并安装虚拟机:install.sh 逐段解析
从 Fedora 官方渠道下载一份当前的 ARM64 ISO,校验其公开校验和(checksum),然后把 ISO 的本地路径传给install.sh:
cd /home/user/repos/wekan/docs/Security/Sandboxes/KVM/AsahiFedora ./install.sh /path/to/Fedora-Server-dvd-aarch64.iso注意仓库中的实际脚本位于 docs/Security/Sandboxes/KVM/AsahiFedora/install.sh,README.md中的路径是示例性的克隆位置,请以你实际 clone 仓库的路径为准。
脚本在宿主机上做了什么
- 安装虚拟化软件包:
sudo dnf install -y @virtualization edk2-aarch64 libvirt-client libvirt-daemon-kvm virt-install virt-manager。其中edk2-aarch64提供 ARM64 UEFI 固件,virt-install是创建虚拟机的核心工具。 - 启用 libvirt:优先启用
libvirtd.service;若该服务不存在,则回退启用virtqemud.socket与virtnetworkd.socket(这是较新 Fedora 上的模块化 daemon 布局)。 - 防覆盖保护:如果同名 VM、磁盘镜像或暂存的 ISO 已存在,脚本直接报错退出,绝不覆盖已有资源。
- 创建默认 NAT 网络:若 libvirt 的
default网络不存在,脚本会生成一份 XML 并net-define,网络为 NAT 转发模式,桥接virbr0,DHCP 范围192.168.122.2–192.168.122.254,然后设置自启动并启动它。 - 暂存 ISO:系统级 libvirt 的 QEMU 进程通常无法穿越用户家目录,且 SELinux 期望虚拟机镜像位于 libvirt 镜像目录之下。因此脚本用
sudo install -o qemu -g qemu -m 0644把 ISO 复制到/var/lib/libvirt/images/,并执行restorecon修正 SELinux 标签——这样既满足边界要求,又不必削弱 SELinux 策略。 - 调用 virt-install 定义虚拟机。
默认资源配置
install.sh中由环境变量定义的默认值如下:
| 资源 | 默认值 |
|---|---|
| vCPU | 6 个 KVM 加速的 ARM64 vCPU,host-passthroughCPU 模型 |
| 内存 | 12 GiB(VM_MEMORY_MIB=12288) |
| 磁盘 | 100 GiB 稀疏 qcow2,位于/var/lib/libvirt/images/wekan-asahi-test.qcow2 |
| 固件 | ARM64 UEFI(--boot uefi) |
| 网络 | libvirt 仅 NAT 的default网络,virtio 网卡 |
| 显示 | 仅本地的 SPICE 控制台(--graphics spice,listen=none),virtio 显卡 |
| 主机集成 | 无共享目录、无 agent、无 Docker socket、无 USB、无剪贴板通道 |
按宿主机规格调整资源
宿主机偏小或偏大时,可以在安装前通过环境变量覆盖尺寸:
VM_CPUS=4 VM_MEMORY_MIB=8192 VM_DISK_GIB=80 \ ./install.sh /path/to/Fedora-Server-dvd-aarch64.iso脚本会对这三个变量做正整数校验(正则^[1-9][0-9]*$),传非法值会直接报错。此外VM_NAME(默认wekan-asahi-test)与LIBVIRT_URI(默认qemu:///system)也可通过环境变量覆盖。
virt-install 的关键参数与安装收尾
脚本最终执行的virt-install命令值得逐项理解:
sudo virt-install \ --connect qemu:///system \ --name wekan-asahi-test \ --virt-type kvm \ --arch aarch64 \ --machine virt \ --cpu host-passthrough \ --vcpus 6 \ --memory 12288 \ --boot uefi \ --disk "path=/var/lib/libvirt/images/wekan-asahi-test.qcow2,size=100,format=qcow2,bus=virtio,cache=none,discard=unmap" \ --network network=default,model=virtio \ --graphics spice,listen=none \ --video virtio \ --rng /dev/urandom \ --cdrom /var/lib/libvirt/images/wekan-asahi-test-install.iso \ --noautoconsole \ --wait=-1 \ --noreboot要点:
--cpu host-passthrough:将宿主机 CPU 特性直接暴露给客户机,是 ARM64 上性能最优的选择;--disk ... discard=unmap:启用稀疏磁盘的 TRIM 透传,配合稀疏 qcow2 节省宿主磁盘空间;--rng /dev/urandom:为客户机提供硬件随机数源;--noreboot:安装完成后客户机关机而非重启,让脚本有机会清理安装介质。
Fedora 图形化安装器会在virt-manager中打开。安装期间请创建一个普通的非 root 用户;如果不需要无人值守的 VM 重启,建议开启磁盘加密。VM 安装结束会关机。如果 Fedora 安装器没有自动移除虚拟安装介质,脚本会在安装完成后通过virsh domblklist找到 CDROM 设备、用detach-disk --config分离它,并删除暂存的 ISO 副本(见 install.sh 第 105–111 行),确保之后启动只从客户机自己的磁盘引导。
注意:安装器拒绝覆盖已存在的 VM 或磁盘。在创建新 VM 前,必须有意识地删除或重命名旧 VM。
启动与停止:start.sh / stop.sh
启动已安装的 VM 并打开本地控制台:
./start.shstart.sh 的逻辑很简洁:先确认 VM 存在(dominfo),再检查domstate,只有非running状态才执行virsh start;随后若有virt-manager,则后台打开该域的--show-domain-console。
请求客户机操作系统优雅关机:
./stop.shstop.sh 的设计体现了对数据安全的重视:
- 默认最多等待120 秒(
STOP_TIMEOUT_SECONDS可调); - 绝不调用
virsh destroy——那等同于直接拔电源,可能损坏客户机内的数据库或文件系统; - 超时后仅输出错误并提示用
virt-manager检查客户机,由人工决定是否有理由强制断电,脚本自身拒绝代为强制关机。
三个脚本都接受VM_NAME环境变量以管理不同名称的 VM:
VM_NAME=wekan-test-2 ./start.sh配置客户机:把整个测试栈关在 VM 内
虚拟机安装完成后,把所有测试依赖都保留在客户机内:
- 更新 Fedora,安装 Git、编译器、无 root 的 Docker 或 Podman,以及浏览器运行时依赖;
- 将 WeKan clone 到客户机自己的虚拟磁盘上;
- 安装仓库本地化的 Node.js、Meteor 与 Go 工具链(其细节在 VSCodium 沙箱文档 中有完整说明,包括从
.tools/目录引导与 Dockerfile 版本匹配的 Node/Meteor 工具链、构建 FerretDB 及 WeKan bundle 的方法); - 在客户机内运行 WeKan、数据库一致性测试与 FerretDB 测试;
- 在依赖升级或恶意输入安全测试之前,创建一个干净的 libvirt 快照,以便随时回滚到已知良好状态。
关于凭据隔离,文档有明确纪律:
- 不要转发宿主的
SSH_AUTH_SOCK、GPG agent、Docker socket、家目录或源码检出; - 若客户机需要访问 GitHub,请在客户机内使用单独的、受限的凭据;
- 优先在客户机内提交、再从受信任的宿主检出处人工推送。
隔离注意事项:边界如何生效
- NAT 网络让客户机能下载依赖,同时不会把客户机服务直接暴露在宿主网络上。除非确实需要入站 LAN 访问,否则不要改成桥接接口。
- SPICE 显示通过 libvirt 可用,但没有挂载 SPICE agent 通道,因此剪贴板与文件共享均未配置——这正是隔离的一部分,而非缺失功能。
- libvirt 在服务账号下运行 QEMU,Fedora 的 SELinux 会对 VM 资源施加sVirt标签,形成额外的强制访问控制层。
- 客户机内的 rootless 容器可以降低容器守护进程的权限,但KVM 边界仍是主要的隔离层,rootless 只是纵深防御。
- 内存红线:分配给 VM 的内存若显著超过宿主内存的 60%–70%,浏览器测试与 Go 编译峰值期间宿主和客户机都会变得不可靠。
与仓库其他沙箱方案的关系
在仓库的 docs/Security/Sandboxes 目录下,KVM 方案还有面向 Ubuntu Asahi 的姊妹文档 AsahiUbuntu/README.md,其安装脚本与资源默认值几乎一致(区别在于 Ubuntu 使用qemu-efi-aarch64提供 UEFI、libvirt 应用 AppArmor 而非 SELinux)。而 vscodium/README.md 描述的 Flatpak 沙箱方案隔离强度弱于 KVM(它需要显式允许~/.meteor、Playwright 浏览器缓存等),其价值在于轻量与快速,适合日常编辑与快速迭代。
仓库的测试体系为这套 VM 边界提供了明确的使用场景佐证:
- 数据库一致性测试脚本 releases/db-conformance.sh 会为每个后端逐一启动数据库容器、运行全新构建的 FerretDB、跑完整查询目录并比较各后端回答——这类测试涉及多个容器与数据库,正适合在 KVM 客户机内整体隔离运行;
- tests/dbConformance 目录中的
cases.cjs、compare.cjs、run.cjs实现了查询目录与结果比对逻辑; - Playwright UI 测试(
tests/playwright)依赖mongosh播种数据、需要WRITABLE_PATH可写目录,这些浏览器与数据库依赖同样应封闭在 VM 内。
结语
在 Fedora Asahi Remix 上通过 KVM 运行专用 ARM64 虚拟机,为 WeKan / FerretDB 测试栈提供了一个"零共享"的强隔离边界:不共享宿主目录、SSH agent、Docker socket、剪贴板、USB 或桥接网络。配套的install.sh、start.sh、stop.sh三个脚本把检查、创建、启停、清理全部自动化,并内置了防覆盖、非破坏性关机、SELinux 标签修复等细节。这套方案与仓库现有的 VSCodium Flatpak 沙箱互为补充:日常开发用轻量沙箱,涉及 Docker、浏览器、数据库与恶意输入的安全测试则交给 KVM 客户机——这正是"用更薄的宿主暴露面,换取更强的隔离保证"。
【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考