歡迎您光臨本站 註冊首頁

為linux內核打補丁的方法

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

來源:linux社區

學習linux內核參考

在Linux內核郵件列表中一個經常被問到的問題就是怎樣為Linux內核打一個補丁,或者更具體一點說,存在這麼多的主幹/分支,一個補丁到底要打在哪個版本的基礎內核上。希望這篇文檔能夠為你解釋明白這一點。
除了解釋怎樣應用以及卸載補丁以外,在這裡還提供了一個不同內核樹(以及如何為它們打上特定補丁)的簡要介紹。
什麼是補丁?
----------
一個補丁就是一個文本文檔,這個文檔包含了在兩個不同版本的源代碼樹之間的變化。
補丁是通過diff應用程序來創建的。
為了正確地打上一個補丁,你需要知道這個補丁是從哪個基礎版本產生出來的以及這個補丁將要把目前的源代碼樹變化到什麼新的版本。這些信息或者會出現在補丁文件的原數據中,或者可能從文件名中推斷出來。
怎樣打補丁和卸載補丁
-------------------
可以使用patch程序來打一個補丁。patch程序讀取一個diff(或者patch)文件,然後把文件中
描述的變化內容應用到代碼樹上。
Linux內核中的補丁是相對於保存內核源代碼目錄的父目錄而生成的。
這就意味著:patch文件中的文件路徑包含了它所基於的內核源文件目錄的名字(或者像是"a/"和"b/"
之類的其它名字)。
由於這很可能和你本地機器上的內核源代碼目錄的名字不匹配(但是對於查看一個沒有標籤的補丁所
基於的內核版本是非常有用的)。你應該切換到你的內核源代碼目錄,並且在打補丁的時候去掉patch
中文件名字路徑的第一個分量(patch命令的-p1參數可以完成這個任務)。
為了卸載掉一個以前已經打上的補丁,使用-R參數來打補丁。
file:///D|/applying-patches.txt
file:///D|/applying-patches.txt
於是,如果你使用如下的命令來打補丁:
patch -p1 http://cyberelk.net/tim/patchutils/)來產生一個文件來表示
兩個補丁文件之間之間的不同,然後打上這個文件。這可以使你從一個像2.6.12.2的版本一步
就可以到達版本2.6.12.3。-z標誌甚至可以使你送給interdiff一些使用gzip或者bzip2壓縮的
格式文件而不用使用zcat或者bzcat或者手動解壓縮。

下面展示了你可以怎樣一步就可以從2.6.12.2到達2.6.12.3
interdiff -z ../patch-2.6.12.2.bz2 ../patch-2.6.12.3.gz | patch -p1
儘管interdiff可以節省一到兩步,但是我還是建議你通常情況下應該做這些附加的步驟,
這是由於在某些情況下interdiff會把事情弄糟。
另外的一個替代品是「ketchup」,是一個使用python寫的腳本,這個腳本可以自動下載和
打上一些補丁(http://www.selenic.com/ketchup/).
另外一些比較好的工具是diffstat,可以顯示patch所作的所有改變的總結;lsdiff,可以顯示
在一個patch文件中受影響的文件的簡短列表,以及(可選)每一個補丁的行號碼;grepdiff,可
以顯示在補丁包含給定的正則表達式的時候顯示一個被補丁文件修改的文件的列表。
我可以從哪兒下載這些補丁?
file:///D|/applying-patches.txt
file:///D|/applying-patches.txt
補丁文件可以從http://kernel.org/來獲得
最近的補丁文件可以從首頁的鏈接中得到,但是他們也有自己的特定的主頁。
2.6.x.y(-穩定)以及2.6.x補丁位於:
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/
-rc補丁位於:
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing/
-git補丁位於:
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/snapshots/
-mm內核補丁位於:
ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/
在ftp.kernel.org中,你可以使用ftp.cc.kernel.org,這裡cc是一個國家的代碼。這樣你就可以從一個
在地理上離你比較近的位置的鏡像站點下載,從而使你獲得較快的下載速度,全局上更少的帶寬以及
對於kernel.org主伺服器的更小的壓力---這是比較好的事情,所以你還是在可能的時候使用這些鏡像
站點。
2.6.x內核
這是Linus發布的基礎穩定版本.發布的最高版本是最新的。
如果發現了衝突或者嚴重的瑕疵,那麼在這個基礎上,一個-stable的修正補丁就會被發布
出來(參見下面)。一旦一個新的2.6.x的基礎內核發布出來,就可以得到一個測試版本的補丁
,這個補丁基於先前的2.6.x版本內核和這個新的內核。
為了應用一個從2.6.11到2.6.12的補丁,你最好按照下面來做(注意這些補丁不能應用於2.6.x.y的內核,
而是應用在2.6.x的基礎內核---如果你需要從2.6.x.y到2.6.x+1,那麼你首先需要卸載掉2.6.x.y的補丁)
下面是一些例子:
#從2.6.11到2.6.12
$ cd ~/linux-2.6.11 # 切換到內核源代碼目錄
$ patch -p1 ftp://ftp.kernel.org/pub/linux/kernel/v2.6/incr/
這些補丁不是增量式的,意味著例如對於2.6.12.3補丁不能應用於2.6.12.2的內核源代碼
上去,但是可以應用在2.6.12內核代碼上。
因此,為了為了把2.6.12.3的補丁應用到你使用的2.6.12.2的內核源代碼上,你不得不卸載掉
2.5.12.2補丁(因此你可以得到一個基礎的2.6.12的內核源代碼),並且應用新的2.6.12.3補丁。
下面是一個小例子:
$ cd ~/linux-2.6.12.2 # 切換到內核源代碼目錄
$ patch -p1 -R

[火星人 ] 為linux內核打補丁的方法已經有347次圍觀

http://coctec.com/docs/linux/show-post-182976.html