文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

前阵子我的Librem 15电脑拿到手了。 我通常会把系统都安装成FreeBSD,但是我为了要把一些设备都通过端口驱动起来(比如比亚迪鼠标或者屏幕亮度调节设备),就需要一个Linux系统运行在我的电脑上。

为了达到目的,我开发了一个安装程序:实现了在ZFS 卷,双重启动FreeBSD和Gentoo Linux系统。本文详细介绍如何设置它。

请注意,这篇文章是基于EFI引导程序。 如果你坚持使用传统的BIOS引导,需要适应一下流程。

第 1 段(可获 1.35 积分)

步骤简介

该方法是基于一个十分典型的ZFS文件系统的使用(即上述安装功能的OS数据要安装在一个以fstab为基础的系统上)结合GRUB实现双启动操作系统

ZFS 概述

这个ZFS系统在在FreeBSD和Linux的“一般安装上”略有不同。 一些数据集(即主目录)在两个操作系统之间共享,但OS数据集的依赖并不相同(这取决于我们使用的操作系统)因而ZFS的特殊功能不能有效地用于挂载点。

第 2 段(可获 1.19 积分)

在这篇文章中,假设卷的名称是“data”。

大体步骤如下:

  • data/home 被安装到 /home,并且带着其所有子集应用到ZFS系统中
  • data/freebsd 和他的子数据集被安装在 FreeBSD 系统中, 并且他们所有的挂载点都被设置到 legacy中
  • data/gentoo 和他的子数据集被安装在 Gentoo 系统中, 并且他们所有的挂载点也被设置到 legacy中

OS 和GRUB概述

自从我们不能自己制作ZFS挂在功能以后,这两个系统必须通过 /etc/fstab 方式来安装他们的文件系统。 这需要不同的针对不同fstab使用不同系统。 请注意:data/home 数据集 (同样适用其他类似数据集) 将会使用ZFS安装方式,而不是使用fstab方式。

第 3 段(可获 1.64 积分)

另外,这两个操作系统有权通过一个顶级目录访问彼此的数据(Gentoo系统是/freebsd , FreeBSD系统是/gentoo)。

GRUB启动器被用来作为提供可行、可靠、不需要复杂配置的好工具!(除了grub.cfg中有一些神奇的字段)。

安装过程

安装过程包含如下几步:

  1. 使用 FreeBSD 安装程序创建GPT和ZFS库
  2. 实用本地FreeBSD boot 启动器,安装并且配置 FreeBSD。
  3. 使用Boot 进入FreeBSD,创建Gentoo Linux数据集,安装GRUB
  4. 使用Boot 进入Gentoo Linux 安装界面, 安装Gentoo
  5. 使用Boot 进入Gentoo,完成配置
第 4 段(可获 1.36 积分)

注意,不可以撤销这个安装过程,先安装Gentoo,就可以使用它的工具了。 我只是发现在FreeBSD上使用GPT创建和GRUB安装更流畅。

准备:

执行安装程序,你需要两个系统安装镜像。 FreeBSD的安装程序可以从这里得到;Gentoo的可以从这里得到(使用livedvd ISO安装)。 当然,你的电脑需要联网才行。

值得注意的是,在librem 15或类似的笔记本电脑没有以太网接口的情况下,您可能需要在安装过程中,稍加修改程序之后,安装Gentoo无线工具和wpa_supplicant。

第 5 段(可获 1.45 积分)

FreeBSD 安装

启动FreeBSD安装程序,进入boot菜单,并选择手动分区模式。 这是将出现一个shell,让你创建分区并把它挂在在/mnt 目录中。

创建分区和 ZFS 库

这里要做的第一件事是用gpart工具创建分区。 FreeBSD的man pages是比较好的,所以你可以用“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
第 6 段(可获 1.05 积分)

然后创建一个新分区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/ada0p3

注意,我们已经关闭了atime (为了降低相当大的磁盘写入量)并设置了sha256校验算法。

ADA1盘符是SSD,我已安装好了。 如果你没有SSD,日志或缓存就没意义了。 16GB的专项日志实在太大了!但它缓解了设备压力。 注意我们设置的根节点挂载在“egacy“。

第 7 段(可获 1.28 积分)

请注意,Linux有自己的swap交换文件格式, so we can’t share the swap device.

创建ZFS Dataset

Now that you have a ZFS pool, the first thing you’ll need to do is create the datasets.   Start by creating the FreeBSD root and mounting it (note that it will inherit the “legacy” mountpoint from its parent):

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方案, 即使用不同的可执行文件, setuid, 和压缩属性来对应各个具体的目录。  这样做获得了显著的压缩比, 等效地增加了我的磁盘大小。

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

 

第 8 段(可获 1.21 积分)

因为FreeBSD中某些文件目录区分相当严谨,这设计不错。 你当然可以继续细分直至你希望看到的样子,创造更多的子目录在/ usr /share 等。

