什么是內核
內核是 Linux 系統的核心,提供硬件抽象層、磁盤及文件系統控制、多任務并發管理等底層功能的系統部件。
什么是補丁
Linux 內核是由 Kernel 小組 (http://www.kernel.org) 維護的,他們在首頁提供最新穩定版的內核源代碼下載地址。這是原始的純凈內核代碼。
如上所述,出于種種原因,一般要對原始內核進行修改。而修改源代碼的工作是由打補丁實現的,每個內核補丁都實現一個特定的功能。補丁下載的地址比較分散,自行搜索比較有效。
對打上補丁的內核源代碼再行編譯,得到計算機可以使用識別的二進制文件,就是我們日常使用的(成品)內核。
為什么要重新編譯內核
openSUSE 為了提高系統的硬件兼容性和穩定性,對內核源代碼做了眾多修改,編譯時也使用了保守的優化參數。這樣得到的內核體積大,運行速度較慢,但是穩定性和兼容性極好。
一般編譯 openSUSE 內核有以下3條原因:
1.提高內核兼容性或增加功能
盡管 openSUSE 官方打了很多補丁,但是可能依舊不能滿足用戶需要。用戶可能要自行打上特定的補丁或更新內核版本才能支持新硬件或添加對某軟件的支持。
2.系統提速
上面提到官方內核性能上是有所保留的,重新按照自己的硬件配置編譯內核,并使用合適的優化參數是系統提速最有效的方式。
3.心理需求
像文檔作者 Thruth 這種有更新強迫癥的人總是希望使用最新版本的內核,也會重復性的編譯內核。
若升級不成功,如何恢復官方內核
通過安裝光盤啟動到你安裝的 SUSE Linux,開 yast 刷新 kernel 以及相關包
編譯步驟
需求
編譯內核需要安裝必要的編譯用軟件
binutils gcc make module-init-tools udev ......
下載內核源代碼及補丁
哪里獲得內核源碼
對 openSUSE 用戶來說,獲得內核源代碼以及補丁有 5 種途徑,請根據自身需求選擇:
1.使用官方 kernel-source 包
不管是安裝盤里面自帶的還是 YaST -> 軟件 -> 在線更新 得到的 kernel-source 軟件包都是官方提供的打過補丁的內核源代碼。
注意: 此包最好與系統中 kernel-default 包版本一致
優點: 可直接使用,安全穩定,幾乎不會出錯
缺點: 版本不會是最新的,且已經打過補丁,性能提升空間不大
使用說明: 直接安裝使用
2.使用官方 kernel-source 的 src.rpm 包
在官方安裝源或更新源的鏡像網站上總會有 SRC 目錄,包含各種軟件源代碼,在里面可以找到 kernel-source 的 src.rpm。
例: 在 SUSE 10.1 官方更新源的一個鏡像 http://ftp.novell.co.jp/pub/suse/suse/update/10.1/ 下 rpm/src 目錄可以找到文件 kernel-source-2.6.16.21-0.13.src.rpm
注意: 解壓后需要自行挑選補丁,移動目錄。如果對內核版本沒有要求,推薦使用這種途徑獲得內核源代碼和補丁。
優點: 內核以及補丁版本一致,打補丁操作基本不會失敗,自行補丁會使性能提升明顯
缺點: 版本非最新,需解壓多次,且要求對整個軟硬件系統有一定的了解
使用方法: 使用圖形程序 file-roller 或 rpm2cpio 命令解壓到某個目錄,需要用到的文件及注釋如下:
config.tar.bz2#按照系統架構分類的 config 內核配置文件 linux-版本.tar.bz2#原始內核源代碼 novell-kmp.tar.bz2#Novell 專有內核模塊補丁 patches.addon.tar.bz2#附加補丁 patches.arch.tar.bz2#特定系統架構和硬件需要的一些補丁 patches.drivers.tar.bz2#支持某特定硬件需要的補丁 patches.fixes.tar.bz2#修正某些特定內核問題的補丁 patches.kernel.org.tar.bz2#kernel.org 官方提供的版本增量升級補丁(隨光盤自帶的 sec.rpm 可能沒有這個文件) patches.suse.tar.bz2#SUSE 專用補丁 patches.uml.tar.bz2#針對 UML 的補丁 patches.xen.tar.bz2#XEN 虛擬機需要的補丁
將原始內核代碼解壓移動到 /usr/src/ 目錄,以上面提到的 kernel-source-2.6.16.21-0.13.src.rpm 為例
$ tar jxf linux-2.6.16.tar.bz2 $ su # mv linux-2.6.16 /usr/src/
3. 使用非官方安裝源 suser-jengelh 的 kernel-source 包
此安裝源在 http://ftp-1.gwdg.de/pub/linux/misc/suser-jengelh/SUSE-10.1/
注意: 版本較官方高,有多個版本,且包含非穩定版的內核。除非萬不得已,否則不要使用。
優點: 沒有
缺點: 系統架構不全,大多數情況下只有 32 位版。部分補丁以及配置文件不能跟進新版本,從而極容易出現各種疑難問題
使用方法: 如果不怕死,直接安裝使用
4. 使用非官方安裝源 suser-jengelh 之 kernel-source 的 src.rpm 包
此安裝源在 http://ftp-1.gwdg.de/pub/linux/misc/suser-jengelh/SUSE-10.1/, src 目錄下有眾多 kernel-source.版本號.src.rpm
注意: 版本較官方高,有多個版本,且包含非穩定版的內核。除非萬不得已,否則不要使用。
優點: 沒有
缺點: 部分補丁以及配置文件不能跟進新版本,從而極容易出現各種疑難問題
使用方法: 如果不怕死,按照官方 kernelsource src.rpm 包使用方法使用
5. 自行下載原始內核代碼及補丁
原始的內核源代碼在 http://www.kernel.org 下載,補丁自行搜索下載或解壓使用最新官方 src.rpm 中帶的補丁。
注意: 使用這種途徑需要你對自己的硬件以及 Linux 系統都有相當的了解。折騰的時候小心點,一般沒問題。
優點: 靈活,版本新,性能提高明顯
缺點: 可能找不到適合最新版本的某些補丁,要求對整個軟硬件系統有相當的了解
使用方法: 將下載的 Linux 源代碼壓縮包解壓移動到 /usr/src/ 目錄,這里以官方目前最新穩定版內核為例:
$wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 $tar jxf linux-2.6.18.tar.bz2 $su #mv linux-2.6.18 /usr/src/
給內核源代碼打補丁
上一步已經將原始的內核源代碼放入 /usr/src/linux-版本號 的目錄中。在上面使用的例子中,使用官方 src.rpm 的源代碼應該在 /usr/src/linux-2.6.16 目錄;而自行下載原始內核源碼的在 /usr/src/linux-2.6.18 目錄。
內核源碼升級可能使某個補丁失效,所以并不是一個補丁可以"補"所有版本內核的。如果補丁無法在新內核上使用,有兩種情況,一是內核已經被收入內核不必再"補",或者補丁已經對新版內核代碼失效。不管如何,如果出現錯誤請搜索或根據原補丁自行制作新補丁。
選擇需要的補丁
這是考驗你對系統了解的時候,地球上硬件和補丁眾多,具體什么系統和硬件選擇什么補丁并不在本文檔討論范圍中。但選擇需要補丁的標準很簡單,首先是硬件需要,其次是功能需要,最后是心理需要。沒必要把找到的所有補丁全部打上,極端一點說,補丁越多,系統越慢。
硬件需要是根據你的硬件來選擇補丁,小部分硬件使用原始內核會出現功能不同程度的紊亂或衰弱,也有的并不影響正常使用,只不過在日志中不斷報錯;此時可以用補丁修復這種情況。
在 kernel-source 的 src.rpm 中有大量的補丁存在,解壓 patches 開頭的幾個 bz2 壓縮文件。先 root 權限 lsmod 看看已經加載哪些模塊,再找找那些補丁文件名中有沒有帶其中某個模塊名稱。如果有,再核對系統架構以及其他信息。不必每個文件名都仔細看,大體瀏覽下有印象就可以。如果你是 Acer 的筆記本那么文件名中帶 ibm asus 的基本與你無關;同理,如果你是 32 位的系統,文件名中帶 x86_64 ia64 ppc 的補丁對你也沒有意義;如果你使用 AMD CPU 和芯片組那就不必看名稱帶 intel 字樣的補丁。實在拿不準是否需要該補丁,可以點開看看文件開頭的注釋信息。
切記,如果你對自己的硬件只有大概的了解,可以先不打或少打幾個你認為是必要的硬件方面補丁,出現問題再根據日志的提示,搜索看是不是需要某個補丁,然后打上補丁重新編譯。
功能需要是某些軟件需要補丁實現自己的功能,為了使這些軟件正常運行而不得不打補丁,比如下面要提到的 Bootsplash 補丁。如果你對這些也不了解,也可以等出了問題再搜索看看。
心理需要是對某些補丁出于各種原因產生感情依賴,不打該補丁會導致用戶進入惡劣心境。為避免嚴重的不可預知的后果,此時應該打相應補丁避免此類情況發生。
常見補丁系
MM系補丁:
http://kernel.org/patchtypes/mm.html
由 2.6 維護者 Andrew Morton 整理的一系列補丁,有很多對內核部件的升級和硬件兼容補丁。非常重要且常用。
AC系補丁:
http://kerneltrap.org/forum/linux/kernel/2.6/ac
一套由 Redhat 的 Alan Cox 維護的補丁集。一般是增加硬件支持的補丁。
CK系補丁:
http://members.optusnet.com.au/ckolivas/kernel/
一套由 Con Kolivas 維護的補丁集。含大量性能優化補丁,針對桌面和服務器各有一套。如果你想給系統提速,可以挑選使用其中部分補丁,全部使用可能導致死機。
SUSE 常用補丁
Apparmor 補丁- 配合 Novell Apparmor 軟件,作為 SUSE 特有安全模塊。
Bootsplash 補丁- 開機進入系統時的動畫。
flush-o-fat 補丁 - 寫入 FAT 格式硬盤加 -o 提速參數,不加此補丁可能無法自動掛載 FAT 格式移動硬盤。
打補丁的順序和方法
順序
打補丁有順序,一般是先打官方提供的增量升級補丁,其次是硬件需要的補丁,之后是功能需要補丁。心理需求補丁的優先級在所有補丁之上,甚至遠遠高于內核源代碼本身。
使用 src.rpm 才需要增量升級補丁,作用是將增量升級原有內核源碼至新版本;自行下載的原始內核可以是最新的,不必走這一步。
單個補丁文件
單個補丁文件可能有如下后綴 .diff .patch 或者沒有后綴,本質上都是純文本文件,可用文本編輯器打開修改。補丁方法如下:
#cd /usr/src/linux-版本號 #patch -p1 -i /路徑/補丁文件名
例如,我對自行下載的純凈內核打單文件補丁 bootsplash ,實現開機進入 X 前的動畫,下載到適合最新版本內核的補丁,文件是 /home/truth/new/patches/bootsplash-2.6.18.diff
#cd /usr/src/linux-2.6.18 #patch -p1 -i ~truth/new/patches/bootsplash-2.6.18.diff
gz/bz2 格式的補丁
并不是所有 gz/bz2 壓縮文件都可以用下面方式打上補丁。這類文件必須僅僅包含一個以上單文件補丁,不應含其它雜質;所以用本方法應先打開 gz/bz2 壓縮包檢查是否符合條件。這種補丁方法本質上就是按照壓縮包內文件名升序排列的順序挨個打上單文件補丁。使用命令為:
#cd /usr/src/linux-版本號 gz 壓縮包: #zcat 路徑/文件名.gz | patch -p1 bz2 壓縮包: #bzcat 路徑/文件名.bz2 | patch -p1
這里用上面提到的使用官方 src.rpm 的源碼作為例子,內核增量補丁是從 src.rpm 解壓出來的 patches.kernel.org.tar.bz2 在 /home/truth/new/patches/ 目錄
#cd /usr/src/linux-2.6.16 #bzcat ~truth/new/patches/patches.kernel.org.tar.bz2 | patch -p1
有些壓縮包中的補丁對所在路徑有要求,一般將它們放到 /usr/src/ 目錄即可。關于 patch 命令更多用法請 info patch ,本文不作深究。


