如何編譯Linux內(nèi)核

這篇文章給大家分享的是有關(guān)如何編譯Linux內(nèi)核的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

鐵山港網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)自2013年起到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

在計算機世界里,內(nèi)核kernel是處理硬件與一般系統(tǒng)之間通信的低階軟件low-level software。除過一些燒錄進計算機主板的初始固件,當(dāng)你啟動計算機時,內(nèi)核讓系統(tǒng)意識到它有一個硬盤驅(qū)動器、屏幕、鍵盤以及網(wǎng)卡。分配給每個部件相等時間(或多或少)使得圖像、音頻、文件系統(tǒng)和網(wǎng)絡(luò)可以流暢甚至并行地運行。

然而,對于硬件的需求是源源不斷的,隨著發(fā)布的硬件越多,內(nèi)核就必須納入更多代碼來保證那些硬件正常工作。得到具體的數(shù)字很困難,但是 Linux  內(nèi)核無疑是硬件兼容性方面的頂級內(nèi)核之一。Linux 操作著無數(shù)的計算機和移動電話、工業(yè)用途和愛好者使用的板級嵌入式系統(tǒng)(SoC)、RAID  卡、縫紉機等等。

回到 20 世紀(jì)(甚至是 21 世紀(jì)初期),對于 Linux  用戶來說,在剛買到新的硬件后就需要下載最新的內(nèi)核代碼并編譯安裝才能使用這是不可理喻的。而現(xiàn)在你也很難見到 Linux  用戶為了好玩而編譯內(nèi)核或通過高度專業(yè)化定制的硬件的方式賺錢?,F(xiàn)在,通常已經(jīng)不需要再編譯 Linux 內(nèi)核了。

這里列出了一些原因以及快速編譯內(nèi)核的教程。

更新當(dāng)前的內(nèi)核

無論你買了配備新顯卡或 Wifi 芯片集的新品牌電腦還是給家里配備一個新的打印機,你的操作系統(tǒng)(稱為 GNU+Linux 或  Linux,它也是該內(nèi)核的名字)需要一個驅(qū)動程序來打開新部件(顯卡、芯片集、打印機和其他任何東西)的信道。有時候當(dāng)你插入某些新的設(shè)備時而你的電腦表示發(fā)現(xiàn)了它,這具有一定的欺騙性。別被騙到了,有時候那就夠了,但更多的情況是你的操作系統(tǒng)僅僅是使用了通用的協(xié)議檢測到安裝了新的設(shè)備。

例如,你的計算機也許能夠鑒別出新的網(wǎng)絡(luò)打印機,但有時候那僅僅是因為打印機的網(wǎng)卡被設(shè)計成為了獲得 DHCP  地址而在網(wǎng)絡(luò)上標(biāo)識自己。它并不意味著你的計算機知道如何發(fā)送文檔給打印機進行打印。事實上,你可以認(rèn)為計算機甚至不“知道”那臺設(shè)備是一個打印機。它也許僅僅是顯示網(wǎng)絡(luò)有個設(shè)備在一個特定的地址上,并且該設(shè)備以一系列字符  “p-r-i-n-t-e-r” 標(biāo)識自己而已。人類語言的便利性對于計算機毫無意義。計算機需要的是一個驅(qū)動程序。

內(nèi)核開發(fā)者、硬件制造商、技術(shù)支持和愛好者都知道新的硬件會不斷地發(fā)布。它們大多數(shù)都會貢獻(xiàn)驅(qū)動程序,直接提交給內(nèi)核開發(fā)團隊以包含在 Linux 中。例如,英偉達(dá)顯卡驅(qū)動程序通常都會寫入 Nouveau 內(nèi)核模塊中,并且因為英偉達(dá)顯卡很常用,它的代碼都包含在任一個日常使用的發(fā)行版內(nèi)核中(例如當(dāng)下載 Fedora 或 Ubuntu 得到的內(nèi)核)。英偉達(dá)也有不常用的地方,例如嵌入式系統(tǒng)中 Nouveau 模塊通常被移除。對其他設(shè)備來說也有類似的模塊:打印機得益于 Foomatic 和 CUPS,無線網(wǎng)卡有 b43、ath9k、wl 模塊等等。

