linux下patch命令使用詳解---linux打補丁命令
創新互聯是一家專注于成都網站制作、做網站、外貿營銷網站建設與策劃設計,五龍口網站建設哪家好?創新互聯做網站,專注于網站建設十多年,網設計領域的專業建站公司;建站業務涵蓋:五龍口等地區。五龍口做網站價格咨詢:18982081108
功能說明:修補文件。
語法:patch [-bceEflnNRstTuvZ][-B 備份字首字符串][-d 工作目錄][-D 標示符號][-F 監別列數][-g 控制數值][-i 修補文件][-o 輸出文件][-p 剝離層級][-r 拒絕文件][-V 備份方式][-Y 備份字首字符串][-z 備份字尾字符串][--backup-if -mismatch][--binary][--help][--nobackup-if-mismatch][--verbose][原始文件 修補文件] 或 path [-p 剝離層級] [修補文件]
補充說明:patch指令讓用戶利用設置修補文件的方式,修改,更新原始文件。倘若一次僅修改一個文件,可直接在指令列中下達指令依序執行。如果配合修補文件的方式則能一次修補大批文件,這也是Linux系統核心的升級方法之一。
參數:
-b或--backup 備份每一個原始文件。
-B備份字首字符串或--prefix=備份字首字符串 設置文件備份時,附加在文件名稱前面的字首字符串,該字符串可以是路徑名稱。
-c或--context 把修補數據解譯成關聯性的差異。
-d工作目錄或--directory=工作目錄 設置工作目錄。
-D標示符號或--ifdef=標示符號 用指定的符號把改變的地方標示出來。
-e或--ed 把修補數據解譯成ed指令可用的敘述文件。
-E或--remove-empty-files 若修補過后輸出的文件其內容是一片空白,則移除該文件。
-f或--force 此參數的效果和指定-t參數類似,但會假設修補數據的版本為新 版本。
-F監別列數或--fuzz監別列數 設置監別列數的最大值。
-g控制數值或--get=控制數值 設置以RSC或SCCS控制修補作業。
-i修補文件或--input=修補文件 讀取指定的修補問家你。
-l或--ignore-whitespace 忽略修補數據與輸入數據的跳格,空格字符。
-n或--normal 把修補數據解譯成一般性的差異。
-N或--forward 忽略修補的數據較原始文件的版本更舊,或該版本的修補數據已使 用過。
-o輸出文件或--output=輸出文件 設置輸出文件的名稱,修補過的文件會以該名稱存放。
-p剝離層級或--strip=剝離層級 設置欲剝離幾層路徑名稱。
-f拒絕文件或--reject-file=拒絕文件 設置保存拒絕修補相關信息的文件名稱,預設的文件名稱為.rej。
-R或--reverse 假設修補數據是由新舊文件交換位置而產生。
-s或--quiet或--silent 不顯示指令執行過程,除非發生錯誤。
-t或--batch 自動略過錯誤,不詢問任何問題。
-T或--set-time 此參數的效果和指定-Z參數類似,但以本地時間為主。
-u或--unified 把修補數據解譯成一致化的差異。
-v或--version 顯示版本信息。
-V備份方式或--version-control=備份方式 用-b參數備份目標文件后,備份文件的字尾會被加上一個備份字符串,這個字符串不僅可用-z參數變更,當使用-V參數指定不同備份方式時,也會產生不同字尾的備份字符串。
-Y備份字首字符串或--basename-prefix=--備份字首字符串 設置文件備份時,附加在文件基本名稱開頭的字首字符串。
-z備份字尾字符串或--suffix=備份字尾字符串 此參數的效果和指定-B參數類似,差別在于修補作業使用的路徑與文件名若為src/linux/fs/super.c,加上backup/字符串后,文件super.c會備份于/src/linux/fs/backup目錄里。
-Z或--set-utc 把修補過的文件更改,存取時間設為UTC。
--backup-if-mismatch 在修補數據不完全吻合,且沒有刻意指定要備份文件時,才備份文件。
--binary 以二進制模式讀寫數據,而不通過標準輸出設備。
--help 在線幫助。
--nobackup-if-mismatch 在修補數據不完全吻合,且沒有刻意指定要備份文件時,不要備份文件。
--verbose 詳細顯示指令的執行過程。
patch,是打補丁的命令,有很多用法,見幫助#man patch
patch -p0 (“p”指的是路徑,后面的數字表示去掉路徑的第幾部分。0,表示不去掉,為全路徑)
patch -p1 (“p”后面的數字1,表示去掉前第一個路徑)fetch
fetch /sys/dev/bge
fetch ...
patch -p0 ...fetch
patch -p patch-tcp_auto_buf-20061212-RELENG_6.diff
也可以把文件中的目錄全改成系統已在的目錄如/usr/src/sys.....注意:
1,確認目錄
然后確認目錄,如不在默認目錄下,就寫下要打補丁的當前絕對目錄。如/usr/src/sys/dev/bge/if_bce.c2,P的使用
可以使用不帶數字的參數。
patch 后的軟件安裝
telnetd服務器的問題及補丁 在當前FreeBSD所有版本中,也就是FreeBSD 5.0、FreeBSD 4.3、FreeBSD 4.2、FreeBSD 4.1.1、FreeBSD 4.1、FreeBSD 4.0、FreeBSD 3.x、FreeBSD 2.x的版本,其telnetd守護進程中存在一個致命的緩沖區溢出漏洞,該問題是由于telnetd在處理telnet協議選項的函數中沒有進行有效的邊界檢查,當使用某些選項(\'AYT\')時,可能發生緩沖區溢出。這會導致遠程root級別的安全威脅。
因此,如果一定要使用telnet服務的話,必須為服務器打上最新的patch,該patch可以從以下鏈接獲得: (注:通常有兩個版本的telnetd服務器,有crypto及無crypto的版本,因此需要判斷主機使用的是哪種版本的telnetd,這通常可以通過察看src文件來判斷,比如# ls /usr/src/crypto/telnet/telnetd,如果不存在,則說明使用的是無crypto的版本了,在判別清楚之后再分別下載相關補丁文件) crypto版本補丁:
patch方法:
# cd /usr/src/
# patch -p /path/to/patch
# cd /usr/src/secure/libexec/telnetd
# make depend make all install 無crypto版本補丁:
patch方法:
# cd /usr/src/
# patch -p /path/to/patch
# cd /usr/src/libexec/telnetd
# make depend make all install 例子來源文件:isp1161-2.6.12.patch(在/root下)
由于patch文件的首行已經指明了路徑,所以根據當前所在的目錄,加不同的參數使用patch命令:
1:如果當前的目錄是和linux-2.6.12的同級目錄:
[root@ ]#patch -p0 /root/isp1161-2.6.12.patch
2:如果當前的目錄為 linux-2.6.12/:
[root@ ]#patch -p1 /root/isp1161-2.6.12.patch
3:如果當前的目錄為 linux-2.6.12/drivers/:
[root@ ]#patch -p2 /root/isp1161-2.6.12.pathc
0,1,2,是指略去的patch文件中的前幾級目錄。
ln 命令的使用
這是linux中一個非常重要的命令。它的功能是為某一個文件在另外一個位置建立一個不同的鏈接,這個命令最常用的參數是-s,具體用法是:ln -s 源文件 目標文件。
當我們需要在不同的目錄,用到相同的文件時,我們不需要在每一個需要的目錄下都放一個必須相同的文件,我們只要在某個固定的目錄放上該文件,然后在其它的目錄下用ln命令鏈接(link)它就可以,不必重復的占用磁盤空間。
例如:ln -s /bin/less /usr/local/bin/less
-s 是代號(symbolic)的意思。
這里有兩點要注意:
第一,ln命令會保持每一處鏈接文件的同步性。也就是說,不論你改動了哪一處,其它的文件都會發生相同的變化。
patch附帶有一個很好的幫助,其中羅列了很多選項,但是99%的時間只要兩個選項就能滿足我們的需要:
patch -p1 [patchfile]
patch -R [patchfile] (used to undo a patch)
-p1選項代表patchfile中文件名左邊目錄的層數,頂層目錄在不同的機器上有所不同。要使用這個選項,就要把你的patch放在要被打補丁的目錄下,然后在這個目錄中運行path -p1 [patchfile]。來自Linux內核patch的一個簡短的引用可以這樣實現:
diff -u --recursive --new-file v2.1.118/linux/mm/swapfile.c linux/mm/swapfile. c--- v2.1.118/linux/mm/swapfile.c Wed Aug 26 11:37:45 1998 +++ linux/mm/swapfile.c Wed Aug 26 16:01:57 1998 @@ -489,7 +489,7 @@
int swap_header_version;
int lock_map_size = PAGE_SIZE;
int nr_good_pages = 0; - char tmp_lock_map = 0; + unsigned long tmp_lock_map = 0;
應用來自本段中使用-p1開關拷貝的patch可以有效地減短patch定位的路徑;patch會查找當前目錄下一個名為/mm的子目錄,接著應該會在這兒發現swapfile.c文件,然后等待打補丁。在這個過程中,以破折號(“-”號,譯者注)開始的行會被一個以加號(“+”號,譯者注)開始的行代替。一個典型的patch會包含對多個文件的更新,每個部分中都由對兩個版本的文件運行diff -u命令的輸出結果組成。
patch在操作時把自己的輸出結果顯示在屏幕上,但是這種輸出通常都滾屏太快,來不及觀看。原來準備patch的文件名為*.orig,新的patch文件會覆蓋這個初始文件名。
打補丁的問題
使用不同版本的patch問題來源可能不同,所有的版本在網絡上都是可用的。Larry Wall近年來已經不再做很多工作來更新patch了,這可能是由于他最后發行的一個版本在大部分情況下都能正常運行。最近幾年以來,一直是GNU項目的 FSF程序員發行新版本的patch。他們首先修訂有問題的patch,但是我最近一直使用沒有問題的2.5版本(這是Debian2.0的發行版本號)。過去,我的2.1版本也一直運行的很好。當前的GNU patch的版本可以從GNU FTP站點上獲取,然而大部分人都只使用他們Linux發行版中所提供的版本。
讓我們假定你已經對一個目錄下的源程序文件進行了patch修補工作,但是patch并沒有清晰地發揮作用。這可能會偶然發生,在打補丁的過程中會顯示錯誤信息,其中帶有行號,說明哪一個文件出現了問題。有時錯誤是很明顯的,例如缺少了分號,??種錯誤可以不費多大力氣就能改正。另外一種可能是從 patch部分刪除了產生問題的部分,但是這樣根據所涉及到的文件的不同可能會正常工作,也可能不能正常工作了。
另外一種常見的錯位為:假設你有一個未使用tar打包的內核源程序文件,在/linux/arch/下瀏覽各個子目錄時你會發現各種機器體系結構子目錄,例如alpah、sparc等等。如果你和大多數Linux用戶一樣,使用的是Intel的處理器(或者是Intel系列),你可以決定刪除這些目錄,這些目錄對于編譯你特殊的內核并不需要,只是白白占用了磁盤空間。一段時間之后發行了一個新的內核patch,此時試圖進行patch操作,當它發現不能找到自己打補丁需要的Alpha或者PPC文件,就會停頓下來。幸運的是patch在這些地方允許用戶參與,它會詢問Skip this patch?回答y,patch就可以按照正確的路徑繼續執行。也許你需要回答這個問題很多次,因此允許自己不需要的目錄保留在磁盤上是一種很好的方法。
掃描指令
1.
順向掃描指令
BSF(Bit
Scan
Forward)
格式:BSF
DST,RSC
功能:從右向左掃描RSC操作數中第一個含1的位,并把掃描到的第一個含1的位號送DST操作數。若RSC=0,則DST值不確定。
說明:DST和RSC可以是16位或32位的,但長度要相同。DST只能是通用寄存器,RSC不能是立即數。
標志:若RSC為0,則置ZF=1;否則清0
ZF,其它標志位不確定。
2.
逆向掃描指令
BSR(Bit
Scan
Reverse)
格式:BSR
DST,RSC
功能:從左向右掃描RSC操作數中第一個含1的位,并把掃描到的第一個含1的位號送DST操作數。
說明:同BSF。
標志:對標志影響同BSF。
位測試指令
位測試(Bit
Test)
BT
DST,SRC
-cf
位測試并置位(Bit
Test
and
Set)
BTS
DST,SRC
-cf
位測試并復位(Bit
Test
and
Rest)BTR
DST,SRC
-cf
為測試并取反(Bit
Test
and
Complement)BTC
DST,SRC
-cf
說明:目標可以是16或32位的寄存器或存儲器操作數,源可以是8位的立即數、寄存器或存儲器操作數,若源操作數是立即數,則其值不應超過目標操作數的長度。若不是立即數,其長度一定要和目標的長度相同。目標操作數的位偏移從最右邊位開始、從0開始計數。
1,如何制作補丁patch文件 比如基于kernel內核 做了修改,修改了LCD代碼,修改前的內容放在文件夾kernel下,修改后的內容放在文件夾kernel_new下,那么制作patch文件的命令為 zhenwx-desktop:~/sourcecode/$diff -Naur kernel/ kernel_new/ zwx-lcd.patch 當前目錄為 /home/zhenwx/sourcecode/,該目錄有原來修改前的內核kernel目錄和修改后的目錄kernel_new 執行命令為 diff -Naur kernel/ kernel_new/ zwx-lcd.patch diff命令就會對比kernel和kernel_new目錄的文件,產生patch文件zwx-lcd.patch 這時就 可以把zwx-lcd.patch發布到網上。 這個patch文件是描述文件的路徑信息和將第幾行內容刪除,在第幾行添加內容,刪除用減號,添加用加號 2,怎樣打補丁patch和卸載補丁patch 可以使用patch程序來打一個補丁。patch程序讀取一個diff(或者patch)文件,然后把文件中 描述的變化內容應用到代碼樹上。 Linux內核中的補丁是相對于保存內核源代碼目錄的父目錄而生成的。 這就意味著:patch文件中的文件路徑包含了它所基于的內核源文件目錄的名字(或者像是"a/"和"b/" 之類的其它名字)。 由于這很可能和你本地機器上的內核源代碼目錄的名字不匹配。你應該切換到你的內核源代碼目錄,并且在打補丁的時候去掉patch 中文件名字路徑的第一個分量(patch命令的-p1參數可以完成這個任務)。 為了卸載掉一個以前已經打上的補丁,使用-R參數來打補丁。 于是,如果你使用如下的命令來打補丁: patch -p1
那么你可以像下面這樣來卸載掉這個補丁: patch -R -p1 例如其他人下載到上面提供的patch文件后,只需在標準的kernel內核目錄里執行 zhenwx-desktop:~/sourcecode/kernel/$ patch -p1../zwx-lcd.patch 這里假設zwx-lcd.patch和kernel文件夾是在同一目錄下,且上述命令 在kernel文件夾內執行 如果在/sourcecode目錄下面執行命令 zhenwx-desktop:~/sourcecode/$ patch -p0../zwx-lcd.patch linux下patch命令使用詳解 linux打補丁命令 功能說明:修補文件。 語法:patch [-bceEflnNRstTuvZ][-B 備份字首字符串][-d 工作目錄][-D 標示符號][-F 監別列數][-g 控制數值][-i 修補文件][-o 輸出文件][-p 剝離層級][-r 拒絕文件][-V 備份方式][-Y 備份字首字符串][-z 備份字尾字符串][--backup-if -mismatch][--binary][--help][--nobackup-if-mismatch][--verbose][原始文件 修補文件] 或 path [-p 剝離層級] [修補文件] 補充說明:patch指令讓用戶利用設置修補文件的方式,修改,更新原始文件。倘若一次僅修改一個文件,可直接在指令列中下達指令依序執行。如果配合修補文件的方式則能一次修補大批文件,這也是Linux系統核心的升級方法之一。 參數: -b或--backup 備份每一個原始文件。 -B備份字首字符串或--prefix=備份字首字符串 設置文件備份時,附加在文件名稱前面的字首字符串,該字符串可以是路徑名稱。 -c或--context 把修補數據解譯成關聯性的差異。 -d工作目錄或--directory=工作目錄 設置工作目錄。 -D標示符號或--ifdef=標示符號 用指定的符號把改變的地方標示出來。 -e或--ed 把修補數據解譯成ed指令可用的敘述文件。 -E或--remove-empty-files 若修補過后輸出的文件其內容是一片空白,則移除該文件。 -f或--force 此參數的效果和指定-t參數類似,但會假設修補數據的版本為新 版本。 -F監別列數或--fuzz監別列數 設置監別列數的最大值。 -g控制數值或--get=控制數值 設置以RSC或SCCS控制修補作業。 -i修補文件或--input=修補文件 讀取指定的修補問家你。 -l或--ignore-whitespace 忽略修補數據與輸入數據的跳格,空格字符。 -n或--normal 把修補數據解譯成一般性的差異。 -N或--forward 忽略修補的數據較原始文件的版本更舊,或該版本的修補數據已使 用過。 -o輸出文件或--output=輸出文件 設置輸出文件的名稱,修補過的文件會以該名稱存放。 -p剝離層級或--strip=剝離層級 設置欲剝離幾層路徑名稱。 -f拒絕文件或--reject-file=拒絕文件 設置保存拒絕修補相關信息的文件名稱,預設的文件名稱為.rej。 -R或--reverse 假設修補數據是由新舊文件交換位置而產生。 -s或--quiet或--silent 不顯示指令執行過程,除非發生錯誤。 -t或--batch 自動略過錯誤,不詢問任何問題。 -T或--set-time 此參數的效果和指定-Z參數類似,但以本地時間為主。 -u或--unified 把修補數據解譯成一致化的差異。 -v或--version 顯示版本信息。 -V備份方式或--version-control=備份方式 用-b參數備份目標文件后,備份文件的字尾會被加上一個備份字符串,這個字符串不僅可用-z參數變更,當使用-V參數指定不同備份方式時,也會產生不同字尾的備份字符串。 -Y備份字首字符串或--basename-prefix=--備份字首字符串 設置文件備份時,附加在文件基本名稱開頭的字首字符串。 -z備份字尾字符串或--suffix=備份字尾字符串 此參數的效果和指定-B參數類似,差別在于修補作業使用的路徑與文件名若為src/linux/fs/super.c,加上backup/字符串后,文件super.c會備份于/src/linux/fs/backup目錄里。 -Z或--set-utc 把修補過的文件更改,存取時間設為UTC。 --backup-if-mismatch 在修補數據不完全吻合,且沒有刻意指定要備份文件時,才備份文件。 --binary 以二進制模式讀寫數據,而不通過標準輸出設備。 --help 在線幫助。 --nobackup-if-mismatch 在修補數據不完全吻合,且沒有刻意指定要備份文件時,不要備份文件。 --verbose 詳細顯示指令的執行過程。 patch,是打補丁的命令,有很多用法,見幫助#man patch -p參數決定了是否使用讀出的源文件名的前綴目錄信息,不提供-p參數,則忽略所有目錄信息, patch -p0 (“p”指的是路徑,后面的數字表示去掉路徑的第幾部分。0,表示不去掉,為全路徑) patch -p1 (“p”后面的數字1,表示去掉前第一個路徑,第一個"/"以前的目錄,依此類推。 如/usr/src/linux-2.6.11/Makefile這樣的文件名,在提供-p3參數時將使用linux-2.6.11/Makefile作為所要patch的文件。 對于剛才舉的Linux內核源碼LCD升級包的例子,假定源碼目錄位于/home/zhenwx/sourcecode/kernel中, 則在當前目錄為/home/zhenwx/sourcecode/時使用"patch -p0../zwx-lcd.patch"可以工作, 在當前目錄為/home/zhenwx/sourcecode/kernel時,使用"patch -p1../zwx-lcd.patch"也可以正常工作。 如果patch文件里面描述的第一級目錄和你自己的第一級目錄名字不一樣,要將第一級的目錄去掉,這個方法就派上用場了。 比如如果你拿到的patch描述的目錄和你的不一樣,patch第一行描述的目錄信息 diff --git a/arch/arm/mach-msm/acpuclock-8064.c b/arch/arm/mach-msm/acpuclock-8064.c 但是你的目錄既不是a,也不是b,那么你就要將目錄的第一層去掉,到你的kernel的路徑下面打patch 用-p1參數
名稱欄目:linux的rsc命令,rsa命令
標題網址:http://www.yijiale78.com/article10/hdejdo.html
成都網站建設公司_創新互聯,為您提供虛擬主機、網站排名、動態網站、網站維護、品牌網站設計、建站公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