? ? ?自我回歸到 Librem 15 已經有段時間了。我一般會選擇 FreeBSD 來處理所有的事情,但有時會要訪問一個運行在 Librem 平臺上的 Linux OS,以便用它來幫助我對一些遺留的設備驅動進行移植?(比如 BYD 鼠標以及控制屏幕亮度的驅動程序)。
為了將此進行實現,我安裝了一個自己花時間開發(fā)的一個設置:那是一個在 ZFS 存儲卷上共存的 FreeBSD 和 Gentoo Linux?雙引導系統(tǒng)。本文描述了如何實現這項配置。
注意本文是基于 EFI 引導加載程序的。如果你堅持要使用傳統(tǒng)的 BIOS 引導程序,那么就需要對整個過程進行一下調整。
方案概述
該方案的基礎是利用 ZFS 文件系統(tǒng)的通用功能 (即利用面向使用了基于 fstab 方法的 OS 數據集的掛載點功能) 結合 GRUB,實現一個雙引導 OS。
ZFS 概述
ZFS 系統(tǒng)同 FreeBSD 和 Linux 上“典型的”ZFS設置有些微不同。某些數據集?(比如home目錄) 是由兩個操作系統(tǒng)共享的, 但是位于各自掛載點中的 OS 數據集則要依賴于我們所使用的OS,而因此 ZFS 特定的掛載點功能是不能有效使用的。
在本文中,假定存儲卷的名字是 “data”。
整個方案看起來如下:
data/home 被掛載到 /home, 與其所有的子數據集一起使用 ZFS 掛載點系統(tǒng);
data/freebsd 及其子數據集包含了 FreeBSD 系統(tǒng),而其所有的掛載點都被設置成 legacy;
data/gentoo 及其子數據集包含了 Gentoo 系統(tǒng),其所有的掛載點也都被設置成 legacy。
OS 和 GRUB 概述
兩個 OS 都必須利用 /etc/fstab 方法來掛載他們大多數的文件系統(tǒng), 因此我們不能使用 ZFS 掛載點功能。這樣每個 OS 就都需要一個不同的 fstab。注意?data/home 數據集 (以及其它類似的數據集) 都會使用?ZFS 掛載點方法來進行掛載,而不是 fstab。
此外,兩個OS都要通過一個特殊的頂層目錄 (Gentoo 上是 /freebsd, FreeBSD 上是 /gentoo) 來訪問另外一個系統(tǒng)的數據。
GRUB 引導加載程序可以被用來提供一個引導選擇設施,而無需進行大的修改和配置?(不過要知道輸入到 grub.cfg 文件中去的類型的魔數!)
設置過程
設置過程包括如下幾個步驟:
使用 FreeBSD 安裝器創(chuàng)建 GPT 和 ZFS 池;
使用 FreeBSD 啟動加載程序安裝并配置 FreeBSD;
啟動并進入 FreeBSD, 創(chuàng)建 Gentoo Linux 數據集,安裝 GRUB;
啟動并進入 Gentoo Linux 安裝器,安裝 Gentoo;
啟動并進入 Gentoo, 完成配置任務。
當然,你也可以將步驟倒著進行,先安裝 Gentoo,然后再使用它的工具。只是上列順序能使 FreeBSD 上 GPT 的創(chuàng)建和 GRUB 的安裝順利許多。
準備工作
要執(zhí)行這個安裝過程,你需要為兩個OS安裝 memstick 鏡像。FreeBSD 的安裝程序可從這里得到; Gentoo 的可以從這里得到?(使用 livedvd ISO 格式)。(當然,)你還需要有途徑能進行互聯網訪問。
注意對于 Librem 15 或者類似的沒有以太網連接的筆記本電腦, 你可能需要在主要的安裝過程中對 Gentoo 無線工具以及 wpa_supplicant 的安裝過程采取一些輕微的修改。
FreeBSD 安裝程序
引導進入 FreeBSD 安裝程序,通過引導程序菜單選擇手動分區(qū)模式。這樣做會讓你進入一個 shell 操作環(huán)境,教你創(chuàng)建你的分區(qū)并將所有的東西掛載到?/mnt。
創(chuàng)建分區(qū)和 ZFS 池
第一件要做的事情就是使用 gpart 工具來創(chuàng)建你的分區(qū)。FreeBSD 的 man 頁面就相當好,因此你可以使用 “man gpart” 來獲取關于這個工具的指南。我在 Librem 15 上執(zhí)行這個過程看起來是下面這個樣子:
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
然后用新的分區(qū)來創(chuàng)建一個 ZFS 池,并使用 DOS 文件系統(tǒng)來對 EFI 系統(tǒng)分區(qū)進行格式化?(見鬼了,為什么我們還要用這玩意兒?):
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(固態(tài)硬盤)。如果你沒有 SSD,那么做日志或者緩存方面的設置就沒啥意義。16GB 的意向日志是有點多余,但是它可以減輕設備的壓力。注意我們將根數據集的掛載點設置成了?“l(fā)egacy”。
注意 Linux 有其自己的交換格式,因此我們不能將交換設備進行共享。
創(chuàng)建 ZFS 數據集
?
有了一個 ZFS 存儲池后,接下來要做的就是創(chuàng)建數據集。我們先創(chuàng)建?FreeBSD 根目錄(root)并對其進行掛載 (注意,它會從父目錄繼承 “l(fā)egacy”掛載點):
***s create -o compression=lz4 data/freebsdmount -t ***s data/freebsd /mnt/
我們需要創(chuàng)建一些掛載點目錄:
mkdir /mnt/homemkdir /mnt/gentoo/mkdir /mnt/tmpmkdir /mnt/usrmkdir /mnt/var
我使用一個相當精細的 ZFS 方案, 它對不同的目錄設置不同的可執(zhí)行性、權限和壓縮比等屬性。這樣可以達到很顯著的壓縮比,有效的增加了磁盤的可用空間:
***s?create?-o?exec=on?-o?setuid=off?-o?compression=off?data/freebsd/tmp***s?create?-o?exec=on?-o?setuid=on?-o?compression=lz4?data/freebsd/usr***s?create?-o?exec=off?-o?setuid=off?-o?compression=gzip?data/freebsd/usr/include***s?create?-o?exec=on?-o?setuid=off?-o?compression=lz4?data/freebsd/usr/lib***s?create?-o?exec=on?-o?setuid=off?-o?compression=lz4?data/freebsd/usr/lib32***s?create?-o?exec=on?-o?setuid=off?-o?compression=gzip?data/freebsd/usr/libdata***s?create?-o?exec=on?-o?setuid=on?-o?compression=lz4?data/freebsd/usr/local***s?create?-o?exec=on?-o?setuid=off?-o?compression=gzip?data/freebsd/usr/local/etc***s?create?-o?exec=off?-o?setuid=off?-o?compression=gzip?data/freebsd/usr/local/include***s?create?-o?exec=on?-o?setuid=off?-o?compression=lz4?data/freebsd/usr/local/lib***s?create?-o?exec=on?-o?setuid=off?-o?compression=lz4?data/freebsd/usr/local/lib32***s?create?-o?exec=on?-o?setuid=off?-o?compression=gzip?data=freebsd/usr/local/libdata***s?create?-o?exec=on?-o?setuid=off?-o?compression=gzip?data/freebsd/usr/local/share***s?create?-o?exec=off?-o?setuid=off?-o?compression=off?data/freebsd/usr/local/share/info***s?create?-o?exec=off?-o?setuid=off?-o?compression=off?data/freebsd/usr/local/share/man***s?create?-o?exec=on?setuid=on?-o?compression=lz4?data/freebsd/obj***s?create?-o?exec=on?-o?setuid=on?-o?compression=lz4?data/freebsd/usr/ports***s?create?-o?exec=off?-o?setuid=off?-o?compression=lz4?data/freebsd/usr/ports***s?create?-o?exec=on?-o?setuid=off?-o?compression=gzip?data/freebsd/usr/share***s?create?-o?exec=off?-o?setuid=off?-o?compression=off?data/freebsd/usr/share/info***s?create?-o?exec=off?-o?setuid=off?-o?compression=off?data/freebsd/usr/share/man***s?create?-o?exec=off?-o?setuid=off?-o?compression=gzip?data/freebsd/usr/src***s?create?-o?exec=off?-o?setuid=off?-o?compression=lz4?data/freebsd/var***s?create?-o?exec=off?-o?setuid=off?-o?compression=off?data/freebsd/var/db***s?create?-o?exec=off?-o?setuid=off?-o?compression=lz4?data/freebsd/var/db/pkg***s?create?-o?exec=off?-o?setuid=off?-o?compression=gzip?data/freebsd/var/log***s?create?-o?exec=off?-o?setuid=off?-o?compression=off?data/freebsd/var/empty***s?create?-o?exec=off?-o?setuid=off?-o?compression=gzip?data/freebsd/var/mail***s?create?-o?exec=on?-o?setuid=off?-o?compression=off?data/freebsd/var/tmp
因為 FreeBSD 對于某些文件的所在位置有著非常嚴格要求,所以這個方案效果很好。
你也可以將其細分,以達到你期望,比如在 /usr/share 下創(chuàng)建更多的子目錄。
對于 Gentoo,由于 Linux 更傾向于寬松的文件定位,你可以采取一個更簡單的方案:
***s?create?-o?exec=on?-o?setuid=off?-o?compression=off?data/gentoo/tmp***s?create?-o?exec=on?-o?setuid=on?-o?compression=lz4?data/gentoo/usr***s?create?-o?exec=off?-o?setuid=off?-o?compression=lz4?data/gentoo/var
在 Gentoo 系統(tǒng)下需要細分子目錄的用戶權限,類似于我在 FreeBSD 下的操作。
最后的任務是手動掛載所有的文件系統(tǒng),命令模版如下:
mount?-t?***s?data/freebsd/
這個命令模板十分必要,它適合所有傳統(tǒng)的掛載方式。另外,因顯示所有命令要占據較大空間,在此我將其省略。
安裝和配置 FreeBSD 系統(tǒng)
?
輸入 “exit”后會返回到 FreeBSD 安裝程序,同時所有的東西都被掛載在了 /mnt/。 ?安裝過程中的提示信息直接明了。為了最后兩項配置任務,你還需要進入一個 shell 環(huán)境。
進入 shell,然后進入新的 FreeBSD 系統(tǒng):
chroot?/mnt
創(chuàng)建 fstab
因為我們已將大多數的 ZFS 數據集掛載到了每個 OS 各自不同的路徑下,所以需要為他們創(chuàng)建一個 /etc/fstab 文件。下面的 fstab 會將所有的數據集掛載到正確的位置上:
data/freebsd/tmp?/tmp?***s?rw?0?0data/freebsd/usr?/usr?***s?rw?0?0data/freebsd/usr/include?/usr/include?***s?rw?0?0...data/gentoo/?/gentoo?***s?rw?0?0data/gentoo/tmp?/gentoo/tmp?***s?rw?0?0...proc?/proc?procfs?rw?0?0
注意,此處我已將許多條目信息省略掉。你需要按照上述操作,將每一個數據集映射到與其對應的合適路徑上。
安裝 FreeBSD 原生引導程序
?
我們需要 FreeBSD 引導加載程序來執(zhí)行首次進入系統(tǒng)的操作。執(zhí)行如下幾個步驟進行安裝:
mount?-t?msdosfs?/dev/ada0p1?/mntmkdir?/mnt/efimkdir?/mnt/efi/BOOTcp?/boot/boot1.efi?/mnt/efi/BOOT/BOOTX64.EFI
然后設置 zpool 上的?bootfs 參數, 以便 FreeBSD 引導加載程序可以選到正確的數據集:
zpool?set?-o?bootfs=data/freebsd?data
你可能還需要為某些硬件設置 EFI 系統(tǒng)分區(qū)上的 bootme 標識:
gpart?set?-a?bootme?-i?1?ada0
現在你的系統(tǒng)可以直接進入 OS 了。
FreeBSD 主要操作系統(tǒng)
?
現在你可以直接引導進入 FreeBSD 了。你還需要連接到一個與 wpa_supplicant 配置相關的網絡。
在進行其他事項之前,先獲取到新的源代碼,有利于對全局以及內核進行重新構建,這樣做能確保系統(tǒng)處于最新狀態(tài)。你可能也需要獲取到端口的集合等。與此類相關的內容,你可自行查看資料。
安裝 GRUB
grub-efi 端口會安裝一個兼容 EFI 系統(tǒng)的 GRUB 版本。這個端口要比在 Gentoo 上進行同等的操作簡單得多。端口的安裝方法如下:
cd?/usr/ports/sysutils/grub2-efimake?install?clean
你需要使用?grub-mkconfig 命令創(chuàng)建一個 grub.cfg 文件,過程中可能需要對該命令進行編輯。你也可以直接使用下面這個文件?(make sure it’s at /boot/grub/grub.cfg):
insmod?part_gptinsmod?***smenuentry?'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/***s.ko??set?kFreeBSD.vfs.root.mountfrom=***s:data/freebsd??set?kFreeBSD.vfs.root.mountfrom.options=rw}menuentry?'Gentoo?Linux'?{??search.fs_label?data?ZFS_PART??linux?($ZFS_PART)/gentoo@/boot/kernel?do***s=force?root=ZFS=data/gentoo??initrd?($ZFS_PART)/gentoo@/boot/initramfs}
注意,此處我們已為 Gentoo 創(chuàng)建了一項配置。最后,你需要掛載 EFI 系統(tǒng)分區(qū)然后安裝?GRUB:
mount?-t?msdosfs?/dev/ada0p1?/mntgrub-install?--efi-directory=/mnt?--disk-module=efi
這樣做會將 GRUB 引導程序安裝到 EFI 系統(tǒng)分區(qū)的?/efi/grub/grub.efi,你需要將它拷貝到相應位置。在此之前,我建議你先對 FreeBSD 本地的引導加載程序進行備份:
cp?/mnt/efi/BOOT/BOOTX64.EFI?/mnt/efi/BOOT/BOOTX64.BAK
這樣能省去在操作有誤時的回退操作?,F在拷貝 GRUB 引導加載程序:
cp?/mnt/efi/grub/grub.efi?/mnt/efi/BOOT/BOOTX64.EFI
之后需要對 GRUB 引導加載程序進行測試,以確保它能有效的對系統(tǒng)進行重新啟動,并引導進入 FreeBSD。
?
評論
查看更多