發(fā)行版往往會在它們 Linux  內(nèi)核的構(gòu)建中包含盡可能多合理的驅(qū)動程序,因為他們想讓你在接入新設(shè)備時不用安裝驅(qū)動程序能夠立即使用。對于大多數(shù)情況來說就是這樣的,尤其是現(xiàn)在很多設(shè)備廠商都在資助自己售賣硬件的  Linux 驅(qū)動程序開發(fā),并且直接將這些驅(qū)動程序提交給內(nèi)核團隊以用在通常的發(fā)行版上。

有時候,或許你正在運行六個月之前安裝的內(nèi)核,并配備了上周剛剛上市令人興奮的新設(shè)備。在這種情況下,你的內(nèi)核也許沒有那款設(shè)備的驅(qū)動程序。好消息是經(jīng)常會出現(xiàn)那款設(shè)備的驅(qū)動程序已經(jīng)存在于最近版本的內(nèi)核中,意味著你只要更新運行的內(nèi)核就可以了。

通常,這些都是通過安裝包管理軟件完成的。例如在 RHEL、CentOS 和 Fedora 上:

$ sudo dnf update kernel

在 Debian 和 Ubuntu 上,首先獲取你當(dāng)前內(nèi)核的版本:

$ uname -r4.4.186

搜索新的版本:

$ sudo apt update$ sudo apt search linux-image

安裝找到的最新版本。在這個例子中,最新的版本是 5.2.4:

$ sudo apt install linux-image-5.2.4

內(nèi)核更新后,你必須 reboot (除非你使用 kpatch 或 kgraft)。這時,如果你需要的設(shè)備驅(qū)動程序包含在最新的內(nèi)核中,你的硬件就會正常工作。

安裝內(nèi)核模塊

有時候一個發(fā)行版沒有預(yù)計到用戶會使用某個設(shè)備(或者該設(shè)備的驅(qū)動程序至少不足以包含在 Linux 內(nèi)核中)。Linux  對于驅(qū)動程序采用模塊化方式,因此盡管驅(qū)動程序沒有編譯進內(nèi)核,但發(fā)行版可以推送單獨的驅(qū)動程序包讓內(nèi)核去加載。盡管有些復(fù)雜但是非常有用,尤其是當(dāng)驅(qū)動程序沒有包含進內(nèi)核中而是在引導(dǎo)過程中加載,或是內(nèi)核中的驅(qū)動程序相比模塊化的驅(qū)動程序過期時。第一個問題可以用  “initrd” 解決(初始化 RAM 磁盤),這一點超出了本文的討論范圍,第二點通過 “kmod” 系統(tǒng)解決。

kmod 系統(tǒng)保證了當(dāng)內(nèi)核更新后,所有與之安裝的模塊化驅(qū)動程序也得到更新。如果你手動安裝一個驅(qū)動程序,你就體驗不到 kmod  提供的自動化,因此只要能用 kmod 安裝包,就應(yīng)該選擇它。例如,盡管英偉達(dá)驅(qū)動程序以 Nouveau  模塊構(gòu)建在內(nèi)核中,但官方的驅(qū)動程序僅由英偉達(dá)發(fā)布。你可以去網(wǎng)站上手動安裝英偉達(dá)旗下的驅(qū)動程序,下載 “.run” 文件,并運行提供的 shell   腳本,但在安裝了新的內(nèi)核之后你必須重復(fù)相同的過程,因為沒有任何東西告訴包管理軟件你手動安裝了一個內(nèi)核驅(qū)動程序。英偉達(dá)驅(qū)動著你的顯卡,手動更新英偉達(dá)驅(qū)動程序通常意味著你需要通過終端來執(zhí)行更新,因為沒有顯卡驅(qū)動程序?qū)o法顯示。

