自我回归到 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 被挂载到 14.www.qixoo.qixoo.com/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 上执行这个过程看起来是下面这个样子:

然后用新的分区来创建一个 ZFS 池,并使用 DOS 文件系统来对 EFI 系统分区进行格式化 (见鬼了,为什么我们还要用这玩意儿?):

注意我们已经将 atime (它可以大大降低磁盘的写入量)关掉了,并且将校验算法设置成了 sha256。

ada1 磁盘是一块我装进去的 SSD(固态硬盘)。如果你没有 SSD,那么做日志或者缓存方面的设置就没啥意义。16GB 的意向日志是有点多余,但是它可以减轻设备的压力。注意我们将根数据集的挂载点设置成了 “legacy”。

注意 Linux 有其自己的交换格式,因此我们不能将交换设备进行共享。

创建 ZFS 数据集

有了一个 ZFS 存储池后,接下来要做的就是创建数据集。我们先创建 FreeBSD 根目录(root)并对其进行挂载 (注意,它会从父目录继承 “legacy”挂载点):

我们需要创建一些挂载点目录:

我使用一个相当精细的 ZFS 方案, 它对不同的目录设置不同的可执行性、权限和压缩比等属性。这样可以达到很显著的压缩比,有效的增加了磁盘的可用空间:

因为 FreeBSD 对于某些文件的所在位置有着非常严格要求,所以这个方案效果很好。

你也可以将其细分,以达到你期望,比如在 /usr/share 下创建更多的子目录。

对于 Gentoo,由于 Linux 更倾向于宽松的文件定位,你可以采取一个更简单的方案:

在 Gentoo 系统下需要细分子目录的用户权限,类似于我在 FreeBSD 下的操作。

最后的任务是手动挂载所有的文件系统,命令模版如下:

这个命令模板十分必要,它适合所有传统的挂载方式。另外,因显示所有命令要占据较大空间,在此我将其省略。

安装和配置 FreeBSD 系统

输入 “exit”后会返回到 FreeBSD 安装程序,同时所有的东西都被挂载在了 /mnt/。 安装过程中的提示信息直接明了。为了最后两项配置任务,你还需要进入一个 shell 环境。

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

创建 fstab

因为我们已将大多数的 ZFS 数据集挂载到了每个 OS 各自不同的路径下,所以需要为他们创建一个 /etc/fstab 文件。下面的 fstab 会将所有的数据集挂载到正确的位置上:

注意,此处我已将许多条目信息省略掉。你需要按照上述操作,将每一个数据集映射到与其对应的合适路径上。

安装 FreeBSD 原生引导程序

我们需要 FreeBSD 引导加载程序来执行首次进入系统的操作。执行如下几个步骤进行安装:

然后设置 zpool 上的 bootfs 参数, 以便 FreeBSD 引导加载程序可以选到正确的数据集:

你可能还需要为某些硬件设置 EFI 系统分区上的 bootme 标识:

现在你的系统可以直接进入 OS 了。

FreeBSD 主要操作系统

现在你可以直接引导进入 FreeBSD 了。你还需要连接到一个与 wpa_supplicant 配置相关的网络。

在进行其他事项之前,先获取到新的源代码,有利于对全局以及内核进行重新构建,这样做能确保系统处于最新状态。你可能也需要获取到端口的集合等。与此类相关的内容,你可自行查看资料。

安装 GRUB

grub-efi 端口会安装一个兼容 EFI 系统的 GRUB 版本。这个端口要比在 Gentoo 上进行同等的操作简单得多。端口的安装方法如下:

你需要使用 grub-mkconfig 命令创建一个 grub.cfg 文件,过程中可能需要对该命令进行编辑。你也可以直接使用下面这个文件 (make sure it’s at /boot/grub/grub.cfg):

注意,此处我们已为 Gentoo 创建了一项配置。最后,你需要挂载 EFI 系统分区然后安装 GRUB:

