使用 ZFS、iSCSI 和 PXE 构建无盘 Linux 启动系统

对于许多开发者来说,在稳定的游戏或主操作系统与灵活的开发环境之间的矛盾是一场持续的斗争。无论是避免在 Windows 安装中出现各种工具链的“污染”,还是防止 Windows 更新覆盖 GRUB 条目,大家都渴望一个既隔离又高性能的环境。

虽然 USB 盘是常用的 Live Linux 环境介质,但它们容易丢失或被擦除。更稳健、专业的解决方案是无盘启动。通过利用 PXE(预引导执行环境)、iSCSI 和 ZFS,可以从远程 NAS 引导完整的 Linux 系统,将网络附加块设备视作本地硬盘。

架构

此方案基于客户端-服务器模型,服务器提供启动基础设施和存储,客户端(游戏 PC 或工作站)提供计算能力。

服务器堆栈

  • Netboot.xyz:一个多功能工具,提供基于菜单的界面,可通过网络引导各种操作系统和安装程序。
  • TFTP(Trivial File Transfer Protocol):用于向客户端传送初始引导加载程序二进制文件。
  • DNSMasq:充当 DHCP 服务器,根据客户端的架构(BIOS 或 UEFI)将其指向 TFTP 服务器。
  • ZFS ZVol:在 ZFS 池中创建的块设备,提供虚拟磁盘的原始存储。
  • iSCSI Target(targetcli):将 ZFS ZVol 以块设备形式通过网络导出,使客户端能够将其挂载为本地 SCSI 磁盘。

实施指南

1. 设置启动基础设施

第一步是在基于 Debian 的服务器(例如 Proxmox)上安装 netboot.xyz。这需要安装 Web 服务器(Apache)、TFTP 和 Ansible,以自动化部署 netboot 资源。

要支持自定义启动目标,需要创建一个 .ipxe 脚本。该脚本指示客户端尝试使用 iSCSI 服务器的 IP 和特定 Target IQN 进行 sanboot(SCSI 网络启动)。如果启动失败(在首次安装时会出现),脚本会回退到 Debian 安装程序。

2. 网络配置

你的 DHCP 服务器(例如运行 DNSMasq 的路由器)必须配置为处理不同类型的客户端。典型的配置包括:

  • BIOS 客户端:指向 netboot.xyz-undionly.kpxe
  • UEFI 客户端:指向 netboot.xyz-snp.efi
  • iPXE 客户端:初始引导加载程序运行后,后续请求会被重定向到托管在 Web 服务器上的 menu.ipxe

3. 存储与 iSCSI 配置

使用 ZFS,您可以创建一个 ZVol 作为磁盘映像:

zpool create tank /dev/disk/by-id/${DISK_ID}
zfs create -V 32G tank/debian-disk-12700k

随后通过 targetcli 导出该 ZVol。关键步骤包括创建后端存储、定义 iSCSI target,以及使用相互认证(发起端和目标端的用户名/密码)的访问控制列表(ACL)来确保网络磁盘不被未授权客户端访问。

4. 安装操作系统

在 iSCSI target 上安装 Debian 需要在安装过程中进行一些手动干预:

  1. 发起端配置:由于安装程序可能不会自动检测 iSCSI target,需要切换到 TTY(Super+F2),编辑 /etc/iscsi/initiatorname.iscsi 使其匹配服务器上配置的 IQN。
  2. 重启 iscsid:必须重启 iscsid 守护进程,以识别新的发起端名称。
  3. Target 登录:返回安装程序后,提供门户地址和认证凭据,将远程 ZVol 映射为本地磁盘。

安装完成并将 GRUB 安装到 iSCSI 磁盘后,系统即可重启。iPXE 脚本中的 sanboot 命令现在能够找到可启动的操作系统并启动它。

技术考虑与权衡

性能与延迟

正如实现中所述,网络启动本质上比本地 NVMe 存储慢。虽然 RAM 磁盘可以在一定程度上缓解操作系统的延迟,但底层网络速度仍是主要瓶颈。

社区经验表明,对于生产级无盘部署,10Gbps 以太网几乎是必需的。此外,iSCSI 对网络拥塞较为敏感。为优化性能,建议:

  • 为 iSCSI 流量使用专用 VLAN。
  • 在交换机上实施服务质量(QoS)设置,以优先处理存储流量。
  • 探索 NVMe over TCP,作为 iSCSI 的现代高性能替代方案。

稳定性与维护

此方案的主要优势之一是操作系统的集中管理。由于引导加载程序(GRUB)位于远程磁盘,本地 Windows 更新不会破坏 Linux 的启动顺序。

然而,一些用户建议使用 rEFInd 替代 GRUB,它通过单一文本配置文件简化 EFI 管理,降低在内核更新时维护 UEFI 条目的复杂性。

与其他方法的比较

虽然 iSCSI 提供块级接口,但其他开发者更倾向于使用 NFS(网络文件系统) 进行无盘启动。NFS 通常更易于设置,但工作在文件层级。当客体操作系统需要完整控制磁盘分区和文件系统(例如安装服务器本身不支持的文件系统)时,iSCSI 更受青睐。

“我多年来一直在 OrangePI 板上使用 iSCSI 卷,而这些板子只能使用 SD 卡。相较于 SD 卡,千兆以太网的性能要好得多。”

汇总表:本地 vs. 无盘启动

功能 本地 NVMe 无盘 (iSCSI/PXE)
启动速度 超快 受网络影响
隔离性 共享磁盘/分区 完全物理隔离
维护 手动分区 集中式镜像管理
风险 引导加载程序被覆盖 网络中断 = 系统宕机
灵活性 磁盘大小固定 动态 ZVol 调整大小

Sources