首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

让 FreeBSD 和 Gentoo Linux 在 ZFS 存储卷上共存

让 FreeBSD 和 Gentoo Linux 在 ZFS 存储卷上共存

自我回归到 Librem 15 已经有段时间了。我一般会选择 FreeBSD 来处理所有的事情,但有时会要访问一个运行在 Librem 平台上的 Linux OS,以便用它来帮助我对一些遗留的设备驱动进行移植 (比如 BYD 鼠标以及控制屏幕亮度的驱动程序)。
为了将此进行实现,我安装了一个自己花时间开发的一个设置:那是一个在 ZFS 存储卷上共存的 FreeBSD 和 Gentoo Linux 双引导系统。本文描述了如何实现这项配置。
注意本文是基于 EFI 引导加载程序的。如果你坚持要使用传统的 BIOS 引导程序,那么就需要对整个过程进行一下调整。
方案概述
该方案的基础是利用 ZFS 文件系统的通用功能 (即利用面向使用了基于 fstab 方法的 OS 数据集的挂载点功能) 结合 GRUB,实现一个双引导 OS。
ZFS 概述
ZFS 系统同 FreeBSD 和 Linux 上“典型的”ZFS设置有些微不同。某些数据集 (比如home目录) 是由两个操作系统共享的, 但是位于各自挂载点中的 OS 数据集则要依赖于我们所使用的OS,而因此 ZFS 特定的挂载点功能是不能有效使用的。
在本文中,假定存储卷的名字是 “data”。
整个方案看起来如下:
    data/home 被挂载到 /home, 与其所有的子数据集一起使用 ZFS 挂载点系统;
    data/freebsd 及其子数据集包含了 FreeBSD 系统,而其所有的挂载点都被设置成 legacy;
    data/gentoo 及其子数据集包含了 Gentoo 系统,其所有的挂载点也都被设置成 legacy。
OS 和 GRUB 概述
两个 OS 都必须利用 /etc/fstab 方法来挂载他们大多数的文件系统, 因此我们不能使用 ZFS 挂载点功能。这样每个 OS 就都需要一个不同的 fstab。注意 data/home 数据集 (以及其它类似的数据集) 都会使用 ZFS 挂载点方法来进行挂载,而不是 fstab。
此外,两个OS都要通过一个特殊的顶层目录 (Gentoo 上是 /freebsd, FreeBSD 上是 /gentoo) 来访问另外一个系统的数据。
GRUB 引导加载程序可以被用来提供一个引导选择设施,而无需进行大的修改和配置 (不过要知道输入到 grub.cfg 文件中去的类型的魔数!)
设置过程
设置过程包括如下几个步骤:
    使用 FreeBSD 安装器创建 GPT 和 ZFS 池;
    使用 FreeBSD 启动加载程序安装并配置 FreeBSD;
    启动并进入 FreeBSD, 创建 Gentoo Linux 数据集,安装 GRUB;
    启动并进入 Gentoo Linux 安装器,安装 Gentoo;
    启动并进入 Gentoo, 完成配置任务。
当然,你也可以将步骤倒着进行,先安装 Gentoo,然后再使用它的工具。只是上列顺序能使 FreeBSD 上 GPT 的创建和 GRUB 的安装顺利许多。
准备工作
要执行这个安装过程,你需要为两个OS安装 memstick 镜像。FreeBSD 的安装程序可从这里得到; Gentoo 的可以从这里得到 (使用 livedvd ISO 格式)。(当然,)你还需要有途径能进行互联网访问。
注意对于 Librem 15 或者类似的没有以太网连接的笔记本电脑, 你可能需要在主要的安装过程中对 Gentoo 无线工具以及 wpa_supplicant 的安装过程采取一些轻微的修改。
FreeBSD 安装程序
引导进入 FreeBSD 安装程序,通过引导程序菜单选择手动分区模式。这样做会让你进入一个 shell 操作环境,教你创建你的分区并将所有的东西挂载到 /mnt。
创建分区和 ZFS 池
第一件要做的事情就是使用 gpart 工具来创建你的分区。FreeBSD 的 man 页面就相当好,因此你可以使用 “man gpart” 来获取关于这个工具的指南。我在 Librem 15 上执行这个过程看起来是下面这个样子:
gpart create -s gpt ada0
gpart create -s gpt ada1
gpart add -t efi -l efi-system -s 200M ada0
gpart add -t freebsd-zfs -l zfs-data ada0
gpart add -t linux-swap -l swap -s 96G ada0
gpart add -t freebsd-zfs -l zfs-data-log -s 16G ada0
gpart add -t freebsd-zfs -l zfs-data-cache ada0
然后用新的分区来创建一个 ZFS 池,并使用 DOS 文件系统来对 EFI 系统分区进行格式化 (见鬼了,为什么我们还要用这玩意儿?):
newfs_msdos /dev/ada0p1
zpool create -m legacy -o atime=off -o checksum=sha256 data /dev/ada0p2 log /dev/ada0p2 cache /dev/ada0
注意我们已经将 atime (它可以大大降低磁盘的写入量)关掉了,并且将校验算法设置成了 sha256。
ada1 磁盘是一块我装进去的 SSD(固态硬盘)。如果你没有 SSD,那么做日志或者缓存方面的设置就没啥意义。16GB 的意向日志是有点多余,但是它可以减轻设备的压力。注意我们将根数据集的挂载点设置成了 “legacy”。
注意 Linux 有其自己的交换格式,因此我们不能将交换设备进行共享。
创建 ZFS 数据集