这样做会将 GRUB 引导程序安装到 EFI 系统分区的 /efi/grub/grub.efi,你需要将它拷贝到相应位置。在此之前,我建议你先对 FreeBSD 本地的引导加载程序进行备份:

这样能省去在操作有误时的回退操作。现在拷贝 GRUB 引导加载程序:

之后需要对 GRUB 引导加载程序进行测试,以确保它能有效的对系统进行重新启动,并引导进入 FreeBSD。

Gentoo 安装程序

下一个任务是安装 Gentoo 基础系统。 Gentoo 的安装可以通过命令行手动完成。Gentoo Handbook 提供了一份指南。注意,因为你使用了 ZFS 作为根文件系统,因此需要使用 genkernel 来安装内核。

挂载文件系统

要使用 FreeBSD, 你就会需要对文件系统进行挂载:

现在可以按照 Gentoo 的安装步骤来进行。

创建 fstab

使用 FreeBSD 系统时, 你需要创建一个 /etc/fstab 文件,它与 FreeBSD 的版本类似, 不过 gentoo 文件系统被挂载到了根目录的相对位置下,而 FreeBSD 文件系统则被挂载到了 /freebsd 目录的相对位置下:

这里我省略了文件中的一些重复部分。

构建内核、ZFS 模块以及 initramfs

因为我们是从根路径下的 ZFS 文件系统启动的,因此我们需要设置一个支持 ZFS 的内核。你可以在这里查看指南(跳转到 “配置内核(Configuring the Kernel)” 一节查阅)。

我已经将 GRUB 的安装放在 /boot/kernel 和 /boot/initramfs 之后。 Gentoo 会默认将其内核安装到 /boot/kernel-<版本信息>, initramfs 也是如此。然后,我们需要使用 /boot/kernel 和 /boot/initramfs 这两个名称来创建符号链接,或者自行将文件拷贝到正确的位置。

最后是 Gentoo 的安装

在重启之前,请务必阅读该小节。下列检查列出了一些必要操作,如有遗漏则需重新进入安装程序进行操作:

设置一个根密码,这样才可以真正登录进去;

安装可以使用无线网络的端口;

不要漏掉 /etc/fstab 中的存储卷(如果遗漏了 /var, 系统间的互操作会很繁琐)。

启动进入 Gentoo

现在你可直接从 GRUB 启动进入 Gentoo,并成功在单 ZFS 文件系统里实现了双引导。但在创建用户主目录之前,你还需要为 /home 创建一个 ZFS 数据集。在 Gentoo 系统中,进行如下操作:

你也许还想为特定的一些用户主目录(或其子目录)创建数据集,但我们已经将挂载点设置成 /home,这样做只会导致 ZFS 挂载点功能挂载这些数据集。因此没必要再添加一个 fstab 配置项。

总结

这样的设置相当强大且灵活,是内核高手及驱动开发者的福音。下面列出了是进行该设置的好处:

可以从 FreeBSD 系统访问一个完整的 Linux 系统,包括内核的源代码;

便于实验性质的系统间切换操作;

在某个系统坏掉时可以有效地恢复机制。

当然,还有一些使用 FreeBSD 的 Linux 仿真层的有趣的探索。一般而言, FreeBSD 的 Linux 仿真端口只会安装一个 Linux 包的最小集合。我对子系统的了解不多,所以还不知道怎么做。希望你在深入了解后能安装一个完整的 Linux 系统。

