亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關(guān)注微信公眾號(hào)

Linux的補(bǔ)丁知識(shí)
2005-12-07   

補(bǔ)丁的工作方式

“補(bǔ)丁(patch)”是描述某個(gè)文件兩個(gè)不同版本之間區(qū)別的文件。程序 會(huì)逐行比較原始文件與新文件,并以特定格式向標(biāo)準(zhǔn)輸出打印這些區(qū)別。程序 可以讀取 的輸出,并將那些改變應(yīng)用于原始文件的另一個(gè)拷貝。(注意,“補(bǔ)丁”一詞既涉及 命令的輸出,也涉及應(yīng)用那個(gè)補(bǔ)丁的命令。)例如:


$ cat old/file.txt
This
is
a
simple
file.
$ cat new/file.txt
This
is
a
slightly more complex
file.
$ diff -uNr old new
diff -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.

可見(jiàn),兩個(gè)文件只有一行的區(qū)別。在命令行中列出的來(lái)自第一個(gè)文件的那一行顯示時(shí)在最前有一個(gè)“-”,接下來(lái)是來(lái)自第二個(gè)文件的那一行,在命令行中顯示時(shí)最前而有一個(gè)“+”。直觀上,是從舊文件中“減去(subtracting)”那一行,并“添加”來(lái)自新文件的那一行。記住,舊文件總是先出現(xiàn),然后是較新的文件。

現(xiàn)在,讓我們來(lái)應(yīng)用剛剛創(chuàng)建的補(bǔ)丁。補(bǔ)丁會(huì)將較舊版本的文件更新為較新版本的文件,所以我們應(yīng)該對(duì)文件的較舊的版本應(yīng)用補(bǔ)丁。


$ diff -uNr old new > patchfile
$ cd old
$ patch -p1 < ../patchfile
patching file file.txt
$ cat file.txt
This
is
a
slightly more complex
file.

使用 命令應(yīng)用了 命令的輸出后,“舊”文件現(xiàn)在與“新”文件相同。

應(yīng)用補(bǔ)丁

接下來(lái)我們將學(xué)習(xí)如何應(yīng)用補(bǔ)丁。需要應(yīng)用某個(gè)補(bǔ)丁的一個(gè)常見(jiàn)的原因是為了獲得一個(gè)特定的內(nèi)核版本,它不能從 作為一個(gè)大的 tarball 下載得到 —— 或者是為了獲得一個(gè)增量的補(bǔ)丁,這樣當(dāng)大部分內(nèi)核文件仍然相同時(shí)就不必去下載整個(gè)新內(nèi)核。

內(nèi)核補(bǔ)丁的命名和創(chuàng)建標(biāo)準(zhǔn)不是特別簡(jiǎn)單。假定出于某種原因您需要得到內(nèi)核 ,而當(dāng)前已經(jīng)擁有版本 的完整的內(nèi)核源代碼。為了從 升級(jí)到 需要下載下列補(bǔ)丁:

每一個(gè) prepatch(兩個(gè)主版本之間的補(bǔ)丁,稱(chēng)作 ,通常可以在 ftp 站點(diǎn)上名為 的目錄中找到)都是針對(duì)前一個(gè)主版本的變化而創(chuàng)建的。常見(jiàn)的錯(cuò)誤是下載了內(nèi)核版本 ,然后卻嘗試應(yīng)用 prepatch。如果想要得到內(nèi)核版本 ,應(yīng)該下載內(nèi)核 ,然后應(yīng)用 prepatch。這是因?yàn)? 的前身,不能顛倒。注意:命名的慣例和內(nèi)核 prepatches 的位置會(huì)經(jīng)常發(fā)生變化。可能不得不去閱讀 linux-內(nèi)核郵件列表來(lái)得知最新補(bǔ)丁的保存位置及它們的名稱(chēng)。

官方內(nèi)核補(bǔ)丁的實(shí)現(xiàn)都支持您只需進(jìn)行如下操作:


cd 
patch -p1 < ../patchfile

