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