為Deepin Linux編譯核心
Deepin Linux是Linux中的新銳力量,獨創的桌面環境、應用生態與設計時的種種匠心,使得它擁有非常酷炫的體驗,成為越來越多電腦愛好者的首選。
不過,基於Linux的作業系統,並不像Windows一樣能完美解決驅動問題。在Windows中,只需找到對應的官方驅動安裝即可;但是Linux卻是將裝置驅動程式都整合在核心中,以及作為核心模組載入,這一切都是在編譯核心時就已一錘定音。如此機制,使得Deepin發行版的一套編譯好的核心並不能完美適用於所有裝置。
筆者就在Linux的驅動上吃了苦頭。面前這臺備用筆記本是ThinkPad X200,X系列的老旗艦,在執行Deepin的時候,顯示卡驅動就出現了問題,表現為每次關蓋後重新開啟,或者是待機後重新喚醒,移動滑鼠就會在滑鼠指標下方區域出現畫面撕裂、閃屏的情況,即便使用“深度顯示卡驅動管理工具”更換驅動也是如此。後來我就決定,自己為X200量身編譯一個核心。
獲取核心原始碼
在Linux核心官網( ofollow,noindex">https://www.kernel.org/ )上,就可以下載到若干個版本的核心原始碼。從官網可知,核心原始碼有若干個版本,分別包括 主線版 (mainline)、 穩定版 (stable)、 長期支援版 (longterm)。這幾個版本的區別如下:
- 主線版 是Linux開發者活躍的地方,最新的核心功能主要在這裡誕生;
- 穩定版 是可供使用者直接使用的版本;
- 而 長期支援版 則主要是給裝置製造商、發行版開發者使用的版本,相對更穩定,且能長期得到技術支援。
對於PC上的Linux,一般選擇穩定版,和版本大於等於 4.x
的長期支援版。我選擇的是 4.19.1
的穩定版,它出現在最醒目的位置。

Kernel.org的主頁面
核心原始碼使用 tar.xz
格式壓縮。我將核心原始碼包放置在 ~/kernel
目錄下,然後使用以下命令解壓縮:
tar -Jxvf linux-4.19.1.tar.xz
安裝依賴
核心的編譯需要用到若干個軟體。在Deepin中,使用 apt
可一次性安裝好:
# 編譯工具 sudo apt install gcc make # 語法解析器生成工具 sudo apt install bison flex # OpenSSL庫 sudo apt install libssl-dev # ncurses庫 sudo apt install libncurses-dev
配置核心準備
載入預設的配置檔案
配置核心的第一步,就是先載入預設的配置檔案以供修改。在核心解壓目錄 linux-4.19
中,執行:
make defconfig
預設的配置檔案就會被寫入核心配置檔案 .config
中。這裡的 .config
位於核心原始碼根目錄,核心編譯過程用到的就是它。
執行結果如下:
anclark@anclark-PC:~/kernel/linux-4.19$ make defconfig HOSTCCscripts/kconfig/conf.o YACCscripts/kconfig/zconf.tab.c LEXscripts/kconfig/zconf.lex.c HOSTCCscripts/kconfig/zconf.tab.o HOSTLDscripts/kconfig/conf *** Default configuration is based on 'x86_64_defconfig' # # configuration written to .config #
開啟menuconfig
接下來的工作就是配置核心了。Linux為我們提供了menuconfig這個配置工具,它基於ncurses與wxDialog開發,可以在其中以圖形化選單的方式配置各種核心選項。
執行以下命令,即可自動編譯並啟動menuconfig:
make menuconfig
稍等片刻,終端中就會出現如下畫面:

menuconfig的主介面
menuconfig的操作方法簡單直觀,在介面上部就已經列出了,改變選項值除了按“Y/N/M”三個鍵之外,還可用空格。可以鍵入問號(即 Shift+問號鍵
)來檢視幫助,鍵入斜槓( /
)來檢索設定項。
值得注意的是,一些元件在編譯時可以選擇將其編譯到核心中(顯示為 [*]
和 <*>
)或是編譯為模組(顯示為 [M]
和 <M>
)。編譯到核心中就成為了核心的一部分;而編譯成為模組則會被安裝到指定的目錄中,使用 modprobe
等工具載入。
配置核心
啟用裝置支援
要想讓核心比較完美地支援目標裝置,還需對核心進行一番設定。Linux官方雖然提供了針對PC的通用配置檔案,但該配置檔案僅僅是一個開始,要面向各種各樣複雜的具體平臺,核心的釋出者不可能兼顧所有的裝置。因此,僅僅使用預設的配置檔案是不夠的。
啟用無線網路支援
考慮到不同的裝置使用不同的無線網絡卡,預設配置檔案並沒有啟用無線網絡卡的裝置驅動。為此還需手動開啟。
首先使用 lspci
命令,列出所有安裝在PCI總線上的裝置,檢視網絡卡型號:
anclark@anclark-PC:~/kernel/linux-4.19$ lspci 00:00.0 Host bridge: Intel Corporation Mobile 4 Series Chipset Memory Controller Hub (rev 07) 00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07) 00:02.1 Display controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07) 00:03.0 Communication controller: Intel Corporation Mobile 4 Series Chipset MEI Controller (rev 07) 00:03.3 Serial controller: Intel Corporation Mobile 4 Series Chipset AMT SOL Redirection (rev 07) 00:19.0 Ethernet controller: Intel Corporation 82567LM Gigabit Network Connection (rev 03) 00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 03) 00:1a.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 03) 00:1a.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 03) 00:1a.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 03) 00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03) 00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 03) 00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 2 (rev 03) 00:1c.2 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 3 (rev 03) 00:1c.3 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 4 (rev 03) 00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03) 00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03) 00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03) 00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03) 00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 93) 00:1f.0 ISA bridge: Intel Corporation ICH9M-E LPC Interface Controller (rev 03) 00:1f.2 SATA controller: Intel Corporation 82801IBM/IEM (ICH9M/ICH9M-E) 4 port SATA Controller [AHCI mode] (rev 03) 00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 03) 03:00.0 Network controller: Intel Corporation PRO/Wireless 5100 AGN [Shiloh] Network Connection 04:00.0 Memory controller: Intel Corporation Turbo Memory Controller (rev 11)
在列出的裝置中,無線網絡卡對應的是 03:00.0 Network controller: Intel Corporation PRO/Wireless 5100 AGN [Shiloh] Network Connection
,從中不難得知,我X200無線網絡卡的型號是Intel 5100AGN。
然後在menuconfig中,依次進入以下選項:
- Device Drivers
- Network device support
- Wireless LAN
- Network device support
其中提供了很多裝置的驅動選項。先找到自己無線網絡卡的品牌,然後找到無線網絡卡型號所對應的專案,按空格鍵選擇“ M
”編譯為模組。當然,如果確定驅動程式沒有問題,也可以選擇“ *
”編譯為核心的一部分,不過這樣就不能使用 modprobe
工具手工裝載解除安裝以便除錯了。
以筆者的Intel 5100AGN為例。首先找到Intel所對應的專案,如下圖所示。特別的是,筆者的5100AGN對應的驅動專案是 iwlwifi
,即列表中的 Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)
。 這一點從該項的幫助資訊中可以知悉——遇到無法確認的專案,不妨檢視它的幫助資訊,以瞭解它支援什麼型號。