对于系统文档你可能会想要一个简单的方案,文件的存放位置更科学就如Linux一样:

zfs create -o exec=on -o setuid=off -o compression=off data/gentoo/tmp
zfs create -o exec=on -o setuid=on -o compression=lz4 data/gentoo/usr
zfs create -o exec=off -o setuid=off -o compression=lz4 data/gentoo/var

A Gentoo master might be able to subdivide this up as I’ve done with FreeBSD.

Gentoo的最高权限可能会允许系统继续细分文件目录,在FreeBSD中我已经做了。最后一项任务是安装这些文件手动使用下列命令模板:

mount -t zfs data/freebsd/<path> /mnt/<path>

这是必要的,因为所有的挂载点将是“legacy”。 我不会显示所有的命令,因为这太浪费篇幅了。

第 9 段(可获 1.38 积分)

安装和配置FreeBSD系统

现在键入“exit”,这将把你踢回FreeBSD安装程序, 而此时一切都已挂载在/ mnt /。  安装过程的其余部分就按正常情况进行。  但是,您需要进入shell<you’ll need to opt to go to a shell>来完成两个最终配置任务.。

进入shell,然后进入新的FreeBSD系统

chroot /mnt

创建fstab文件

因为我们把ZFS数据集的绝大多数挂载到各OS的不同路径, 我们需要针对(这些数据集)创建一个/etc/fstab文件。  下面的fstab文件将把全部数据集挂载到正确的位置:

data/freebsd/tmp /tmp zfs rw 0 0
data/freebsd/usr /usr zfs rw 0 0
data/freebsd/usr/include /usr/include zfs rw 0 0
...
data/gentoo/ /gentoo zfs rw 0 0
data/gentoo/tmp /gentoo/tmp zfs rw 0 0
...
proc /proc procfs rw 0 0

(注意我只是代表性地列出了几条,并不完整)Note that I’ve left out all a number of the entries.   您必须将每个数据集映射到正确的路径,如上所示。

第 10 段(可获 1.58 积分)

安装FreeBSD本地启动器

第一次进入系统,我们需要FreeBSD引导。 安装以下程序:

mount -t msdosfs /dev/ada0p1 /mnt
mkdir /mnt/efi
mkdir /mnt/efi/BOOT
cp /boot/boot1.efi /mnt/efi/BOOT/BOOTX64.EFI

你需要做的最后一件事是把bootfs参数放在zpool中,然后FreeBSD 启动器会挑选合适的数据集:

zpool set -o bootfs=data/freebsd data

您可能还需要为一些软件给EFI系统设置自己的系统标识:

gpart set -a bootme -i 1 ada0

现在,您的系统将进入操作系统。

第 11 段(可获 1.01 积分)

FreeBSD 主系统

你现在应该能直接进到FreeBSD。  你需要连接到网络,这可能涉及wpa_supplicant的配置。

在做其他事情之前,我通常会拉取最新的资源,修复系统到最新版本。 这样保证我的系统是最新的。 有了足够多的帮助文档,这一步应该不用我描述怎么做吧。

你还需要获得端口的集合, 再来一次,这样做就有了足够的帮助指引。

第 12 段(可获 1.14 积分)

安装 GRUB

grub-efi 端口将会安装一个能够启动EFI系统的GRUB。这个端口在我看来比相同功能的Gentoo容易使用多了。 这个端口安装如下:

cd /usr/ports/sysutils/grub2-efi
make install clean

在这个目录,你需要创建一个grub.cfg文件。 grub-mkconfig 命令可以得到一个模板文件,但你必须要编辑它。 你也可以使用以下文件直接覆盖(确保文件在这个路径下/boot/grub/grub.cfg):

insmod part_gpt
insmod zfs

menuentry 'FreeBSD' --class freebsd --class bsd --class os {
  search.fs_label data ZFS_PART
  echo "Loading FreeBSD Kernel..."
  kfreebsd ($ZFS_PART)/freebsd/@/boot/kernel/kernel
  kfreebsd_loadenv ($ZFS_PART)/freebsd/@/boot/device.hints
  kfreebsd_module_elf ($ZFS_PART)/freebsd/@/boot/kernel/opensolaris.ko
  kfreebsd_module_elf ($ZFS_PART)/freebsd/@/boot/kernel/acl_nfs4.ko
  kfreebsd_module_elf ($ZFS_PART)/freebsd/@/boot/kernel/zfs.ko
  set kFreeBSD.vfs.root.mountfrom=zfs:data/freebsd
  set kFreeBSD.vfs.root.mountfrom.options=rw
}

menuentry 'Gentoo Linux' {
  search.fs_label data ZFS_PART
  linux ($ZFS_PART)/gentoo@/boot/kernel dozfs=force root=ZFS=data/gentoo
  initrd ($ZFS_PART)/gentoo@/boot/initramfs
}
第 13 段(可获 1.03 积分)