有了一个 ZFS 存储池后,接下来要做的就是创建数据集。我们先创建 FreeBSD 根目录(root)并对其进行挂载 (注意,它会从父目录继承 “legacy”挂载点):
zfs create -o compression=lz4 data/freebsd
mount -t zfs data/freebsd /mnt/
我们需要创建一些挂载点目录:
mkdir /mnt/home
mkdir /mnt/gentoo/
mkdir /mnt/tmp
mkdir /mnt/usr
mkdir /mnt/var
我使用一个相当精细的 ZFS 方案, 它对不同的目录设置不同的可执行性、权限和压缩比等属性。这样可以达到很显著的压缩比,有效的增加了磁盘的可用空间:
zfs create -o exec=on -o setuid=off -o compression=off data/freebsd/tmp
zfs create -o exec=on -o setuid=on -o compression=lz4 data/freebsd/usr
zfs create -o exec=off -o setuid=off -o compression=gzip data/freebsd/usr/include
zfs create -o exec=on -o setuid=off -o compression=lz4 data/freebsd/usr/lib
zfs create -o exec=on -o setuid=off -o compression=lz4 data/freebsd/usr/lib32
zfs create -o exec=on -o setuid=off -o compression=gzip data/freebsd/usr/libdata
zfs create -o exec=on -o setuid=on -o compression=lz4 data/freebsd/usr/local
zfs create -o exec=on -o setuid=off -o compression=gzip data/freebsd/usr/local/etc
zfs create -o exec=off -o setuid=off -o compression=gzip data/freebsd/usr/local/include
zfs create -o exec=on -o setuid=off -o compression=lz4 data/freebsd/usr/local/lib
zfs create -o exec=on -o setuid=off -o compression=lz4 data/freebsd/usr/local/lib32
zfs create -o exec=on -o setuid=off -o compression=gzip data=freebsd/usr/local/libdata
zfs create -o exec=on -o setuid=off -o compression=gzip data/freebsd/usr/local/share
zfs create -o exec=off -o setuid=off -o compression=off data/freebsd/usr/local/share/info
zfs create -o exec=off -o setuid=off -o compression=off data/freebsd/usr/local/share/man
zfs create -o exec=on setuid=on -o compression=lz4 data/freebsd/obj
zfs create -o exec=on -o setuid=on -o compression=lz4 data/freebsd/usr/ports
zfs create -o exec=off -o setuid=off -o compression=lz4 data/freebsd/usr/ports
zfs create -o exec=on -o setuid=off -o compression=gzip data/freebsd/usr/share
zfs create -o exec=off -o setuid=off -o compression=off data/freebsd/usr/share/info
zfs create -o exec=off -o setuid=off -o compression=off data/freebsd/usr/share/man
zfs create -o exec=off -o setuid=off -o compression=gzip data/freebsd/usr/src
zfs create -o exec=off -o setuid=off -o compression=lz4 data/freebsd/var
zfs create -o exec=off -o setuid=off -o compression=off data/freebsd/var/db
zfs create -o exec=off -o setuid=off -o compression=lz4 data/freebsd/var/db/pkg
zfs create -o exec=off -o setuid=off -o compression=gzip data/freebsd/var/log
zfs create -o exec=off -o setuid=off -o compression=off data/freebsd/var/empty
zfs create -o exec=off -o setuid=off -o compression=gzip data/freebsd/var/mail
zfs create -o exec=on -o setuid=off -o compression=off data/freebsd/var/tmp
因为 FreeBSD 对于某些文件的所在位置有着非常严格要求,所以这个方案效果很好。
继承事业,薪火相传
返回列表