無線網絡卡驅動列表中的Intel相關選項,高亮的那一項是筆者無線網絡卡需要用到的

“iwlwifi”專案所對應的網絡卡型號。看來英特爾把這些新推出的網絡卡型號都整合成一個驅動了。
同時,英特爾無線網絡卡的工作還需要韌體(firmware)的支援,因此下面的兩項關於韌體的專案也選擇上。
注意事項
在筆者的X200上,如果此處英特爾無線網絡卡的驅動型號同時選擇多個,會有不能載入韌體的情況出現,不能載入韌體就意味著不能啟動無線網絡卡。即便將 韌體下載站 中正確的韌體放置到指定位置( /lib/firmware/
),也無法啟動網絡卡。因此,只能選擇 iwlwifi
。
啟用音效卡支援
同樣預設地,預設配置檔案並未啟用音效卡支援,因此用編譯出來的核心啟動系統,是沒有聲音的。Linux核心使用ALSA作為音訊框架,音效卡驅動作為編解碼器(codec)被載入,需要我們手動把音效卡的codec選項開啟,才可在Deepin中聽到聲音。
在menuconfig中,依次進入以下選項:
- Device Drivers
- Sound card support
- Advanced Linux Sound Architecture
- Sound card support

音效卡驅動選項
其中又包括若干個關於音效卡驅動的子選單,包括Generic sound devices(標準音頻裝置)、PCI sound devices(PCI音訊裝置)、HD-Audio、USB sound devices(USB音訊裝置)和PCMCIA sound devices。現在新的筆記本和桌上型電腦音效卡基本上都使用HD Audio控制器,包括筆者的X200,因此選擇HD-Audio。