patch 命令的 選項(xiàng)表示的是“除去直到第一個(gè)正斜杠的部分路徑名,然后嘗試對(duì)除去了路徑名的文件應(yīng)用補(bǔ)丁”。

如果所有這些看起來(lái)太過(guò)復(fù)雜和令人厭煩,那么可能應(yīng)該去嘗試使用 Cogito。本部分的最后有對(duì) Cogito 的簡(jiǎn)短介紹。

創(chuàng)建一個(gè)補(bǔ)丁

要記住的第一件事情是,始終要在某個(gè)地方保存內(nèi)核源代碼的一個(gè)未經(jīng)改動(dòng)的、原始的版本。不要在它里面進(jìn)行編譯,不要編輯其中的任何文件,不要對(duì)它做任何事情 —— 只是拷貝它,來(lái)得到源代碼樹(shù)的工作拷貝。原始內(nèi)核源代碼應(yīng)該是在一個(gè)名為 的目錄中,并且工作目錄應(yīng)該與原始代碼位于同一目錄之中。例如,如果原始源代碼位于 目錄下,那么工作所用的源代碼也應(yīng)該位于 目錄中。

在對(duì)工作拷貝進(jìn)行了修改后,將使用 創(chuàng)建一個(gè)補(bǔ)丁。假定您的工作源代碼樹(shù)名為 ,那么應(yīng)該運(yùn)行這個(gè)命令:


$ diff -upNr linux.vanilla linux.new > patchfile

原始內(nèi)核源代碼與新的內(nèi)核源代碼之間的所有區(qū)別現(xiàn)在就已經(jīng)在 之中。 注意:不要使用不一致的目錄創(chuàng)建補(bǔ)丁,例如(不要 這樣做):


$ diff -upNr linux.vanilla working/usb/thing1/linux > patchfile

這將不會(huì)創(chuàng)建一個(gè)標(biāo)準(zhǔn)格式的補(bǔ)丁,而且沒(méi)有人會(huì)去費(fèi)力嘗試您的補(bǔ)丁,因?yàn)樗y以應(yīng)用。

既然已經(jīng)創(chuàng)建了一個(gè)補(bǔ)丁,那么閱讀它吧!幾乎可以肯定,補(bǔ)丁中包含的有些文件您不希望將它們作為補(bǔ)丁的一部分,比如舊的編輯器備份文件、對(duì)象文件,或者在開(kāi)發(fā)過(guò)程中創(chuàng)建的隨機(jī)垃圾文件。要除去這些文件,可以讓 diff 忽略特定的文件,可以刪除這些文件,或者可以手工編輯 diff。在手工編輯補(bǔ)丁之前一定要理解補(bǔ)丁的格式,否則很可能創(chuàng)建出一個(gè)不能應(yīng)用的補(bǔ)丁。 是一個(gè)實(shí)用的命令,可以用來(lái)除去在內(nèi)核構(gòu)建期間創(chuàng)建的額外文件。

不過(guò)要記住,這會(huì)刪除 文件并強(qiáng)制您對(duì)內(nèi)核進(jìn)行完全的編譯。

另外,要確保補(bǔ)丁位于正確的目錄中。新的行是不是前面有“+”的那些行?并且,要確保那些是您所希望執(zhí)行的修改。非常容易使用完全錯(cuò)誤的源代碼樹(shù)完成 diff。

當(dāng)認(rèn)為自己已經(jīng)獲得了補(bǔ)丁的最終版本之后,將它應(yīng)用到原始的源代碼樹(shù)(不要破壞原始源代碼樹(shù)的惟一拷貝)。如果它不能應(yīng)用而又沒(méi)有報(bào)錯(cuò),那么重新去完成那個(gè)補(bǔ)丁。

同樣,如果這這看起來(lái)太過(guò)復(fù)雜,可能應(yīng)該去嘗試使用 Cogito。

在提交補(bǔ)丁之前需要考慮的事情

創(chuàng)建了一個(gè)補(bǔ)丁之后,您會(huì)希望與其他人共享它。理想的情形是,您自己測(cè)試那個(gè)補(bǔ)丁,也讓其他人去測(cè)試它,并讓其他人去閱讀那個(gè)補(bǔ)丁本身。總之,您會(huì)希望自己的補(bǔ)丁沒(méi)有 bug、合理編寫(xiě)、易于應(yīng)用。

