給 kmod 簽名以支援安全啓動

印象中似乎很久沒有寫 blog 了。
生活中積累了都是一些比較零碎的東西,沒有什麼特別值得寫的。

半年前買了一台 surface pro 9 之後,直接 ntr 裝了 debian。
雖然半年使用體驗下來,個人覺得一致性體驗會比正統 windows 差點,但我仍然通過很多小技巧讓 linux 成爲了我的主力。 我就不買macbook 我就不買 就不買 氣死你們

這篇 blog 大概用作備忘,每次滾內核都要手動簽一下,挺煩的
就幾個命令的事情,所以還不想去手動去配 dkms,懶了懶了

關於安全啓動

安全啓動固然好,但是有些時候又想偷懶。畢竟我都有 root 了我還有什麼不能幹的x
主要問題是,在啓動 kernel 之後,內核似乎會同時啓用 kmod 的簽名檢查,讓一些原本沒有簽名的模塊無法正常加載。
比如設備驅動、虛擬機內核模塊 等(真的是很浪費時間耶

至於如何在 surface 啓用安全啓動,這邊就不再贅述了,如果你同樣有 surface 運行 linux 的需求,你可以跟隨 GitHub 上的 linux-surface 項目的 wiki 進行配置。

(大抵還是 mok 那一套

簽名流程

因爲我這邊需要簽名的東西是 vmware 的 vmmon 和 vmnet,所以我就以這兩個模塊爲例。
你問我都 linux 了爲什麼不用 kvm? 大概還是因爲習慣了 vmware,畢竟還需要管理一些 esxi 實例。二者都可以,只是對我來說 vmware 方便而已了。

簽名流程非常簡單。首先,你需要一個私鑰和一個公鑰。然後,你需要將公鑰加入到你的 MOK 中,這樣你的內核就會信任你的模塊了。
那麼上命令吧。

1
2
3
4
5
$ sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file \
sha256 \
<mok priv> \
<mok public> \
$(modinfo -n <mod>)

其中,<mok priv> 是你的私鑰,<mok public> 是你的公鑰,<mod> 是你要簽名的模塊,如果你有正常跟隨 surface-linux 的 wiki 配置安全啓動的話,你應該會有一個密鑰對,直接用它們就行。

這樣,模塊就被簽名好了。直接用 modprobe 或者 insmod 加載上去就行。
或者更簡單一些,reboot。

這個方法同樣適用於 virtualbox,簽完加載即可。
順便說一句 virtualbox 的3D圖形加速有大約 300MB/s 內存泄漏,開機直接被 oom kill。xs

引用

給 kmod 簽名以支援安全啓動

https://blog.awa.moe/2024/03/21/kmod-signing/

Author

TheSnowfield

Posted on

2024-03-21

Updated on

2024-03-22

Licensed under