如何編譯Linux內(nèi)核

然而,如果你通過 kmod 包安裝英偉達(dá)驅(qū)動程序,更新你的內(nèi)核也會更新你的英偉達(dá)驅(qū)動程序。在 Fedora 和相關(guān)的發(fā)行版中:

$ sudo dnf install kmod-nvidia

在 Debian 和相關(guān)發(fā)行版上:

$ sudo apt update$ sudo apt install nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver

這僅僅是一個例子,但是如果你真的要安裝英偉達(dá)驅(qū)動程序,你也必須屏蔽掉 Nouveau 驅(qū)動程序。參考你使用發(fā)行版的文檔獲取最佳的步驟吧。

下載并安裝驅(qū)動程序

不是所有的東西都包含在內(nèi)核中,也不是所有的東西都可以作為內(nèi)核模塊使用。在某些情況下,你需要下載一個由供應(yīng)商編寫并綁定好的特殊驅(qū)動程序,還有一些情況,你有驅(qū)動程序,但是沒有配置驅(qū)動程序的前端界面。

有兩個常見的例子是 HP 打印機和 Wacom 數(shù)位板。如果你有一臺 HP 打印機,你可能有能夠和打印機通信的通用的驅(qū)動程序,甚至能夠打印出東西。但是通用的驅(qū)動程序卻不能為特定型號的打印機提供定制化的選項,例如雙面打印、校對、紙盒選擇等等。HPLIP(HP Linux 成像和打印系統(tǒng))提供了選項來進行任務(wù)管理、調(diào)整打印設(shè)置、選擇可用的紙盒等等。

HPLIP 通常包含在包管理軟件中;只要搜索“hplip”就行了。

如何編譯Linux內(nèi)核

同樣的,電子藝術(shù)家主要使用的數(shù)位板 Wacom 的驅(qū)動程序通常也包含在內(nèi)核中,但是例如調(diào)整壓感和按鍵功能等設(shè)置只能通過默認(rèn)包含在 GNOME 的圖形控制面板訪問。但也可以作為 KDE 上額外的程序包“kde-config-tablet”來訪問。

這里也有幾個類似的個別例子,例如內(nèi)核中沒有驅(qū)動程序,但是以 RPM 或 DEB 文件提供了可供下載并且通過包管理軟件安裝的 kmod 版本的驅(qū)動程序。

打上補丁并編譯你的內(nèi)核

即使在 21 世紀(jì)的未來主義烏托邦里,仍有廠商不夠了解開源,沒有提供可安裝的驅(qū)動程序。有時候,一些公司為驅(qū)動程序提供開源代碼,而需要你下載代碼、修補內(nèi)核、編譯并手動安裝。

這種發(fā)布方式和在 kmod 系統(tǒng)之外安裝打包的驅(qū)動程序擁有同樣的缺點:對內(nèi)核的更新會破壞驅(qū)動程序,因為每次更換新的內(nèi)核時都必須手動將其重新集成到內(nèi)核中。

令人高興的是,這種事情變得少見了,因為 Linux 內(nèi)核團隊在呼吁公司們與他們交流方面做得很好,并且公司們最終接受了開源不會很快消失的事實。但仍有新奇的或高度專業(yè)的設(shè)備僅提供了內(nèi)核補丁。

官方上,對于你如何編譯內(nèi)核以使包管理器參與到升級系統(tǒng)如此重要的部分中,發(fā)行版有特定的習(xí)慣。這里有太多的包管理器,所以無法一一涵蓋。舉一個例子,當(dāng)你使用 Fedora 上的工具例如 rpmdevbuild-essential,Debian 上的 devscripts。

首先,像通常那樣,找到你正在運行內(nèi)核的版本:

$ uname -r

在大多數(shù)情況下,如果你還沒有升級過內(nèi)核那么可以試試升級一下內(nèi)核。搞定之后,也許你的問題就會在最新發(fā)布的內(nèi)核中解決。如果你嘗試后發(fā)現(xiàn)不起作用,那么你應(yīng)該下載正在運行內(nèi)核的源碼。大多數(shù)發(fā)行版提供了特定的命令來完成這件事,但是手動操作的話,可以在 kernel.org 上找到它的源代碼。