HD-Audio 的相關選項,其中包括了各個品牌的音效卡編解碼器
特別的是,在Linux中,HD Audio音訊的實現由晶片組廠商(如Intel、AMD、NVIDIA)負責,因此使用 lspci
是看不到音效卡品牌和型號的。不過不用擔心,在HD-Audio這一列表中,一個品牌的所有HDA音效卡都遵循同一套API標準,所以可以以一個選項覆蓋所有型號。而就品牌而言,現在的筆記本多使用Realtek(瑞昱)和Conexant(科勝訊, 已被Synaptics收購 )的音效卡,所以選擇它們對應的兩項即可。另外,如果筆記本附帶HDMI或DisplayPort介面,則還要選上 Build HDMI/DisplayPort HD-audio codec support
,以從這兩種視訊輸出介面中輸出音訊訊號。
至於編譯模式,最好將它們編譯成核心的一部分,因為相較於無線網絡卡,音效卡的折騰要容易不少,電腦音效卡出問題的概率會低得多。
啟用使用者態檔案系統支援
包括Deepin在內的發行版,為了方便使用者使用,以及照顧雙系統使用者的需求,都支援Windows和Mac的檔案系統,如NTFS、exFAT、HFS+。通常對於這些檔案系統的支援,多基於FUSE(Filesystem In UserSpacE,使用者態檔案系統),配合訪問這些檔案系統的驅動層,如ntfs-3g。
值得注意的是,預設情況下,使用者態檔案系統並沒有在預設配置檔案中啟用,必須要手動開啟該功能才行。開啟的方法很簡單,該選項位於menuconfig主頁面的“ File systems
”中,專案名為 FUSE (Filesystem in Userspace) support
,如下圖所示:

FUSE選項在“File systems”二級選單中的位置
務必把它編譯成核心的一部分,而不是模組,以實現Linux對FUSE的無縫支援,這對系統體驗的提升是不可或缺的。
儲存核心配置
核心配置預設儲存在核心原始碼根目錄的 .config
檔案中,核心編譯過程會使用它,因此menuconfig預設也會將修改好的配置檔案儲存在那裡。按左右方向鍵,在底部的按鈕中選擇“Save”,選擇核心配置檔案的儲存位置(預設為 .config
),回車。若要退出,選擇“Exit”即可。

