从整个磁盘 ZFS 池启动 FreeBSD?

从整个磁盘 ZFS 池启动 FreeBSD?

我有一个 FreeBSD 文件服务器,配置了一个由整个磁盘设备创建的 ZFS 池。也就是说,池的创建方式如下:

zpool create pool0 raidz ada0 ada1 ada2

这意味着磁盘具有 ZFS 磁盘标签,而不是 FreeBSD 磁盘标签。这是使用带有 ZFS 的磁盘的推荐方式:

ZFS 可以使用单独的切片或分区,但建议的操作模式是使用整个磁盘。[来自zpool(1M)]

像这样格式化磁盘可以最大限度地提高文件系统在各种 ZFS 实现之间的可移植性。不幸的是,这意味着没有地方放置freebsd-boot包含 FreeBSD 加载程序的分区……或者至少,我思考这就是它的意思,但我正在寻求确认。

系统当前从包含嵌入式加载程序(以及目录/boot,尽管这可以很好地存在于 ZFS 中)的 CF 卡启动。这工作得很好,但我很好奇——有没有办法将嵌入式加载程序安装到 ZFS 标签磁盘上?

编辑:我一直在尝试自己回答这个问题。我想也许我可以非破坏性地将 GPT 标签应用于 ZFS 磁盘,然后尝试嵌入启动代码——但是虽然 GPT 标签不会对 ZFS 造成问题,但 ZFS 似乎以某种方式破坏了标签。所以这里有一个不同的问题:OpenSolaris 支持 GPT 磁盘标签吗?这里的最终目标是拥有一个可以在 FreeBSD 和 OpenSolaris 下工作的磁盘池,同时能够从中引导到 FreeBSD。

答案1

嗯,答案似乎是“你不能这样做”。

这个答案的其余部分适用于任何碰巧看到这个条目并且好奇如何设置的人:

我的启动代码放在 CF 卡上,其他所有内容(即目录 /boot)都放在 ZFS 上。CF 卡的分区如下:

# gpart show ad0
=>     34  7847213  ad0  GPT  (3.7G)
       34      128    1  freebsd-boot  (64K)
      162  7847085       - free -  (3.7G)

我安装了这样的启动代码:

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ad0

bootfs并在我的 ZFS 池上设置适当的属性:

zpool set bootfs=pool0/sys/freebsd pool0

我的 FreeBSD 根文件系统在哪里pool0/sys/freebsd(其中包含目录等/boot)。

答案2

看起来可以从由整个磁盘设备创建的 ZFS 池启动。

只需根据 zfsboot 手册页安装 zfsboot 即可:

zfsboot 通常使用 dd(1) 安装。要在 ada0 驱动器上安装 zfsboot:

 dd if=/boot/zfsboot of=/dev/ada0 count=1
 dd if=/boot/zfsboot of=/dev/ada0 iseek=1 oseek=1024

ZFS 规范的 1.4 节:启动块中指出,此位置有 3.5MB 的保留空间。这解释了为什么 64k 的 zfsboot 可以放在那里,而不会影响文件系统。

我还没有亲自尝试过。

资料来源:

相关内容