學習 Linux 裝置驅動如何工作,並知道如何使用它們。
對於一個熟悉 Windows 或者 MacOS 的人,想要切換到 Linux,它們都會面臨一個艱巨的問題就是怎麼安裝和設定裝置驅動。這是可以理解的,因為 Windows 和 MacOS 都有一套機制把這個過程做得非常的友好。比如說,當你插入一個新的硬體裝置, Windows 能夠自動檢測並會彈出一個視窗詢問你是否要繼續驅動程式的安裝。你也可以從網路上下載驅動程式,僅僅需要雙擊解壓或者是通過裝置管理器匯入驅動程式即可。
而這在 Linux 作業系統上並非這麼簡單。第一個原因是, Linux 是一個開源的作業系統,所以有 數百種 Linux 發行版的變體。也就是說不可能做一個指南來適應所有的 Linux 發行版。因為每種 Linux 安裝驅動程式的過程都有差異。
第二,大多數預設的 Linux 驅動程式也都是開源的,並被整合到了系統中,這使得安裝一些並未包含的驅動程式變得非常複雜,即使已經可以檢測大多數的硬體裝置。第三,不同發行版的許可也有差異。例如,Fedora 禁止事項 禁止包含專有的、受法律保護,或者是違反美國法律的驅動程式。而 Ubuntu 則讓使用者避免使用受法律保護或閉源的硬體裝置。
為了更好的學習 Linux 驅動程式是如何工作的,我建議閱讀 《Linux 裝置驅動程式》一書中的 裝置驅動程式簡介。
如果是一個剛從 Windows 或 MacOS 轉過來的 Linux 新手,那你會很高興知道 Linux 也提供了一個通過嚮導式的程式來檢視驅動程式是否可用的方法。 Ubuntu 提供了一個 附加驅動程式 選項。其它的 Linux 發行版也提供了幫助程式,像 GNOME 的包管理器,你可以使用它來檢查驅動程式是否可用。
如果你通過漂亮的使用者介面沒有找到驅動程式,那又該怎麼辦呢?或許你只能通過沒有任何圖形介面的 shell?甚至你可以使用控制台來展現你的技能。你有兩個選擇:
通過一個倉庫
這和 MacOS 中的 homebrew 命令列很像。通過使用 yum
、 dnf
、apt-get
等等。你基本可以通過新增倉庫,並更新包快取。
下載、編譯,然後自己構建
這通常包括直接從網路,或通過 wget
命令下載原始碼包,然後執行設定和編譯、安裝。這超出了本文的範圍,但是你可以在網路上找到很多線上指南,如果你選擇的是這條路的話。
在進一步學習安裝 Linux 驅動程式之前,讓我們來學習幾條命令,用來檢測驅動程式是否已經在你的系統上可用。
lspci 命令顯示了系統上所有 PCI 匯流排和裝置驅動程式的詳細資訊。
$ lscpci
或者使用 grep
:
$ lscpci | grep SOME_DRIVER_KEYWORD
例如,你可以使用 lspci | grep SAMSUNG
命令,如果你想知道是否安裝過三星的驅動。
dmesg 命令顯示了所有核心識別的驅動程式。
$ dmesg
或配合 grep
使用:
$ dmesg | grep SOME_DRIVER_KEYWORD
任何識別到的驅動程式都會顯示在結果中。
如果通過 dmesg
或者 lscpi
命令沒有識別到任何驅動程式,嘗試下這兩個命令,看看驅動程式至少是否載入到硬碟。
$ /sbin/lsmod
和
$ find /lib/modules
技巧:和 lspci
或 dmesg
一樣,通過在上面的命令後面加上 | grep
來過濾結果。
如果一個驅動程式已經被識別到了,但是通過 lscpi
或 dmesg
並沒有找到,這意味著驅動程式已經存在於硬碟上,但是並沒有載入到核心中,這種情況,你可以通過 modprobe
命令來載入這個模組。
$ sudo modprobe MODULE_NAME
使用 sudo
來執行這個命令,因為這個模組要使用 root 許可權來安裝。
可以通過 yum
、dnf
和 apt-get
幾種不同的方式來新增一個倉庫;一個個介紹完它們並不在本文的範圍。簡單一點來說,這個範例將會使用 apt-get
,但是這個命令和其它的幾個都是很類似的。
$ sudo apt-get purge NAME_OF_DRIVER*
其中 NAME_OF_DRIVER
是你的驅動程式的可能的名稱。你還可以將模式匹配加到正規表示式中來進一步過濾。
$ sudo add-apt-repository REPOLIST_OF_DRIVER
其中 REPOLIST_OF_DRIVER
應該從驅動文件中有指定(例如:epel-list
)。
$ sudo apt-get update
$ sudo apt-get install NAME_OF_DRIVER
像上面說的一樣,通過 lscpi
命令來檢查驅動程式是否已經安裝成功。