自我回归到 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 ada0gpart create -s gpt ada1gpart add -t efi -l efi-system -s 200m ada0gpart add -t freebsd-***s -l ***s-data ada0gpart add -t linux-swap -l swap -s 96g ada0gpart add -t freebsd-***s -l ***s-data-log -s 16g ada0gpart add -t freebsd-***s -l ***s-data-cache ada0
然后用新的分区来创建一个 zfs 池,并使用 dos 文件系统来对 efi 系统分区进行格式化(见鬼了,为什么我们还要用这玩意儿?):
newfs_msdos /dev/ada0p1zpool 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”挂载点):
***s create -o compression=lz4 data/freebsdmount -t ***s data/freebsd /mnt/
我们需要创建一些挂载点目录:
mkdir /mnt/homemkdir /mnt/gentoo/mkdir /mnt/tmpmkdir /mnt/usrmkdir /mnt/var
我使用一个相当精细的 zfs 方案, 它对不同的目录设置不同的可执行性、权限和压缩比等属性。这样可以达到很显著的压缩比,有效的增加了磁盘的可用空间:
***screate-oexec=on-osetuid=off-ocompression=offdata/freebsd/tmp***screate-oexec=on-osetuid=on-ocompression=lz4data/freebsd/usr***screate-oexec=off-osetuid=off-ocompression=gzipdata/freebsd/usr/include***screate-oexec=on-osetuid=off-ocompression=lz4data/freebsd/usr/lib***screate-oexec=on-osetuid=off-ocompression=lz4data/freebsd/usr/lib32***screate-oexec=on-osetuid=off-ocompression=gzipdata/freebsd/usr/libdata***screate-oexec=on-osetuid=on-ocompression=lz4data/freebsd/usr/local***screate-oexec=on-osetuid=off-ocompression=gzipdata/freebsd/usr/local/etc***screate-oexec=off-osetuid=off-ocompression=gzipdata/freebsd/usr/local/include***screate-oexec=on-osetuid=off-ocompression=lz4data/freebsd/usr/local/lib***screate-oexec=on-osetuid=off-ocompression=lz4data/freebsd/usr/local/lib32***screate-oexec=on-osetuid=off-ocompression=gzipdata=freebsd/usr/local/libdata***screate-oexec=on-osetuid=off-ocompression=gzipdata/freebsd/usr/local/share***screate-oexec=off-osetuid=off-ocompression=offdata/freebsd/usr/local/share/info***screate-oexec=off-osetuid=off-ocompression=offdata/freebsd/usr/local/share/man***screate-oexec=onsetuid=on-ocompression=lz4data/freebsd/obj***screate-oexec=on-osetuid=on-ocompression=lz4data/freebsd/usr/ports***screate-oexec=off-osetuid=off-ocompression=lz4data/freebsd/usr/ports***screate-oexec=on-osetuid=off-ocompression=gzipdata/freebsd/usr/share***screate-oexec=off-osetuid=off-ocompression=offdata/freebsd/usr/share/info***screate-oexec=off-osetuid=off-ocompression=offdata/freebsd/usr/share/man***screate-oexec=off-osetuid=off-ocompression=gzipdata/freebsd/usr/src***screate-oexec=off-osetuid=off-ocompression=lz4data/freebsd/var***screate-oexec=off-osetuid=off-ocompression=offdata/freebsd/var/db***screate-oexec=off-osetuid=off-ocompression=lz4data/freebsd/var/db/pkg***screate-oexec=off-osetuid=off-ocompression=gzipdata/freebsd/var/log***screate-oexec=off-osetuid=off-ocompression=offdata/freebsd/var/empty***screate-oexec=off-osetuid=off-ocompression=gzipdata/freebsd/var/mail***screate-oexec=on-osetuid=off-ocompression=offdata/freebsd/var/tmp
因为 freebsd 对于某些文件的所在位置有着非常严格要求,所以这个方案效果很好。
你也可以将其细分,以达到你期望,比如在 /usr/share 下创建更多的子目录。
对于 gentoo,由于 linux 更倾向于宽松的文件定位,你可以采取一个更简单的方案:
***screate-oexec=on-osetuid=off-ocompression=offdata/gentoo/tmp***screate-oexec=on-osetuid=on-ocompression=lz4data/gentoo/usr***screate-oexec=off-osetuid=off-ocompression=lz4data/gentoo/var
在 gentoo 系统下需要细分子目录的用户权限,类似于我在 freebsd 下的操作。
最后的任务是手动挂载所有的文件系统,命令模版如下:
mount-t***sdata/freebsd//mnt/
这个命令模板十分必要,它适合所有传统的挂载方式。另外,因显示所有命令要占据较大空间,在此我将其省略。
安装和配置 freebsd 系统
输入 “exit”后会返回到 freebsd 安装程序,同时所有的东西都被挂载在了 /mnt/。 安装过程中的提示信息直接明了。为了最后两项配置任务,你还需要进入一个 shell 环境。
进入 shell,然后进入新的 freebsd 系统:
chroot/mnt
创建 fstab
因为我们已将大多数的 zfs 数据集挂载到了每个 os 各自不同的路径下,所以需要为他们创建一个 /etc/fstab 文件。下面的 fstab 会将所有的数据集挂载到正确的位置上:
data/freebsd/tmp/tmp***srw00data/freebsd/usr/usr***srw00data/freebsd/usr/include/usr/include***srw00...data/gentoo//gentoo***srw00data/gentoo/tmp/gentoo/tmp***srw00...proc/procprocfsrw00
注意,此处我已将许多条目信息省略掉。你需要按照上述操作,将每一个数据集映射到与其对应的合适路径上。
安装 freebsd 原生引导程序
我们需要 freebsd 引导加载程序来执行首次进入系统的操作。执行如下几个步骤进行安装:
mount-tmsdosfs/dev/ada0p1/mntmkdir/mnt/efimkdir/mnt/efi/bootcp/boot/boot1.efi/mnt/efi/boot/bootx64.efi
然后设置 zpool 上的bootfs 参数, 以便 freebsd 引导加载程序可以选到正确的数据集:
zpoolset-obootfs=data/freebsddata
你可能还需要为某些硬件设置 efi 系统分区上的 bootme 标识:
gpartset-abootme-i1ada0
现在你的系统可以直接进入 os 了。
freebsd 主要操作系统
现在你可以直接引导进入 freebsd 了。你还需要连接到一个与 wpa_supplicant 配置相关的网络。
在进行其他事项之前,先获取到新的源代码,有利于对全局以及内核进行重新构建,这样做能确保系统处于最新状态。你可能也需要获取到端口的集合等。与此类相关的内容,你可自行查看资料。
安装 grub
grub-efi 端口会安装一个兼容 efi 系统的 grub 版本。这个端口要比在 gentoo 上进行同等的操作简单得多。端口的安装方法如下:
cd/usr/ports/sysutils/grub2-efimakeinstallclean
你需要使用grub-mkconfig 命令创建一个 grub.cfg 文件,过程中可能需要对该命令进行编辑。你也可以直接使用下面这个文件(make sure it’s at /boot/grub/grub.cfg):
insmodpart_gptinsmod***smenuentry'freebsd'--classfreebsd--classbsd--classos{search.fs_labeldatazfs_partecholoadingfreebsdkernel...kfreebsd($zfs_part)/freebsd/@/boot/kernel/kernelkfreebsd_loadenv($zfs_part)/freebsd/@/boot/device.hintskfreebsd_module_elf($zfs_part)/freebsd/@/boot/kernel/opensolaris.kokfreebsd_module_elf($zfs_part)/freebsd/@/boot/kernel/acl_nfs4.kokfreebsd_module_elf($zfs_part)/freebsd/@/boot/kernel/***s.kosetkfreebsd.vfs.root.mountfrom=***s:data/freebsdsetkfreebsd.vfs.root.mountfrom.options=rw}menuentry'gentoolinux'{search.fs_labeldatazfs_partlinux($zfs_part)/gentoo@/boot/kerneldo***s=forceroot=zfs=data/gentooinitrd($zfs_part)/gentoo@/boot/initramfs}
注意,此处我们已为 gentoo 创建了一项配置。最后,你需要挂载 efi 系统分区然后安装grub:
mount-tmsdosfs/dev/ada0p1/mntgrub-install--efi-directory=/mnt--disk-module=efi
这样做会将 grub 引导程序安装到 efi 系统分区的/efi/grub/grub.efi,你需要将它拷贝到相应位置。在此之前,我建议你先对 freebsd 本地的引导加载程序进行备份:
cp/mnt/efi/boot/bootx64.efi/mnt/efi/boot/bootx64.bak
这样能省去在操作有误时的回退操作。现在拷贝 grub 引导加载程序:
cp/mnt/efi/grub/grub.efi/mnt/efi/boot/bootx64.efi
之后需要对 grub 引导加载程序进行测试,以确保它能有效的对系统进行重新启动,并引导进入 freebsd。
发展物联网实践方法领域的四项预测
华为mate10确定10月16日发布:外观,配置,黑科技,售价曝光,直接对飚iPhone8
主流车企电子电气架构进化对比分析
金莱特“遍地开花”梦又一次搁浅
无线网桥可以用在哪一些场景
让 FreeBSD 和 Gentoo Linux 在 ZFS 存储卷上共存
洲明科技裸眼3D原创内容助力景区质变
区块链产业遇到的障碍有哪一些
嵌入式Qt-控制硬件:滑动条控制RGB灯
will.i.am创立的技术公司I.AM +与IBM携手
长电科技携手 SEMICON China 2021,以先进封装助力智慧生活
有源滤波器在船舶电力推进系统中的影响
如何利用5G确定性网络加速数字化转型
黑科技智能魔镜——你的生活小管家
在通信领域中,什么是4G模块
麦当劳发行620万数字货币,它能超越比特币成为下一个百倍币吗?
详细盘点常用射频微波测量仪器的种类和用途!
ADI公司的人数统计算法确保高效空间利用与工作人员安全
基于一种可用于资产服务交易的去中心化P2P平台Wono介绍
关于二维/石墨烯材料及电子器件测试介绍