始終要自己編譯和測(cè)試自己的補(bǔ)丁。您會(huì)看到有人向 linux-內(nèi)核提交“完全沒(méi)有測(cè)試的(totally untested)”補(bǔ)丁,但不會(huì)對(duì)其傾心 —— 完成沒(méi)有經(jīng)過(guò)測(cè)試的補(bǔ)丁可能是一個(gè)沒(méi)用的補(bǔ)丁。內(nèi)核維護(hù)人員曾不止一次發(fā)布根本不能編譯的內(nèi)核。人無(wú)完人 —— 在任何情況下都要測(cè)試您的補(bǔ)丁。

確保代碼與相關(guān)代碼相符合,并遵循內(nèi)核代碼風(fēng)格慣例。雖然查看其他源文件通常是了解當(dāng)前慣例的最佳途徑,不過(guò)還應(yīng)去查看文件 中的規(guī)范說(shuō)明。

如果您的補(bǔ)丁難以應(yīng)用,那么它幾乎肯定不會(huì)被認(rèn)可。除了要使用適當(dāng)層次的目錄創(chuàng)建補(bǔ)丁以外,創(chuàng)建它時(shí)所針對(duì)的內(nèi)核需要與其他人將補(bǔ)丁應(yīng)用到的內(nèi)核相同(或者幾乎相同)。所以,如果想讓 XYZ 來(lái)應(yīng)用您的補(bǔ)丁,那么要確定 XYZ 正在使用的內(nèi)核的版本,然后嘗試盡可能使用與之相近的內(nèi)核。通常是內(nèi)核維護(hù)人員所發(fā)布的最新 vanilla 內(nèi)核。

例如,如果有一個(gè)針對(duì) 補(bǔ)丁,而 是發(fā)布的最新版本,那么應(yīng)該針對(duì) 重新創(chuàng)建補(bǔ)丁。最簡(jiǎn)單的方法是,將補(bǔ)丁從 應(yīng)用到 ,并修訂兩個(gè)版本之間的所有變化,然后針對(duì) 重新進(jìn)行 diff。

將補(bǔ)丁提交給誰(shuí)

這個(gè)問(wèn)題的答案是“看情況而定”。訂閱 Linux 內(nèi)核郵件列表以及與您的研究領(lǐng)域更相關(guān)的列表;您將了解到誰(shuí)是適合的人選。

嘗試確定最明確參與維護(hù)您正在修改的那部分內(nèi)核的人。如果您對(duì) bar 子系統(tǒng)中的 foo 驅(qū)動(dòng)程序進(jìn)行了修改,而 foo 驅(qū)動(dòng)程序有一個(gè)維護(hù)人員,那么您可能應(yīng)該將補(bǔ)丁提交給 foo 的維護(hù)人員,只有當(dāng) foo 的維護(hù)人員不理您時(shí)再提交給 bar 子系統(tǒng)的維護(hù)人員。

頂層內(nèi)核源代碼目錄中的 經(jīng)常會(huì)過(guò)期,不過(guò),無(wú)論如何,通常還是會(huì)有所幫助。不管您將補(bǔ)丁發(fā)送給 文件的哪個(gè)人,都不會(huì)有人責(zé)怪您。當(dāng)無(wú)法確定如何做時(shí),這總是可采取的最安全方法。

另外,要將您的補(bǔ)丁發(fā)送到 linux-kernel@vger.kernel.org 的 Linux 內(nèi)核郵件列表(除非有理由不這樣做)。除了維護(hù)人員以外的其他開(kāi)發(fā)者可能需要知道您的修改。他們還可能會(huì)提供幫助,給出注解與建議。

發(fā)布補(bǔ)丁

