預備知識

1.R8169驅動和R8168驅動區別

R8169驅動是Linux內核自帶的開源驅動,支持的硬件範圍比較廣,但是跟隨內核一起發佈更新,因此對於新發布的硬件支持不夠及時。R8168驅動是Realtek官方提供的閉源驅動,對特定硬件進行了優化,穩定性更高,更新及時。

R8169驅動主要針對Realtek的地段或早期千兆以太網芯片,包括但不限於RTL8101/8102E,RTL8168/8111,RTl8411/8412等。

R8168驅動是Realtek官方為RTL8168系列(如RTL8168B/C/D/E/F等)開發的專用驅動,針對性更強。

因此R8169驅動和R8168驅動都可以支持RTL8168芯片。

2.內核編譯配置

編譯內核源碼之前可以通過make menuconfig配置內核編譯選項,也可以基於defconfig創建自己的內核配置,例如 my_x86_desktop_defconfig ,配置完畢後再make my_x86_desktop_defconfig加載自定義配置。

安裝內核後,通過 /boot/config-$(uname -r) 文件可以查看當前版本內核的配置選項

一、Bug描述

將內核從4.19-7322升級到4.19-7326後發現有線連接無法使用

二、Bug分析

查看4.19-7322內核的編譯配置,發現只有CONFIG_R8168=m,而沒有CONFIG_R8169=m;

查看4.19-7326內核的編譯配置,發現只有CONFIG_R8169=m,而沒有CONFIG_R8168=m;

查找到當前系統中存在/etc/modprobe.d/balcklist-r8169.conf,説明系統禁用了R8169模塊。

再根據Bug描述,很容易分析出“由於4.19-7326內核不支持R8168驅動,同時又禁用了R8169驅動,所以才導致有線連接無法使用”的結論。

三、Bug修復

編寫deb包,在psotinst中加入如下邏輯:

#檢查內核配置文件是否存在
CONFIG_FILE="/boot/config-$(uname -r)"
if [ ! -f "$CONFIG_FILE" ]; then
    exit 1
fi

#檢查內核配置是否支持R8169驅動且不支持R8168驅動
if grep -q "^CONFIG_R8169=[ym]$" "$CONFIG_FILE" && ( grep -q "^CONFIG_R8168=n$" "$CONFIG_FILE" || ! grep -q "^CONFIG_R8168=" "$CONFIG_FILE" ); then
    #檢查R8169驅動是否被加入黑名單
    if [ -f /etc/modprobe.d/blacklist_r8169.conf ]; then
        #刪除R8169的黑名單配置文件
        rm -f /etc/modprobe.d/blacklist_r8169.conf
        echo "已刪除 /etc/modprobe.d/blacklist_r8169.conf"
    fi
fi