開發人員教程:使用 Kpatch 實時修補 Debian 10 Linux 內核
即時修補是一種無需重新啟動內核即可更新 Linux 內核的方法,因此無需重新啟動電腦。即時修補通常用於無延遲地修補嚴重的Linux內核漏洞,因為 即時修補不會導致中斷,也不需要維護視窗。
有一些即時補丁工具,Debian 操作系統的用戶有時會轉向 kpatch 來實現即時補丁 – 或調整內核。
本教程是 kpatch 的實際演示。我們將演示如何使用 kpatch 在不停止的情況下更改正在運行的 Debian 10 內核的行為,更改 /proc/uptime 的內容(和 uptime 命令),以便系統報告的正常運行時間延長 10 年。
kpatch由Red Hat創建,適用於Red Hat Enterprise Linux(RHEL)及其衍生產品。紅帽為 RHEL 客戶提供此商業即時修補服務。 在TuxCare,我們提供KernelCare Enterprise - 它能夠即時補丁RHEL以及所有其他流行的企業Linux發行版。
我在本教程中選擇了 kpatch,因為它的 原始程式碼是免費提供的並定期更新。
先決條件
以下是遵循本教程的系統先決條件:
- 在 x86_64/amd64 架構上運行DebianBullseye(本演示使用了11.6)的測試(非生產)系統
- 20 Gb 可用磁碟空間(Linux 內核原始程式碼佔用磁碟約 909 MB,編譯後增長到 17 GB)
- 您的內核尚未自定義;您正在使用 Debian 提供的標準內核
- 您的內核內置了即時修補。使用此命令,並期望看到兩個設置為 y 的值,表示 CONFIG_HAVE_LIVEPATCH 和 CONFIG_LIVEPATCH:
grep LIVEPATCH /boot/config-$(uname -r)
- 安裝的 gcc 版本與用於建構原始內核的版本符合( kpatch-build 如果版本不匹配,命令將失敗。這可以用選項覆蓋 –跳過-GCC 檢查,但不鼓勵使用它。
- 要查看已安裝的 gcc 版本:gcc –版本
- 要查看用於編譯當前內核的 gcc 版本:cat /proc/version
-
安裝依賴包
- 安裝和配置 sudo
作為 根:
apt-get install sudo (sudo should already be installed, but this makes sure of it) adduser <user> sudo
where <user> is the username for a normal user (all subsequent commands should be done as this user)
2.安裝套件
3.sudo apt-get -y 更新
4.須藤APT-get -y升級
5.sudo apt-get -y install build-essential devscripts ccache gawk libelf-dev libssl-dev linux-source linux-image-$(uname -r)-dbg
-
安裝 kpatch
與 Debian 軟體包一樣,當前版本和通過常規 apt 作為更新提供的版本之間存在延遲。讓我們採用最新的 kpatch 代碼並從原始程式碼構建它。
git 克隆 https://github.com/dynup/kpatch.git CD kpatch && make && sudo make install
-
獲取Linux內核源代碼的副本
- (選擇)創建並移動到工作目錄
MKDIR kernel && CD $_
- 提取 Linux 內核源代碼
tar xaf /usr/src/linux-source-5.10.tar.xz
注意:5.10 是撰寫本文時 Debian 11.6 的 Linux 內核版本。您應該檢查並替換 /usr/src 中存在的最新版本
-
創建 Linux 內核配置檔
- Linux 內核是使用隨發行版提供的配置檔中的設置編譯的。複製並更改一些設置,以便 kpatch-build 可以使用與正在運行的內核相同的設置編譯 Linux 內核。
- CD Linux-source-5.10
cp /boot/config-$(uname -r) .config
- 檢查是否啟用了使用 kpatch 所需的內核設置。所有內容都應返回“y”。
-
scripts/config -s DYNAMIC_FTRACE_WITH_REGS
-
scripts/config -s FUNCTION_TRACER
-
scripts/config -s HAVE_DYNAMIC_FTRACE_WITH_REGS
-
scripts/config -s HAVE_FENTRY
-
scripts/config -s HAVE_LIVEPATCH
-
scripts/config -s KALLSYMS_ALL
-
scripts/config -s KALLSYMS_ALL
-
scripts/config -s LIVEPATCH
-
文本/配置 -s 模組
-
scripts/config -s MODULE_SIG
-
scripts/config -s SYSFS
scripts/config -s SYSTEM_TRUSTED_KEYRING
- 更改一個內核配置項的值
scripts/config --set-str SYSTEM_TRUSTED_KEYS “”
- 離開源目錄
光碟 .
-
創建補丁
修補程式源檔是在 原始檔和更改的原始程式碼檔案上運行的 diff 命令的輸出。
kpatch github頁面的「快速入門」部分中顯示的修補示例 更改了/proc/meminfo的輸出。許多其他 kpatch 文章都重現了這個例子,所以我想要一些不同的東西,更有趣,但仍然安全。
此範例更改執行時間命令的輸出,以產生伺服器的正常運行時間增加了十年的錯覺。
- 仍在工作目錄中,複製檔
cp linux-source-4.19/fs/proc/uptime.c .
- 編輯它。在第 33 行,更改:
(未簽名的長)uptime.tv_sec,
自
(無符號長) uptime.tv_sec + 315576000,
保存檔案
- 創建修補程式檔
diff -u linux-source-5.10/fs/proc/uptime.c ./uptime.c > uptime.patch
- 創建補丁模組。(第一次執行此操作時,需要一些時間,因為必須編譯內核源代碼。後續構建速度明顯更快,大約為幾分鐘。這是在解決問題時投入更多(虛擬)CPU 將有助於加快該過程的操作之一。這是一個CPU密集型任務)。
kpatch-build -s linux-source-5.10 -v /usr/lib/debug/lib/modules/$(uname -r)/vmlinux uptime.patch
- 完成後,您將擁有補丁的 Linux 可載入內核模組檔 (.ko)
ls -l *.ko
-
測試補丁
- 在載入補丁模組之前,請檢查當前的正常運行時間
cat /proc/uptime && uptime -p
- 載入配線模組
sudo kpatch load livepatch-uptime.ko
- 再次檢查正常運行時間
cat /proc/uptime && uptime -p
您應該看到您的正常執行時間提高了十年(內部值沒有改變,只有列印的內容)
- 卸載配線模組
sudo kpatch unload livepatch-uptime.ko
- 檢查正常運行時間是否已恢復到以前的值
cat /proc/uptime && uptime -p
結論
用kpatch即時修補Linux內核並不難。困難在於編寫一個不會使系統崩潰的補丁,並且可以與以後的其他補丁一起使用。大多數補丁不僅僅是從簡單的差異中創建的,需要在各種發行版上運行的多個內核版本之間進行徹底的測試。
補丁編寫者既需要有成就的 C 程式師,也需要是經驗豐富的 Linux 內核開發人員。為每個內核版本編譯內核和測試補丁需要在硬體和自動化工具上進行大量投資。
技能的稀有性和基礎設施的成本意味著供應商必須對即時修補服務收費,這些服務通常是通過昂貴的維護計劃提供的。
這些費用加起來是一大筆錢,但TuxCare的實時補丁服務並非如此 - Linux的起價僅為59.50美元/伺服器/年。 單擊此處閱讀有關 TuxCare針對Linux內核,資料庫,共用庫,物聯網設備和虛擬化系統的即時修補服務範圍的更多資訊。
不要忘記閱讀我們關於 如何應用 Linux 內核安全補丁:3 種不同方式 的明確指南。本文解釋了如何在不重新啟動的情況下更新Linux內核,涵蓋了一些最流行的Linux內核的三種不同方法。