大部分補(bǔ)丁都足夠小,可以包含在郵件中。雖然有些維護(hù)人員拒絕接收附件中的補(bǔ)丁,有些維護(hù)人員拒絕接收 MIME-編碼 的補(bǔ)丁,但是所有維護(hù)人員都會(huì)接收包含在純文本郵件主體中的補(bǔ)丁。確保郵件客戶機(jī)不會(huì)破壞您的補(bǔ)丁 —— 如果不能確定,那么將補(bǔ)丁用郵件發(fā)送給自己并應(yīng)用它,這樣來(lái)確保其他人也可以應(yīng)用它。大部分 Linux 郵件列表希望補(bǔ)丁擁有以字符串 為前綴的有意義的英語(yǔ)主題,便于查找和閱讀補(bǔ)丁。

如果您的補(bǔ)丁太大,不能通過(guò)電子郵件發(fā)送(大約 40 KB 或者更大),那么將它放在其他人可以下載的 Web 頁(yè)面上或者 ftp 站點(diǎn)上,然后把 URL 放在電子郵件中。

源代碼樹(shù)中的 文件中可以找到關(guān)于如何提交補(bǔ)丁的更多指南。

策略考慮因素

如果所有事實(shí)都表明您的補(bǔ)丁有適當(dāng)?shù)母袷健⑹钦_的而且修訂了一個(gè) bug,那么提交它將簡(jiǎn)單得多。更重要的是,您的補(bǔ)丁需要有吸引力、適時(shí)、有趣,而且要考慮維護(hù)人員的自尊心。在大部分情況下,簡(jiǎn)單的 bug 修復(fù)會(huì)被立即認(rèn)可。不過(guò),有時(shí)您會(huì)遇到更大的問(wèn)題。重要的是要記住不能去從事 Linux 維護(hù)人員系統(tǒng)周邊的工作;您的工作必須深入其中。

學(xué)習(xí)關(guān)于 linux-內(nèi)核的一些思路,人們?cè)噲D以這些思路來(lái)說(shuō)服他人將自己的補(bǔ)丁融入內(nèi)核。如果您的補(bǔ)丁沒(méi)有被認(rèn)可,那么去聆聽(tīng)其他人是如何評(píng)價(jià)它,并嘗試解決它的問(wèn)題。最常被拒絕的補(bǔ)丁是特性(feature)補(bǔ)丁 —— 添加的新特性被其他維護(hù)人員認(rèn)為沒(méi)有吸引力。不要浪費(fèi)時(shí)間去嘗試讓補(bǔ)丁被認(rèn)可,只需要單獨(dú)維護(hù)它。如果足夠多的人發(fā)現(xiàn)那個(gè)補(bǔ)丁有用,那么在下載并使用您的補(bǔ)丁的人中,您會(huì)被認(rèn)為是一位有幫助的內(nèi)核修改者而獲得名望。

有時(shí),維護(hù)人員只是因?yàn)樗蛘咚淖宰鹦亩徽J(rèn)可某個(gè)補(bǔ)丁。在這種情況下,惟一的選擇是維護(hù)一個(gè)獨(dú)立于主內(nèi)核的更好版本代碼。通常,在一段時(shí)間之后,被證明是更好的外部維護(hù)的代碼將取代內(nèi)核內(nèi)部代碼 —— 這是成為維護(hù)人員的一個(gè)途徑。

可取代 diff 和 patch 的另一種選擇:Cogito

當(dāng)前很多內(nèi)核開(kāi)發(fā)者使用 Cogito 來(lái)取代 diff 和 patch。它簡(jiǎn)化了大量?jī)?nèi)核開(kāi)發(fā)任務(wù),比如更新到最新的版本、創(chuàng)建補(bǔ)丁和應(yīng)用補(bǔ)丁。

要添加一個(gè)文件,運(yùn)行:


$ cg-add file

要?jiǎng)?chuàng)建一個(gè)補(bǔ)丁,運(yùn)行:


$ cg-diff > patchfile

要應(yīng)用一個(gè)補(bǔ)丁,運(yùn)行:


$ cg-patch < patchfile


熱詞搜索:

上一篇:端口、木馬、安全、掃描應(yīng)用知識(shí)(1)
下一篇:CA認(rèn)證系統(tǒng)知識(shí)點(diǎn)滴

分享到:           收藏