讓 Gentoo 能在 UEFI 模式下開機

公司新買的便宜 server 是 Acer 的 Altos T110 F3,這家的 BIOS 很奇怪,用 legacy mode 開機是抓不到任何 SATA 硬碟的,所以傳統的 MBR 模式也行不通。
因為被迫使用 UEFI boot,所以這次只能乖乖學了,參考的文件是這篇:UEFI Gentoo Quick Install Guide

光碟開機 → 使用 parted 去製作 GPT 分割區 → 格式化 → mount → 解壓縮 stage3 → chroot 的安裝步驟已經是老方法了,所以這邊就不廢話。
比較值得留意的就是 /boot 這個分割區在 parted 內要使用 mkpart fat32 去建立,並輸入 set <partition id> boot on 設定好,退出 parted 以後用 mkfs.vfat -F 32 進行格式化。
UEFI boot 需要 fat32 的分割區,而 kernel 需要擺在 /boot/efi/boot/bootx64.efi 這個位置,這是和以往差異較大的地方。

只是因為 Gentoo 官方的光碟無法以 UEFI 模式開機,想執行「efibootmgr -c -d /dev/sda -p 1 -L Gentoo -l "\efi\boot\bootx64.efi"」這行的話,首先就必須設法以 UEFI 模式開機。
上面的 wiki 教的是用隨身碟,直接在 Linux 下面把隨身碟弄成 GPT,造個 EFI boot 分割區,再把編譯好的 kernel 放上去就能開機進去下那行指令了。
也有用 SystemRescueCD 的玩法,這玩意是 Gentoo 的一個分支,總之只要開得進去,然後執行 efibootmgr 那行指令就好。
我是把在 chroot 環境下編好的 kernel 直接丟隨身碟,所以隨身碟上沒有 efibootmgr 也沒關係,因為 rootfs 會掛上我之前在 chroot 環境下做好的新系統,裡面已經有裝 efibootmgr 了。

那麼 kernel 應該如何製作?其實方法和過去差不多,參考這篇就可以了:EFI stub kernel
比較重要的是「Processor type and features ---> [*] Built-in kernel command line」這項要選,然後把 root=/dev/xxx 打進去。
下面的 root=PARTUUID=xxxxxxxxxxxxx 這個沒有用,至於為什麼就留給 Linux 專家去解答了。
另一個重要的地方就是這並非使用 grub2 開機,所以我在安裝 Gentoo 時將 /usr 放在獨立分割區需要新方法這篇提到的 initramfs 也必須一併弄進 kernel,否則獨立 /usr 分割區的系統會無法開機。
這個必須要選取「General setup ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support」,然後把沒壓縮過的 initramfs 檔案路徑輸入進去,這樣編譯出來的 kernel 就能直接拿來用了。
使用 genkernel 之類的工具造出來的 initramfs 檔是經過壓縮的,所以必須使用 zcat 把它還原回來再導入 kernel,這個上面的網頁也有說明了。

至於使用 genkernel 製作 initramfs 的方式,這在我這次安裝時發現會有問題,開機做 fsck 的時候會說 /dev/sda4 (/usr 的分割區) 已經被 mount 了之類的訊息。
雖然這類訊息會被忽略,但是開機的時候看到黃色驚嘆號還是不太爽,所以又去爬了文,結論就是應該改用Initramfs/HOWTO這篇介紹的 dracut。
用法非常簡單,打一行「dracut --host-only --no-kernel」就搞定了,和 genkernel 沒有太大區別,但是就不會有問題了。