補丁的工作方式
“補丁(patch)”是描述某個文件兩個不同版本之間區別的文件。程序 diff
會逐行比較原始文件與新文件,並以特定格式向標准輸出打印這些區別。程序 patch
可以讀取 diff
的輸出,並將那些改變應用於原始文件的另一個拷貝。(注意,“補丁”一詞既涉及 diff
命令的輸出,也涉及應用那個補丁的命令。)例如:
$ cat old/file.txtThisisasimplefile.$ cat new/file.txtThisisaslightly more complexfile.$ diff -uNr old newdiff -uNr old/file.txt new/file.txt--- old/file.txt Tue May 28 23:00:21 2002+++ new/file.txt Tue May 28 23:01:01 2002@@ -1,5 +1,5 @@ This is a-simple+slightly more complex file.
可見,兩個文件只有一行的區別。在命令行中列出的來自第一個文件的那一行顯示時在最前有一個“-”,接下來是來自第二個文件的那一行,在命令行中顯示時最前而有一個“+”。直觀上,是從舊文件中“減去(subtracting)”那一行,並“添加”來自新文件的那一行。記住,舊文件總是先出現,然後是較新的文件。
現在,讓我們來應用剛剛創建的補丁。補丁會將較舊版本的文件更新為較新版本的文件,所以我們應該對文件的較舊的版本應用補丁。
$ diff -uNr old new > patchfile$ cd old$ patch -p1 < ../patchfilepatching file file.txt$ cat file.txtThisisaslightly more complexfile.
使用 patch
命令應用了 diff
命令的輸出後,“舊”文件現在與“新”文件相同。
應用補丁
接下來我們將學習如何應用補丁。需要應用某個補丁的一個常見的原因是為了獲得一個特定的內核版本,它不能從 ftp.kernel.org
作為一個大的 tarball 下載得到 —— 或者是為了獲得一個增量的補丁,這樣當大部分內核文件仍然相同時就不必去下載整個新內核。
內核補丁的命名和創建標准不是特別簡單。假定出於某種原因您需要得到內核 2.6.9-rc4
,而當前已經擁有版本 2.6.7
的完整的內核源代碼。為了從 2.6.7
升級到 2.6.9-rc4
需要下載下列補丁:
從 2.6.7
到 2.6.8
從 2.6.8
到 2.6.9-rc4
每一個 prepatch(兩個主版本之間的補丁,稱作 patch-2.6.x-rcN
,通常可以在 ftp 站點上名為 testing
的目錄中找到)都是針對前一個主版本的變化而創建的。常見的錯誤是下載了內核版本 2.6.9
,然後卻嘗試應用 2.6.9-rc4
prepatch。如果想要得到內核版本 2.6.9-rc4
,應該下載內核 2.6.8
,然後應用 2.6.9-rc4
prepatch。這是因為 2.6.9-rc4
是 2.6.9
的前身,不能顛倒。注意:命名的慣例和內核 prepatches 的位置會經常發生變化。可能不得不去閱讀 linux-內核郵件列表來得知最新補丁的保存位置及它們的名稱。
官方內核補丁的實現都支持您只需進行如下操作:
cd <your linux source tree>patch -p1 < ../patchfile
patch 命令的 -p1
選項表示的是“除去直到第一個正斜槓的部分路徑名,然後嘗試對除去了路徑名的文件應用補丁”。
如果所有這些看起來太過復雜和令人厭煩,那麼可能應該去嘗試使用 Cogito。本部分的最後有對 Cogito 的簡短介紹。
創建一個補丁
要記住的第一件事情是,始終要在某個地方保存內核源代碼的一個未經改動的、原始的版本。不要在它裡面進行編譯,不要編輯其中的任何文件,不要對它做任何事情 —— 只是拷貝它,來得到源代碼樹的工作拷貝。原始內核源代碼應該是在一個名為 linux.vanilla
或 linux.orig
的目錄中,並