你必須下載內(nèi)核所需的任何補丁。有時候,這些補丁對應(yīng)具體的內(nèi)核版本,因此請謹(jǐn)慎選擇。

通常,或至少在人們習(xí)慣于編譯內(nèi)核的那時,都是拿到源代碼并對 /usr/src/linux 打上補丁。

解壓內(nèi)核源碼并打上需要的補丁:

$ cd /usr/src/linux$ bzip2 --decompress linux-5.2.4.tar.bz2$ cd  linux-5.2.4$ bzip2 -d ../patch*bz2

補丁文件也許包含如何使用的教程,但通常它們都設(shè)計成在內(nèi)核源碼樹的頂層可用來執(zhí)行。

$ patch -p1 < patch*example.patch

當(dāng)內(nèi)核代碼打上補丁后,你可以繼續(xù)使用舊的配置來對打了補丁的內(nèi)核進行配置。

$ make oldconfig

make oldconfig 命令有兩個作用:它繼承了當(dāng)前的內(nèi)核配置,并且允許你配置補丁帶來的新的選項。

你或許需要運行 make menuconfig 命令,它啟動了一個基于 ncurses  的菜單界面,列出了新的內(nèi)核所有可能的選項。整個菜單可能看不過來,但是它是以舊的內(nèi)核配置為基礎(chǔ)的,你可以遍歷菜單并且禁用掉你沒有或不需要的硬件模塊。另外,如果你知道自己有一些硬件沒有包含在當(dāng)前的配置中,你可以選擇構(gòu)建它,當(dāng)作模塊或者直接嵌入內(nèi)核中。理論上,這些并不是必要的,因為你可以猜想,當(dāng)前的內(nèi)核運行良好只是缺少了補丁,當(dāng)使用補丁的時候可能已經(jīng)激活了所有設(shè)備所必要的選項。

下一步,編譯內(nèi)核和它的模塊:

$ make bzImage$ make modules

這會產(chǎn)生一個叫作 vmlinuz 的文件,它是你的可引導(dǎo)內(nèi)核的壓縮版本。保存舊的版本并在 /boot 文件夾下替換為新的。

$ sudo mv /boot/vmlinuz /boot/vmlinuz.nopatch$ sudo cat arch/x86_64/boot/bzImage > /boot/vmlinuz$ sudo mv /boot/System.map /boot/System.map.stock$ sudo cp System.map /boot/System.map

到目前為止,你已經(jīng)打上了補丁并且編譯了內(nèi)核和它的模塊,你安裝了內(nèi)核,但你并沒有安裝任何模塊。那就是最后的步驟:

$ sudo make modules_install

新的內(nèi)核已經(jīng)就位,并且它的模塊也已經(jīng)安裝。

最后一步是更新你的引導(dǎo)程序,為了讓你的計算機在加載 Linux 內(nèi)核之前知道它的位置。GRUB 引導(dǎo)程序使這一過程變得相當(dāng)簡單:

$ sudo grub2-mkconfig

現(xiàn)實生活中的編譯

當(dāng)然,現(xiàn)在沒有人手動執(zhí)行這些命令。相反的,參考你的發(fā)行版,尋找發(fā)行版維護人員使用的開發(fā)者工具集修改內(nèi)核的說明。這些工具集可能會創(chuàng)建一個集成所有補丁的可安裝軟件包,告訴你的包管理器來升級并更新你的引導(dǎo)程序。

感謝各位的閱讀!關(guān)于“如何編譯Linux內(nèi)核”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

新聞名稱:如何編譯Linux內(nèi)核
本文URL:http://muchs.cn/article20/pgoijo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、軟件開發(fā)、網(wǎng)站內(nèi)鏈、定制開發(fā)、網(wǎng)站排名、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)