让 FreeBSD 和 Gentoo Linux 在 ZFS 存储卷上共存的更多相关文章

  1. Docker系列05—Docker 存储卷详解

    本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...

  2. k8s存储卷概述

    pod本身具有生命周期,故其内部运行的容器及其相关数据自身均无法持久存在.docker支持配置容器使用存储卷将数据持久存储于容器自身文件系统之外的存储空间中,它们可以是节点文件系统或网络文件系统之上的 ...

  3. Docker系列03—Docker 存储卷

    一.存储卷介绍 1.1 背景 Docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层: 如果运行的容器修改了 ...

  4. 选择 FreeBSD 而不是 Linux 的技术性原因3

    选择 FreeBSD 而不是 Linux 的技术性原因3 jail FreeBSD Jails 系统是另一个惊人的工程壮举. 在 2000 年 3 月 14 日的 4.0 版本中,FreeBSD 引入 ...

  5. linux高级数据存储

    linux内此存储模式由5部分组成,自低向上的顺序: 物理卷,内核块设备驱动,内核文件系统驱动,虚拟文件系统,应用程序数据结构; 系统中所有的文件仅按此模式存储,无论是数据还是元数据,均在此模式下统一 ...

  6. Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门

    Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门 转载请在文首保留原文出处:EMC中文支持论坛 - https://community.emc.com/go/chines ...

  7. 选择 FreeBSD 而不是 Linux 的技术性原因4

    Linux 二进制兼容性 FreeBSD 提供了与 Linux 的二进制兼容.这使得用户可以在 FreeBSD 系统上安装和运行许多 Linux 二进制文件, 而无需首先修改二进制文件.在某些特定情况 ...

  8. Gentoo Linux 学习笔记1

         Gentoo Linux是一个基于portage进行包管理的Linux发行版,最早版本始于2002年.其官方官网为http://www.gentoo.org 目前,Gentoo Linux已 ...

  9. 开始使用gentoo linux——gentoo安装笔记(下)

    gentoo安装笔记(下) 上一章,已经对操作系统安装做了充分准备,并且已经从livecd(u盘系统)切换进入了gentoo安装环境中. 不过现在才是真正的开始!打起精神!这可不是在装ubuntu! ...

随机推荐

  1. Vue基本应用

    1.  returnDetail.$mount('#returnDetail');  不用el 直接可以绑定数据到页面的id上 作用区域不能交叠多个vue 实体 否则后面的vue 实体会失效. 2. ...

  2. 调用sharepoint 2010 REST报版本过低

    问题描述: 写了一个webservice调用sharepoint REST,本机测试成功,部署到服务器上后报错 (System.Data.Services.Client.DataServiceQuer ...

  3. 使用IdleTest进行TDD单元测试驱动开发演练(1)

    [前言] 开发工具:Visual Studio 2012 测试库:Visual Studio 2012自带的MSTest DI框架:Unity 数据持久层:Entity Framework 前端UI: ...

  4. 了解JavaScript 数组对象及其方法

    数组在我目前学习过的编程语言中都可以见到, 形形色色的方法也数不胜数, 不过功能都一样, 最多也就是方法名稍稍有所不同, 老外也没个准啊, 如果英语比较好的同学对于学习方法(method)来说是很快的 ...

  5. Web性能优化:基本思路和常用工具

    听了荣华的演讲之后,我对性能优化有了更深层次的认识. 性能优化的重要性 性能优化是为了赢得用户,为了降低成本. 性能优化思路 Web常见优化点   Java常见排查工具  

  6. Atitit.css 规范 bem  项目中 CSS 的组织和管理

    Atitit.css 规范 bem  项目中 CSS 的组织和管理 1. 什么是BEM?1 1.1. 块(Block)2 1.2. 元素(Element)2 1.3. BEM树(和DOM树类似).3 ...

  7. ASP.NET MVC 身份认证

    身份认证的好处就是, 如果这个页面没有登录, 刷新后会自动跳到登录页要求登录,保证了应用程序的安全.而Forms 身份认证是web下最常用的,如何配置呢?见下(基于mvc 4) 1.在webconfi ...

  8. Python中获取当前日期的格式

    在Python里如何获取当前的日期和时间呢?在Python语言里,我们可以通过调用什么模块或者类函数来得到当前的时间或日期呢? 当然你可以使用时间模块(time module),该模块提供了各种和时间 ...

  9. MySQL误操作后如何快速恢复数据

    基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了 ...

  10. Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b9a188c8922137c6

    未能加载文件或程序集“Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b9a188c8922137c6”或它的某一个 ...