儲存核心配置的提示介面
筆者建議將好不容易編輯好的核心配置匯出,以便下次使用。直接把核心原始碼根目錄的 .config
複製到別處。下次若要使用,直接將匯出的配置檔案覆蓋核心原始碼根目錄的 .config
檔案即可。
編譯核心
配置工作完成後,我們就可以著手開始編譯核心了,同時編譯完成後的核心與模組可以直接安裝到系統中,下次啟動就可以直接使用我們新的核心。
開始編譯
首先確保核心已經配置好——原始碼根目錄有 .config
檔案,然後執行以下命令,開始編譯:
make
如果想提高一下編譯效率,可以加上 -j
引數,多開編譯程序:
make -j8
稍等一段時間,等待編譯完成。完成時, make
會輸出以下資訊:
Kernel: arch/x86/bzImage is ready (#2)
安裝核心模組
核心編譯好之後,可以直接執行 make install
進行安裝。但是經我實測,直接安裝容易出錯,出錯的地方主要位於在核心模組的安裝上。因此,最好先安裝核心模組。
安裝核心模組,只需要一個命令:
sudo make modules_install
執行該命令會呼叫 depmod
工具——配置核心模組的工具。不同版本核心的模組必須分別存放在核心對應的目錄中, depmod
工具可以自動建立新的核心所對應的模組目錄,然後將模組安裝到其中。
安裝核心
安裝核心到系統中,只需要一個命令:
sudo make install
該命令會自動呼叫核心原始碼中的安裝工具,將核心複製到系統中,在Grub選單項中加入新核心所對應的啟動選項,並備份舊版本核心。安裝成功後,下次啟動就會自動使用我們編譯好的新核心了,同時還可以在啟動選單的“高階啟動選項(Advanced boot options)”中選擇舊版本的核心啟動。
安裝標頭檔案
如果你需要做Linux相關的開發,也可以將核心標頭檔案安裝到系統中。只需使用一個命令:
make headers_install
測試新的核心
核心安裝完成後,重啟電腦就會預設使用新核心啟動。為了保證核心無故障執行,我需要對核心進行一番測試。以下是我在我的X200上進行測試的過程。但在實際操作中,由於無前人的經驗,我只能摸著石頭過河,發現一個問題,解決一個問題。以下是我對整個測試過程的總結。
顯示:檢查關蓋花屏問題是否解決
很簡單,關閉蓋子重新開啟,移動滑鼠,以及休眠後喚醒,移動滑鼠。可以發現,花屏問題完美解決,原先閃屏撕裂的狀況不再出現,終於可以愉快地吃上Deepin了。
無線網絡卡:檢查連線性
老款的ThinkPad有一個很貼心的設計——燈條,這是我當時選擇它的原因。燈條上電源、硬碟、網絡卡、藍芽工作的狀態一應俱全,方便而直觀,貼心程度至今難以被後來者超越。尤其是無線網絡卡,會在啟動後亮起,並在有網路流量時閃爍。
無線網絡卡未載入時,Deepin系統的狀態列中並不會出現無線網路的圖示,同時X200的無線網絡卡燈不會亮起。這使我非常納悶,畢竟測試的時候我曾經嘗試同時啟用過多個型號的驅動。
後來我嘗試分析核心日誌,使用 dmesg | grep iwl
獲取Intel無線網絡卡相關的日誌資訊,結果發現了下面的錯誤提示:
Direct firmware load for iwlwifi-5000-5.ucode failed with error -2 Direct firmware load for iwlwifi-5000-4.ucode failed with error -2 Direct firmware load for iwlwifi-5000-3.ucode failed with error -2 Direct firmware load for iwlwifi-5000-2.ucode failed with error -2 Direct firmware load for iwlwifi-5000-1.ucode failed with error -2 No suitable firmware found!
後來,我嘗試在 Intel韌體釋出頁面 中下載了與我無線網絡卡對應的上述韌體檔案,放置於 /lib/firmware
中,結果重啟後還是會提示上述的錯誤。
於是,我回到menuconfig中,得知對應我裝置的Intel驅動選項其實是 iwlwifi
,而不是列表中其他的那些型號。果然,取消勾選其他型號,只保留 iwlwifi
,重新編譯並安裝核心,問題解決,久違的無線網絡卡指示燈終於歡快地亮起了。
測試音效卡
測試音效卡的過程相對要順利一些,也更簡單。起初電腦放不出聲音,在Deepin設定中的“聲音”→“高階設定”中裝置列表是空的。然後在核心中開啟音效卡驅動相關的選項,重新編譯之後,聲音播放就正常了。
Chrome開啟網易雲音樂,隨便放首歌,是最直觀的測試方法。
測試檔案系統
筆者將X200原裝的硬碟拆下來改為行動硬碟,並給筆記本換上固態,把原裝硬碟格式化為exFAT。在啟用FUSE之前,插上原裝硬碟,Deepin雖然能識別出來,卻無法掛載,顯示為空。後來啟用FUSE後,果然能正常識別並自動掛載了,工作列上也出現了安全彈出的圖示。
測試USB
筆者的另一臺新的惠普筆記本,在Ubuntu 16.04上曾使用4.18版本的stable核心原始碼,結果USB無法使用。有鑑於此,我在X200上還需對USB功能單獨測試。使用 lsusb
命令檢查USB裝置連線,果然有輸出;然後插入滑鼠、鍵盤、行動硬碟等USB裝置,果然正常識別出來了。由此說明,4.19核心在X200上的USB功能不存在問題。
總結
和Windows不同,玩Linux的意義在於折騰。驅動問題上,Windows的解決是最為到位和全面的,只需下載驅動安裝檔案安裝即可,並且廠商也會優先支援Windows;而Linux上必須好好折騰一番,就像我這樣不停地編輯配置編譯核心,才能用上順手好用的系統。Linux雖說麻煩一些,可是折騰之後裝置跑起來的成就感,卻是難以比擬的。
與此同時,筆者也意識到, 很多問題的解決,還是要靠自己。 對於Deepin官方核心在X200上顯示的Bug,筆者曾在Deepin論壇和反饋平臺中反饋,但幾乎沒人有有效的回覆,終究還是靠我自己解決。而且我稍微檢索了一下百度,結果沒找到任何前人的經驗,找到的只是問題最基本的排查方法而已。要是等著別人為我想辦法,那難度可堪比登天了。 自己動手,豐衣足食,正是硬道理!