之前寫了篇文章簡單談了談Yoga 14s 2021款的硬件及Linux兼容性。更早(多年)之前也有一些文章介紹Linux裝機等相關話題。由於現在的新機器有了不少新特性,但相關說明似乎並不多見,故而借此文介紹我的機器相關的信息,以供有需要的人參考。
本文分上下兩部分:上部分主要講系統安裝維護相關的內容,下部分主要講新近功能及當前軟件配置相關的內容(含美化)。
系統安裝
我上次寫Arch Linux的安裝還是在2011年的文章中,當時還在用Acer 5745G,使用Grub (2)引導。而後換用XPS 13 (9343)後,便來到了UEFI和SSD,但並沒有更新說明——因爲當時arch的wiki中的安裝指導很完善,所以在之前的文章上貼了個告示了事。
時至今日,arch wiki的安裝指導仍然是最主要的參考對象。但其中一些地方是「可以這樣,可以那樣」,並要跳轉到對應頁面,對不瞭解的人並不友好——這樣那樣的選項導致的不同結果不夠明確。
當然了,wiki頁面的大部分內容還是挺順暢的,其主要問題存在於硬盤分區和引導器的選擇上。這裏以我的選擇及原因爲例,給出一個參考。
硬盤分區
順手一感慨:我打字的時候兩次順手打成「磁盤」。但現在已經是SSD了,已經不再用磁了……
我的機器預裝有Windows,而且我希望保留雙系統,所以需要Linux和Windows共存。
首先當然是在Windows中使用自帶的磁盤管理,從系統盤切下大部分爲Linux所用。我給Windows留下了200G,其他的全部劃歸Linux使用。
由於使用UEFI引導,Windows會在系統盤之前分配一些額外分區。其中第一個是ESP,給UEFI使用的,是UEFI標準的一部分;另外兩個我沒有去花費時間弄明白。在Linux中我們仍然需要給ESP寫入一些文件。
然後就是給Linux設計分區。這裏的確是按各人需求可以有各種不同的設計方法。我的需求如下:
- 用戶數據需要加密,系統不需要加密
- 系統會進行日常備份(使用snapper,下文會寫)
- 可能會多裝幾個發行版,但暫時僅是arch
- 我有16G內存,可能會進行休眠(掛起到硬盤)
- 空間不嫌多,可以透明壓縮就透明壓縮
於是,對於我來說,很自然的選擇就是系統分區使用BTRFS,並把系統的根作爲子卷。而由於BTRFS不支持對子卷進行加密,故而用戶數據放在單獨的用戶分區中並對分區進行加密(使用LUKS,即通過cryptsetup
命令)。
UEFI最好的地方之一就是引導器裝在ESP中,且引導器可以提供對複雜文件系統的支持。這樣就不需要像以前BIOS時代一樣得把/boot
單獨劃出。這樣/boot
留在系統分區中,不需要額外設置或考慮,且備份可以自動進行。
最終結果上,我的Linux相關分區長成這樣:
├─nvme0n1p5 259:5 0 16G 0 part [SWAP] ├─nvme0n1p6 259:6 0 90G 0 part / └─nvme0n1p7 259:7 0 169G 0 part └─home 254:0 0 169G 0 crypt /home
其中nvme0n1p5是我的SWAP分區;nvme0n1p6是我的系統分區;nvme0n1p7是加密的用戶分區,它解密後就是那個home。
出於多發行版及備份需求,我在系統分區中創建了一個子卷,叫做/@root-arch
,用來存放我的archlinux根分區。掛載時需要額外設定/@root-arch
。
另外,掛載時額外設置compress=zstd:3
來進行透明壓縮——使用zstd的3級壓縮,一般被認爲是壓縮率和速度之間的較好平衡。
一開始我是給/boot
單獨劃了一個分區出來的。但後來隨着使用了snapper,那個分區變得不太合適,最終決定不再給/boot
單獨分區。
引導器的選擇
UEFI出現並普及的一大原因就是解決了BIOS時代引導的複雜及難以維護。但同時,出於各種因素,UEFI時代引導的選擇也多了起來,某種意義上更加複雜了。當然,隨着時間的推移,應當可以converge到有限的幾個選項中,只是現在還沒完全到那個時候。
UEFI時代不再需要寫MBR,而是在UEFI固件(的設置空間)中添加引導項。這裏的引導項也不受MBR空間限制,而是需要作爲文件放在ESP中。
主要的引導方式有兩種:
- 直接通過UEFI進行引導
- 通過UEFI加載引導器,然後從引導器加載系統內核(類似BIOS時代的做法)
直接通過UEFI進行引導需要被引導的內核支持(即需要EFIStub,對arch來說不需要額外配置,因爲默認已經啓用),且需要爲每一個內核(及每一個內核引導配置)增加一個UEFI引導項。我只在XPS 13時試過一次,後來嫌麻煩就再也沒用過了。
這次也是一樣,我仍然選擇通過UEFI加載引導器,然後再加載內核。BIOS時代的Grub 2支持UEFI,但它的界面有些過時,而且明明用了framebuffer但仍然是字符界面。於是我選擇了rEFInd這個專門爲UEFI設計,且有圖形界面的引導器。
rEFInd
安裝說明參照wiki上的rEFInd頁面即可。主要是需要將引導器安裝在ESP中(注意並非/boot
),然後調整啓動項的配置。
對於Linux來說,rEFInd的啓動項配置主要是兩部分:
- 寫在程序配置文件
$ESP/EFI/refind/refind.conf
中的靜態引導項 - 從寫在某個可識別處(如
/boot
下)的refind_linux.conf
文件的內容動態創建的引導項
這裏的可識別包含rEFInd預置的搜索路徑,如相關分區/文件系統根目錄下,或一些典型目錄。對於Linux,rEFInd會自動根據實際存在的內核動態生成引導項(arch不用調整內核文件命名結構,而其他發行版或許需要編輯$ESP/EFI/refind/refind.conf
)。
我最初只寫了第二種,即在refind_linux.conf
文件內聲明諸多引導項:
"Boot with standard options" "i915.enable_psr=0 i8042.dumbkbd root=/dev/nvme0n1p6 rootflags=subvol=@root-arch splash quiet" "Boot with testing options (full)" "i915.enable_psr=0 intel_idle.max_cstate=1 i8042.dumbkbd root=/dev/nvme0n1p6 rootflags=subvol=@root-arch initrd=\intel-ucode.img initrd=\initramfs-%v.img" "Boot to single-user mode" "i915.enable_psr=0 i8042.dumbkbd root=/dev/nvme0n1p6 rootflags=subvol=@root-arch single" "Boot with minimal options" "i915.enable_psr=0 i8042.dumbkbd ro root=/dev/nvme0n1p6"
這麼做主要是爲了方便調試,尤其是剛拿到這臺電腦後的那段時間中(參見《聯想Yoga 14s 2021款裝機小記》)。這樣做還有一個前提,那就是我的/boot
最初放在單獨的分區中。但如果不是這樣(比如我後來廢除這個分區後),且仍然想要使用動態的引導項,則需要編輯$ESP/EFI/refind/refind.conf
以告訴rEFInd去哪裏(對我來說就是@root-arch/boot
)找動態的引導條目配置:
also_scan_dirs @root-arch/boot
一些關注細節的人可能看到,我的這幾個引導參數不完全一樣,尤其是第一項standard options中加了quiet splash
,而其他的沒有。這兩個參數是爲了顯示plymouth提供的splash,即加載動畫;而其他條目沒有則是因爲它們更多用於調試,所以我更希望顯示完整的加載報告。由於plymouth不是功能性的東西,所以放在下篇中講。
但在用了許久之後,我的引導參數趨於穩定。而後在使用了snapper之後,便換爲了使用$ESP/EFI/refind/refind.conf
。這些見後文snapper相關章節。
使用snapper進行自動備份(快照)
前文提到我的根文件系統類型是BTRFS,這麼做的一個目的便是可以使用快照,並配合snapper進行自動備份。有了自動備份,我便可以隨時回滾到某個版本。這在某個更新後不好用時尤其有用。
之前還提到,我的根目錄是作爲一個BTRFS子卷存在的。這個模式非常適合配合snapper進行自動備份。也有人玩一些更靈活的配置(參考這裏),但我沒有進行。一是沒時間,二是看起來會帶來別的副作用。
對snapper的設置其實不複雜,參照wiki上的snapper頁面即可。主要是要在其配置文件中設置好要備份的對象及備份選項(如何時備份),然後啓用對應的守護單元(主要是snapper-timeline.timer
和snapper-cleanup.timer
)。
Tip
我的配置是保留2份月備份,2份週備份,2份日備份。
注意,snapper本身是openSUSE上所用的,並非arch所開發的。所以pacman默認是不會使用snapper在更新時進行備份的。爲了讓它支持,我安裝了snap-pac
這個包——這個包提供了對應的pacman鉤子,會在更新前後各自動創建一個快照。
Tip
當然了,由於機制所致,更新前後的快照中pacman數據庫鎖仍然處於加鎖狀態。對於我來說,這不是個問題,反而可以提醒我這是在快照中。
這樣,我的快照就會自動創建在/.snapshots/
目錄之下。使用snapper對應命令可以列出並操作它們。
然而這樣還不夠,我還需要能夠自動將其加入引導項,以便有需要的時候直接在引導處進行切換。爲了達成這個目的,我使用了refind-btrfs
。
使用refind-btrfs
自動爲快照創建引導項
如前文所述,我使用rEFInd作爲引導器,它可以支持兩種模式的引導項配置。refind-btrfs
就是使用了第一種模式,並會自動維護快照的引導項。
使用refind-btrfs
主要需要三步:
- 創建示例引導項
- 調整配置
- 創建初次配置
第一步,我們需要在$ESP/EFI/refind/refind.conf
中創建一個引導條目。該條目需要是一個可用的引導條目,尤其需要包含正確的子卷的路徑。我的條目如下:
menuentry "Arch Linux - Stable" { icon /EFI/refind/icons/os_arch.png volume "Linux Systems" loader /@root-arch/boot/vmlinuz-linux-lily initrd /@root-arch/boot/initramfs-linux-lily.img options "i915.enable_psr=0 i8042.dumbkbd root=/dev/nvme0n1p6 rootflags=subvol=@root-arch" submenuentry "Boot - fallback" { initrd /@root-arch/boot/initramfs-linux-lily-fallback.img } submenuentry "Boot - terminal" { add_options "systemd.unit=multi-user.target" } }
條目中每一句話的詳細含義請自行對應文檔,或憑名稱猜測。其中重點的是兩部分:
- 告訴rEFInd要去哪個分區處理啓動項,即
volume "Linux Systems"
的任務 - 寫明帶子卷的啓動項,即
loader
initrd
和options
中所有包含@root-arch
的部分
Note
我不知道refind-btrfs的作者是否強制要求子卷名稱以@
開頭(上游示例中均包含),但這是許多人都遵守的命名方法,我也是其中之一。
第二步,編輯/etc/refind-btrfs.conf
文件,以符合自己的情況。其中主要是這三節中的目錄:
[[snapshot-search]]
[snapshot-manipulation]
[boot-stanza-generation]
默認配置就是基於配合snapper考慮而設置的,所以對於大多數人來說保留默認即可。我額外調整了[snapshot-manipulation]
中的selection_count
來添加更多條目。
第三步就是執行refind-btrfs
來初始化並添加相應引導項。這裏主要是要注意是否有報錯,並解決對應錯誤。如果一切無誤,那麼它應當會自動在$ESP/EFI/refind/refind.conf
的末尾添加一項include
,並在對應文件中添加所要求個數的對應快照的引導項。
在完成這個基本配置並確定可用之後,如果希望自動維護啓動項,可以考慮啓用refind-btrfs.service
這個服務,以自動監視對應目錄的變更。
其他雜項
相比早期的安裝流程,當下的流程沒有結構性區別,但個別細節上有不同。其中最主要的就是不再使用wifi-menu
連接WiFi,而是使用iwctl
——比wifi-menu功能強大,但沒有它易用。
引導器之外,我依然關閉了Secure Boot,因爲屢次嘗試加上簽名都失敗了,而且似乎也沒有辦法給rEFInd加?我知道如紅帽和Canonical(Ubuntu的東家)等發行版廠商和微軟購買或談下了簽名,而且Arch的ISO似乎是可以在Secure Boot開啓的情況下正常引導的。但我始終沒找到合適的方案。最接近的是這篇講rEFInd如何在Secure Boot下啓動的文章,但讀起來仍然過於複雜了。
一些眼尖的人應當看到了,我用的內核叫linux-lily,而不是默認的linux。這個內核是ArchlinuxCN的百合仙子所維護的(當然,也放在ArchlinuxCN倉庫中),對我來說主要優勢在於添加了tty下顯示中文的支持,並可以運行Anbox(因其支持ashmem和binder)。
Note
Anbox所需要的這些內核模塊(尤其是ashmem)不再能夠在5.15(不含)以後的內核上使用DKMS的方式編譯,因爲允許這麼做會存在潛在風險(參考這裏的說明)。所以如果想使用Anbox,就需要隨着內核編譯模塊。
最後補一下關於多發行版:前面提到,我分區和文件系統組織的一個目的是可以安裝其他發行版以和arch共存,以便萬一有意可以輕鬆遷移。我之前在XPS 13上其實做了和gentoo共存,但由於編譯以及對portage的不熟悉導致的麻煩,最終讓我沒換到gentoo去。後來又看到nixos,但僅在虛擬機中進行了簡單的嘗試,沒有實裝。這回做了準備,但由於各種因素,暫時還沒有嘗試去再裝一個發行版。所以這部分就留待以後再寫了。
您可以在Hypothesis上的該群組內進行評論,或使用下面的Disqus評論。