編譯內核模塊 (如顯卡驅動、虛擬化工具、文件系統) 時,內核頭文件版本必須與運行內核版本完全一致 (如 3.13.0-24-generic),否則會導致模塊加載失敗、系統崩潰。本文針對「發行版預編譯內核」「包管理器升級內核」「手動編譯內核」三大場景,提供標準化安裝驗證流程,消除版本不匹配風險。

# 獲取當前運行內核精確版本
uname -r
# 輸出示例:3.10.0-1160.76.1.el7.x86_64
# 頭文件包名必須包含此完整字符串
dpkg-query -s linux-headers-$(uname -r)
# 未安裝顯示:package not installed
apt update
apt install linux-headers-$(uname -r)
# apt 自動解析 $(uname -r) 並安裝對應版本
dpkg-query -s linux-headers-$(uname -r)
# Status: install ok installed
# 默認安裝路徑:/usr/src/linux-headers-$(uname -r)/

rpm -qa | grep kernel-headers-$(uname -r)
# 無輸出 = 未安裝
yum install kernel-headers
# 或 dnf install kernel-headers
# 包管理器自動根據 uname -r 選擇正確版本
rpm -qa | grep kernel-headers-$(uname -r)
# 輸出:kernel-headers-3.10.0-1160.76.1.el7.x86_64
# 默認路徑:/usr/include/linux/ (軟鏈接至 /usr/src/kernels/$(uname -r)/include/)

若您從 kernel.org 下載源碼手動編譯安裝內核:
# 1. 內核源碼目錄
cd /usr/src/linux-5.15.60/
# 2. 編譯安裝內核 (前置步驟)
make -j$(nproc)
make modules_install install
# 3. 安裝頭文件至系統標準位置
make headers_install INSTALL_HDR_PATH=/usr
# 或僅安裝模塊編譯所需頭文件
make modules_prepare
關鍵點:手動編譯場景下,源碼樹即為最精準頭文件,編譯外部模塊時指定 -I /usr/src/linux-5.15.60/include 即可,無需額外安裝包。
| 場景 | 風險 | 解決方案 |
|---|---|---|
| 系統更新內核後未重啟 | uname -r 為舊版本,安裝舊頭文件,新內核模塊編譯失敗 | 先重啟進入新內核,再安裝頭文件 |
| 多內核共存 | 包管理器安裝最新版頭文件,但運行舊內核 | 明確指定版本:apt install linux-headers-5.4.0-100-generic |
| 缺少 build-essential | 編譯工具鏈不全 (gcc, make, libssl-dev 等) | apt install build-essential / yum groupinstall "Development Tools" |
| DKMS 模塊重建失敗 | 頭文件版本不匹配導致 vboxdrv、nvidia 等模塊構建失敗 | 重啟後執行 dkms autoinstall 或手動 dkms install -m nvidia -v 470.xx -k $(uname -r) |
#!/bin/bash
KVER=$(uname -r)
echo "Running kernel: $KVER"
if [[ -f /usr/src/linux-headers-$KVER/Makefile ]]; then
echo "[OK] Headers found at /usr/src/linux-headers-$KVER"
elif [[ -f /usr/src/kernels/$KVER/Makefile ]]; then
echo "[OK] Headers found at /usr/src/kernels/$KVER (RHEL style)"
else
echo "[FAIL] Kernel headers for $KVER NOT FOUND"
echo "Install command:"
if command -v apt &>/dev/null; then
echo " apt install linux-headers-$KVER"
elif command -v yum &>/dev/null; then
echo " yum install kernel-headers-$(echo $KVER | sed 's/-/\-/g' | cut -d- -f1,2)" # 近似
fi
exit 1
fi
# 檢查關鍵頭文件
for h in linux/version.h linux/autoconf.h generated/autoconf.h; do
if [[ -f /usr/src/linux-headers-$KVER/include/$h ]] || [[ -f /usr/src/kernels/$KVER/include/$h ]]; then
echo "[OK] $h present"
else
echo "[WARN] $h missing (may affect some modules)"
fi
done
內核頭文件安裝鐵律:運行內核版本 (uname -r) = 頭文件包版本。發行版內核 → 包管理器自動匹配 (apt install linux-headers-$(uname -r) / yum install kernel-headers);手動編譯內核 → make headers_install 同步生成。安裝後務必驗證 /usr/src/$(uname -r)/Makefile 存在,並檢查 version.h、autoconf.h 關鍵文件。將版本一致性檢查納入編譯腳本前置檢查,從源頭杜絕模塊編譯失敗。