<samp id="0l9hf"></samp>
<td id="0l9hf"><option id="0l9hf"></option></td>

  • 24.1 編譯前的任務:認識核心與取得核心源代碼

    我們在第一章里面就談過 Linux 其實指的是核心!這個“核心 (kernel)”是整個操作系統的最底層,他負責了整個硬件的驅動,以及提供各種系統所需的核心功能,包括防火墻機制、是否支持 LVM 或 Quota 等文件系統等等,這些都是核心所負責的!所以啰,在第十九章的開機流程中,我們也會看到 MBR 內的 loader 載入核心文件來驅動整個系統的硬件呢! 也就是說,如果你的核心不認識某個最新的硬件,那么該硬件也就無法被驅動,你當然也就無法使用該硬件啰!

    24.1.1 什么是核心 (Kernel)

    這已經是整個 Linux 基礎的最后一篇了,所以,下面這些數據你應該都要“很有概念”才行~ 不能只是“好像有印象”~好了,那就復習一下核心的相關知識吧!

    • Kernel

    還記得我們在第十章的 BASH shell 提到過:計算機真正在工作的東西其實是“硬件”, 例如數值運算要使用到 CPU、數據儲存要使用到硬盤、圖形顯示會用到顯卡、音樂發聲要有音效芯片、連接 Internet 可能需要網卡等等。那么如何控制這些硬件呢?那就是核心的工作了!也就是說,你所希望計算機幫你達成的各項工作, 都需要通過“核心”的幫助才行!當然啰,如果你想要達成的工作是核心所沒有提供的, 那么你自然就沒有辦法通過核心來控制計算機使他工作啰!

    舉例來說,如果你想要有某個網絡功能 (例如核心防火墻機制) ,但是你的核心偏偏忘記加進去這項功能, 那么不論你如何“賣力”的設置該網絡套件,很抱歉!不來電!換句話說,你想要讓計算機進行的工作,都必須要“核心有支持”才可以!這個標準不論在 Windows 或 Linux 這幾個操作系統上都相同!如果有一個人開發出來一個“全新的硬件”,目前的核心不論 Windows 或 Linux 都不支持,那么不論你用什么系統,哈哈!這個硬件都是英雄無用武之地啦! 那么是否了解了“核心”的重要了呢?所以我們才需要來了解一下如何編譯我們的核心啦!

    那么核心到底是什么???其實核心就是系統上面的一個文件而已, 這個文件包含了驅動主機各項硬件的偵測程序與驅動模塊。在第十九章的開機流程分析中,我們也提到這個文件被讀入內存的時機, 當系統讀完 BIOS 并載入 MBR 內的開機管理程序后,就能夠載入核心到內存當中。然后核心開始偵測硬件, 掛載根目錄并取得核心模塊來驅動所有的硬件,之后調用 systemd 就能夠依序啟動所有系統所需要的服務了!

    這個核心文件通常被放置成 /boot/vmlinuz-xxx ,不過也不見得, 因為一部主機上面可以擁有多個核心文件,只是開機的時候僅能選擇一個來載入而已。 甚至我們也可以在一個 distribution 上面放置多個核心,然后以這些核心來做成多重開機呢!

    • 核心模塊 (kernel module) 的用途

    既然核心文件都已經包含了硬件偵測與驅動模塊,那么什么是核心模塊???要注意的是, 現在的硬件更新速度太快了,如果我的核心比較舊,但我換了新的硬件,那么,這個核心肯定無法支持! 怎么辦?重新拿一個新的核心來處理嗎?開玩笑~核心的編譯過程可是很麻煩的~

    所以啰,為了這個緣故,我們的 Linux 很早之前就已經開始使用所謂的模塊化設置了! 亦即是將一些不常用的類似驅動程序的咚咚獨立出核心,編譯成為模塊,然后, 核心可以在系統正常運行的過程當中載入這個模塊到核心的支持。如此一來, 我在不需要更動核心的前提之下,只要編譯出適當的核心模塊,并且載入他,呵呵!我的 Linux 就可以使用這個硬件啦!簡單又方便!

    那我的模塊放在哪里???可惡!怎么會問這個傻問題呢?當然一定要知道的啦!就是 /lib/modules/$(uname -r)/kernel/ 當中啦!

    • 自制核心 – 核心編譯

    剛剛上面談到的核心其實是一個文件,那么這個文件怎么來的?當然是通過源代碼 (source code) 編譯而成的??!因為核心是直接被讀入到內存當中的,所以當然要將他編譯成為系統可以認識的數據才行!也就是說, 我們必須要取得核心的源代碼,然后利用第二十一章 Tarball 安裝方式提到的編譯概念來達成核心的編譯才行?。。ㄟ@也是本章的重點??! ^_^)

    • 關于驅動程序 – 是廠商的責任還是核心的責任?

    現在我們知道硬件的驅動程序可以編譯成為核心模塊,所以可以在不改變核心的前提下驅動你的新硬件。 但是,很多朋友還是常常感到困惑,就是 Linux 上面針對最新硬件的驅動程序總是慢了幾個腳步, 所以覺得好像 Linux 的支持度不足!其實不可以這么說的,為什么呢?因為在 Windows 上面,對于最新硬件的驅動程序需求,基本上,也都是廠商提供的驅動程序才能讓該硬件工作的, 因此,在這個“驅動程序開發”的工作上面來說,應該是屬于硬件發展廠商的問題, 因為他要我們買他的硬件,自然就要提供消費者能夠使用的驅動程序啦!

    所以,如果大家想要讓某個硬件能夠在 Linux 上面跑的話,那么似乎可以發起一人一信的方式,強烈要求硬件開發商發展 Linux 上面的驅動程序!這樣一來,也可以促進 Linux 的發展呢!

    24.1.2 更新核心的目的

    除了 BIOS (或 UEFI) 之外,核心是操作系統中最早被載入到內存的咚咚, 他包含了所有可以讓硬件與軟件工作的信息,所以,如果沒有搞定核心的話, 那么你的系統肯定會有點小問題!好了,那么是不是將“所有目前核心有支持的東西都給他編譯進去我的核心中, 那就可以支持目前所有的硬件與可執行的工作啦!”!

    這話說的是沒錯啦,但是你是否曾經看過一個為了怕自己今天出門會口渴、會餓、會冷、會熱、會被車撞、 會摔跤、會被性騷擾,而在自己的大包包里面放了大瓶礦泉水、便當、厚外套、短褲、防撞鋼梁、止滑埝、 電擊棒….等一大堆東西,結果卻累死在半路上的案例嗎?當然有!但是很少啦!我相信不太有人會這樣做! (會這么做的人通常都已經在醫院了~) 取而代之的是會看一下天氣,冷了就只帶外套, 熱了就只帶短衣、如果穿的漂亮一點又預計晚點回家就多帶個電擊棒、 出遠門到沒有便利商店的地方才多帶礦泉水….

    說這個干什么!對啦!就是要你了解到,核心的編譯重點在于“你要你的 Linux 作什么?”,是啦!如果沒有必要的工作,就干脆不要加在你的核心當中了!這樣才能讓你的 Linux 跑得更穩、更順暢!這也是為什么我們要編譯核心的最主要原因了!

    • Linux 核心特色,與默認核心對終端用戶的角色

    Linux 的核心有幾個主要的特色,除了“Kernel 可以隨時、隨各人喜好而更動”之外,Kernel 的“版本更動次數太頻繁”也是一個特點!所以啰,除非你有特殊需求, 否則一次編譯成功就可以啦!不需要隨時保持最新的核心版本,而且也沒有必要 (編譯一次核心要粉久的ㄋㄟ?。?。

    那么是否“我就一定需要在安裝好了 Linux 之后就趕緊給他編譯核心呢?”, 老實說,“并不需要的”!這是因為幾乎每一個 distribution 都已經默認編譯好了相當大量的模塊了, 所以使用者常?;蛘呖赡軙褂玫降臄祿家呀洷痪幾g成為模塊,也因此,呵呵! 我們使用者確實不太需要重新來編譯核心!尤其是“一般的使用者, 由于系統已經將核心編譯的相當的適合一般使用者使用了,因此一般入門的使用者,基本上, 不太需要編譯核心”。

    • 核心編譯的可能目的

    OK!那么鳥哥閑閑沒事干跑來寫個什么東西?既然都不需要編譯核心還寫編譯核心的分享文章, 鳥哥賣弄才學呀?很抱歉,鳥哥雖然是個“不學有術”的混混,卻也不會平白無故的寫東西請您來指教~ 當然是有需要才會來編譯核心啦!編譯核心的時機可以歸納為幾大類:

    • 新功能的需求: 我需要新的功能,而這個功能只有在新的核心里面才有,那么為了獲得這個功能,只好來重新編譯我的核心了。例如 iptables 這個防火墻機制只有在 2.4.xx 以后的版本里面才有,而新開發的主板芯片組, 很多也需要新的核心推出之后,才能正常而且有效率的工作!
    • 原本核心太過臃腫: 如果你是那種對于系統“穩定性”很要求的人,對于核心多編譯了很多莫名其妙的功能而不太喜歡的時候, 那么就可以重新編譯核心來取消掉該功能啰;
    • 與硬件搭配的穩定性: 由于原本 Linux 核心大多是針對 Intel 的 CPU 來作開發的,所以如果你的 CPU 是 AMD 的系統時,有可能 (注意!只是有可能,不見得一定會如此) 會讓系統跑得“不太穩!”。此外,核心也可能沒有正確的驅動新的硬件,此時就得重新編譯核心來讓系統取得正確的模塊才好。
    • 其他需求 (如嵌入式系統): 就是你需要特殊的環境需求時,就得自行設計你的核心啰?。?像是一些商業的套裝軟件系統,由于需要較為小而美的操作系統, 那么他們的核心就需要更簡潔有力了?。?/li>

    Tips 話說,2014 年鳥哥為了要搞定 banana pi (一種單版計算機,或者可以稱為手機的硬件拿來作 Linux 安裝的硬件) 的 CPU 最高頻率限制, 因為該限制是直接寫入到 Linux 核心當中的,這時就只好針對該硬件的 Linux 核心,修改不到 10 行的程序碼之后,重新編譯! 才能將原本限制到 900MHz 的頻率提升到 1.2GHz 哩!

    另外,需要注意重新編譯核心雖然可以針對你的硬件作最優化的步驟 (例如剛剛提到的 CPU 的問題?。?,不過由于這些最優化的步驟對于整體性能的影響是很小很小的, 因此如果是為了增加性能來編譯核心的話,基本上,效益不大!然而,如果是針對“系統穩定性”來考慮的話, 那么就有充分的理由來支持你重新編譯核心啰!

    “如果系統已經運行很久了,而且也沒有什么大問題, 加上我又不增加冷門的硬件設備,那么建議就不需要重新編譯核心了”, 因為重新編譯核心的最主要目的是“想讓系統變的更穩!”既然你的 Linux 主機已經達到這個目的了,何必再編譯核心?不過,就如同前面提到的, 由于默認的核心不見得適合你的需要,加上默認的核心可能并無法與你的硬件配備相配合, 此時才開始考慮重新編譯核心吧!

    Tips 早期鳥哥是強調最好重新編譯核心的一群啦!不過,這個想法改變好久了~ 既然原本的 distribution 都已經幫我們考慮好如何使用核心了,那么, 我們也不需要再重新的編譯核心啦!尤其是 distribution 都會主動的釋出新版的核心 RPM 版本, 所以,實在不需要自己重新編譯的!當然啦,如同前面提到的,如果你有特殊需求的話,那就另當別論嚕! ^_^

    由于“核心的主要工作是在控制硬件!”所以編譯核心之前, 請先了解一下你的硬件配備,與你這部主機的未來功能!由于核心是“越簡單越好!”所以只要將這部主機的未來功能給他編進去就好了! 其他的就不用去理他啦!

    24.1.3 核心的版本

    核心的版本問題,我們在第一章已經談論過, 目前 CentOS 7 使用的 3.10.x 版本為長期維護版本,不過理論上我們也可以升級到后續的主線版本上面!不會像以前 2.6.x 只能升級到 2.6.x 的后續版本, 而不能改成其他主線版本。不過這也只是“理論上”而已,因為目前許多的軟件依舊與核心版本有關,例如那個虛擬化軟件 qemu 之類的, 與核心版本之間是有搭配性的關系的,所以,除非你要一口氣連同核心相依的軟件通通升級,否則最好使用長期維護版本的最新版來處理較佳。

    舉例來說,CentOS 7 使用的是 3.10.0 這個長期版本,而目前 (2015/09) 這個 3.10 長期版本,最新的版本為 3.10.89,意思是說, 你最好是拿 3.10.89 來作為核心升級的依據,而不是拿最新的 4.2.1 來升級的意思。

    雖然理論上還是拿自家長期維護版本的最新版本來處理比較好,不過鳥哥因為需要研究虛擬化的 PCI passthrough 技術, 確實也曾經在 CentOS 7.1 的系統中將 3.10.x 的版本升級到 4.2.3 這個版本上!這樣才完成了 VGA 的 PCI passthrough 功能! 所以說,如果你真的想要使用較新的版本來升級,也不是不可以,只是后果會發生什么問題,就得要自行負責啰!

    24.1.4 核心源代碼的取得方式

    既然核心是個文件,要制作這個文件給系統使用則需要編譯,既然要有編譯,當然就得要有源代碼??! 那么源代碼怎么來?基本上,依據你的 distributions 去挑選的核心源代碼來源主要有:

    • 原本 distribution 提供的核心源代碼文件

    事實上,各主要 distributions 在推出他們的產品時,其實已經都附上了核心源代碼了! 不過因為目前數據量太龐大,因此 SRPM 默認已經不給映射站下載了!主要的源代碼都放置于下面的網站上:

    • 全部的 CentOS 原始 SRPM:http://vault.centos.org/
    • CentOS 7.1 的 SRPM:http://vault.centos.org/7.1.1503/

    CentOS 7.x 開始的版本中,其版本后面會接上釋出的日期,因為 CentOS 7.1 是 2015/03 釋出的,因此它的下載點就會是在 7.1.1503 啰!1503 指的就是 2015/03 的意思~ 你可以進入上述的網站后,到 updates 目錄下,一層一層的往下找,就可以找到 kernel 相關的 SRPM 啰!

    你或許會說:既然要重新編譯,那么干嘛還要使用原本 distributions 釋出的源代碼???真沒創意~ 話不是這么說,因為原本的 distribution 釋出的源代碼當中,含有他們設置好的默認設置值, 所以,我們可以輕易的就了解到當初他們是如何選擇與核心及模塊有關的各項設置項目的參數值, 那么就可以利用這些可以配合我們 Linux 系統的默認參數來加以修改,如此一來, 我們就可以“修改核心,調整到自己喜歡的樣子”啰!而且編譯的難度也會比較低一點!

    • 取得最新的穩定版核心源代碼

    雖然使用 distribution 釋出的核心 source code 來重新編譯比較方便,但是,如此一來, 新硬件所需要的新驅動程序,也就無法借由原本的核心源代碼來編譯??! 所以啰,如果是站在要更新驅動程序的立場來看,當然使用最新的核心可能會比較好??!

    Linux 的核心目前是由其發明者 Linus Torvalds 所屬團隊在負責維護的,而其網站在下面的站址上,在該網站上可以找到最新的 kernel 信息!不過,美中不足的是目前的核心越來越大了 (linux-3.10.89.tar.gz 這一版,這一個文件大約 105MB 了?。?,所以如果你的 ISP 連外很慢的話,那么使用臺灣的映射站臺來下載不失為一個好方法:

    • 核心官網:http://www.kernel.org/
    • 交大資科:ftp://linux.cis.nctu.edu.tw/kernel/linux/kernel/
    • 國高中心:ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/
    • 保留原本設置:利用 patch 升級核心源代碼

    如果 (1)你曾經自行編譯過核心,那么你的系統當中應該已經存在前幾個版本的核心源代碼, 以及上次你自行編譯的參數設置值才對; (2)如果你只是想要在原本的核心下面加入某些特殊功能, 而該功能已經針對核心源代碼推出 patch 補丁文件時。那你該如何進行核心源代碼的更新,以便后續的編譯呢?

    其實每一次核心釋出時,除了釋出完整的核心壓縮文件之外,也會釋出“該版本與前一版本的差異性 patch 文件”, 關于 patch 的制作我們已經在第二十一章當中提及, 你可以自行前往參考。這里僅是要提供給你的信息是,每個核心的 patch 僅有針對前一版的核心來分析而已, 所以,萬一你想要由 3.10.85 升級到 3.10.89 的話,那么你就得要下載 patch-3.10.86, patch-3.10.87, patch-3.10.88, patch-3.10.89 等文件,然后“依序”一個一個的去進行 patch 的動作后, 才能夠升級到 3.10.89 喔!這個重要!不要忘記了。

    同樣的,如果是某個硬件或某些非官方認定的核心添加功能網站所推出的 patch 文件時,你也必須要了解該 patch 文件所適用的核心版本,然后才能夠進行 patch ,否則容易出現重大錯誤喔!這個項目對于某些商業公司的工程師來說是很重要的。 舉例來說,鳥哥的一個高中同學在業界服務,他主要是進行類似 Eee PC 開發的計劃,然而該計劃的硬件是該公司自行推出的! 因此,該公司必須要自行搭配核心版本來設計他們自己的驅動程序,而該驅動程序并非 GPL 授權,因此他們就得要自行將驅動程序整合進核心!如果改天他們要將這個驅動程序釋出,那么就得要利用 patch 的方式, 將硬件驅動程序文件釋出,我們就得要自行以 patch 來更新核心啦!

    在進行完 patch 之后,你可以直接檢查一下原本的設置值,如果沒有問題, 就可以直接編譯,而不需要再重新的選擇核心的參數值,這也是一個省時間的方法??! 至于 patch file 的下載,同樣是在 kernel 的相同目錄下,尋找文件名是 patch 開頭的就是了。

    24.1.5 核心源代碼的解壓縮/安裝/觀察

    其實,不論是從 CentOS 官網取得的 SRPM 或者是從 Linux kernel 官網取得的 tarball 核心源代碼,最終都會有一個 tarball 的核心源代碼就是了! 因此,鳥哥從 linux kernel 官網取得 linux-3.10.89.tar.xz 這個核心文件,這個核心文件的源代碼是從下面的網址取得的:

    • ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v3.x/linux-3.10.89.tar.xz
    • 核心源代碼的解壓縮與放置目錄

    鳥哥這里假設你也是下載上述的鏈接內的文件,然后該文件放置到 /root 下面。由于 Linux 核心源代碼一般建議放置于 /usr/src/kernels/ 目錄下面,因此你可以這樣處理:

    [root@study ~]# tar -Jxvf linux-3.10.89.tar.xz -C /usr/src/kernels/

    此時會在 /usr/src/kernels 下面產生一個新的目錄,那就是 linux-3.10.89 這個目錄啰! 我們在下個小節會談到的各項編譯與設置,都必須要在這個目錄下面進行才行喔!好了,那么這個目錄下面的相關文件有啥咚咚? 下面就來談談:

    • 核心源代碼下的次目錄

    在上述核心目錄下含有哪些重要數據呢?基本上有下面這些東西:

    • arch :與硬件平臺有關的項目,大部分指的是 CPU 的類別,例如 x86, x86_64, Xen 虛擬支持等;
    • block :與區塊設備較相關的設置數據,區塊數據通常指的是大量儲存媒體!還包括類似 ext3 等文件系統的支持是否允許等。
    • crypto :核心所支持的加密的技術,例如 md5 或者是 des 等等;
    • Documentation :與核心有關的一堆說明文檔,若對核心有極大的興趣,要瞧瞧這里!
    • drivers :一些硬件的驅動程序,例如顯卡、網卡、PCI 相關硬件等等;
    • firmware :一些舊式硬件的微指令碼 (固件) 數據;
    • fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;
    • include :一些可讓其他程序調用的標頭 (header) 定義數據;
    • init :一些核心初始化的定義功能,包括掛載與 init 程序的調用等;
    • ipc :定義 Linux 操作系統內各程序的溝通;
    • kernel :定義核心的程序、核心狀態、線程、程序的調度 (schedule)、程序的訊號 (signle) 等
    • lib :一些函數庫;
    • mm :與內存單元有關的各項數據,包括 swap 與虛擬內存等;
    • net :與網絡有關的各項協定數據,還有防火墻模塊 (net/ipv4/netfilter/*) 等等;
    • security :包括 selinux 等在內的安全性設置;
    • sound :與音效有關的各項模塊;
    • virt :與虛擬化機器有關的信息,目前核心支持的是 KVM (Kernel base Virtual Machine)

    這些數據先大致有個印象即可,至少未來如果你想要使用 patch 的方法加入額外的新功能時, 你要將你的源代碼放置于何處?這里就能夠提供一些指引了。當然,最好還是跑到 Documentation 那個目錄下面去瞧瞧正確的說明, 對你的核心編譯會更有幫助喔!

    鄭重聲明:

    1 本資源來源于互聯網,資源的版權歸資源原作者所持有,受《中華人民共和國著作權法》等相關法律保護。

    2 由于無法和原作者取得聯系,所以上傳的部分資源無法先通過原作者的同意就分享給大家了,如本資源侵犯了您(原作者)的權益,請聯系我們(微信號 wenyan90s),我們會立馬刪除您的資源,并向您表達誠摯的歉意!

    3 本站是一個公益型網站,分享資源的目的在于傳播知識,分享知識,收取一點點打賞的辛苦費是用于網站的日常運營開支,并非用于商業用途。

    4 本站資源只提供學習和參考研究使用,使用過后請在第一時間內刪除。本站不承擔資源被單位或個人商用帶來的法律責任。

    發表評論

    電子郵件地址不會被公開。

    Captcha Code

    国产精品午夜福利在线观看,av色片在线观看,男生看的黄色网站在线,黄片a片视频黄色
    <samp id="0l9hf"></samp>
    <td id="0l9hf"><option id="0l9hf"></option></td>