注意,我们已经建立了一个Gentoo的入口,虽然它还不存在。 最后一步,你需要安装EFI系统分区和安装GRUB:

mount -t msdosfs /dev/ada0p1 /mnt
grub-install --efi-directory=/mnt --disk-module=efi

这将对EFI系统分区安装GRUB引导程序/efi/grub/grub.efi。 你需要复制文件到指定地方。 然而,我建议你先做一个FreeBSD的本地备份!

cp /mnt/efi/BOOT/BOOTX64.EFI /mnt/efi/BOOT/BOOTX64.BAK

如果哪里做错了这将会简化系统还原。 现在,复制GRUB引导装载程序到这:

第 14 段(可获 1.05 积分)
cp /mnt/efi/grub/grub.efi /mnt/efi/BOOT/BOOTX64.EFI

你应该检查一次你的GRUB启动器确保它能重新启动系统,进入到FreeBSD。 不要尝试启动进入Gentoo,里面还什么都没有呢!

Gentoo 安装

你的下一个任务是安装Gentoo的基础系统。 Gentoo安装需要通过命令行手动输入。 安装指南在这里 Gentoo Handbook.  请注意,因为你使用ZFS作为root文件系统,你需要做的事情有点不同,你不得不使用genkernel安装你的内核!

安装文件系统

和FreeBSD一样,你需要安装的文件系统:

zpool import -f data
mount -t zfs data/gentoo /mnt/gentoo
mkdir /mnt/gentoo/tmp
mkdir /mnt/gentoo/usr
mkdir /mnt/gentoo/var
mount -t zfs data/gentoo/tmp /mnt/gentoo/tmp
mount -t zfs data/gentoo/usr /mnt/gentoo/usr
mount -t zfs data/gentoo/var /mnt/gentoo/var

现在跟随Gentoo的安装步骤,一切顺利。

第 15 段(可获 1.45 积分)

正在建立 fstab

在FreeBSD系统中,您将需要创建一个/etc/fstab文件。 文件类似于FreeBSD版本,但是gentoo文件系统安装相对位置在root节点,FreeBSD系统安装相对位置在/ FreeBSD:

data/freebsd/tmp /freebsd/tmp zfs rw 0 0
data/freebsd/usr /freebsd/usr zfs rw 0 0
data/freebsd/usr/include /freebsd/usr/include zfs rw 0 0
...
data/gentoo/tmp /tmp zfs rw 0 0
data/gentoo/usr /usr zfs rw 0 0
...

同样,我省略了文件的重复部分.。

构建内核,ZFS模块和initramfs

当我们从root ZFS文件系统启动,你就需要在ZFS支持下建立一个内核。 你可以找个向导做这个(跳过了“配置部分“并从那里去)。

请注意,我创建了GRUB安装程序后/boot/kernel and /boot/initramfs。 Gentoo默认安装/boot/kernel-<version information>到这里,initramfs也是一样。 你需要创建/boot/kernel 和/boot/initramfs的符号链接,否则就需要你自己把文件复制到正确位置。

第 16 段(可获 1.98 积分)

最后安装Gentoo

在重启前,你需要确保你已经读过了。 下面有一个清单,我忘了,只好重新启动进入安装程序做的:

  • 设置根密码以便登录
  • 安装无线用的端口
  • 不要错过一个卷在/etc/fstab(如果你丢弃了/var,搬运粘贴时会很困惑)

启动进入 Gentoo

你现在应该能够用GRUB启动到Gentoo,祝贺你! 你现在有一个双启动,单ZFS系统!在你创建一个ZFS数据集 在/home之前,需要创建一个User Home 目录。 在Gentoo系统中,按照下面这么做:

m /home || rmdir /home
rm /freebsd/home || rmdir /freebsd/home
mkdir /home
mkdir /freebsd/home
zfs create -o mountpoint=/home -o exec=on -o setuid=off -o compression=lz4 data/home

您可能还需要创建特定用户的home目录数据集(或子目录的方法)。 注意我们设置了挂载点在/home。 这会让ZFS自动挂载,自动安装数据,因此不需要添加一个fstab条目。

第 17 段(可获 2.06 积分)

结论

我发现这个设置是非常强大和灵活,尤其是对核心比较关注的黑客和驱动程序开发人员。 下面是一些设置的优点:

  • 准备好进入一个完整的Linux系统,包括FreeBSD都是内核资源。

    做测试需要时,系统之间方便切换。

    在一个系统坏掉时,有效的恢复机制。

还有与FreeBSD Linux仿真在一起的一些有趣的文件夹。 通常,FreeBSD重的Linux模拟端口功能可以安装一些最小的Linux软件包。 我不知道子系统是不是我自己没做好,但我猜想,在你的处理中极有可能存在一个完整的linux安装程序。

第 18 段(可获 1.43 积分)

文章评论