C語言中文網 目錄
首頁 > Linux入門 > Linux軟件安裝 閱讀:2,348

Linux源碼包快速升級方法詳解

Linux 系統中更新用源碼包安裝的軟件,除了卸載重裝這種簡單粗暴的方法外,還可以下載補丁文件更新源碼包,用新的源碼包重新編譯安裝軟件。比較兩種方式,后者更新軟件的速度更快。

使用補丁文件更新源碼包,省去了用 ./configured 生成新的 Makefile 文件,還省去了大量的編譯工作,因此效率更高。學完本節會對比有更深入的理解。

Linux補丁文件的生成和使用

Linux 系統中可以使用 diff 命令對比出新舊軟件的不同,并生成補丁文件。

diff 命令基本格式為:

[root@localhost ~]# diff 選項 old new
#比較old和new文件的不同

此命令中可使用如下幾個選項:
  • -a:將任何文檔當作文本文檔處理;
  • -b:忽略空格造成的不同;
  • -B:忽略空白行造成的不同;
  • -I:忽略大小寫造成的不同;
  • -N:當比較兩個目錄時,如果某個文件只在一個目錄中,則在另一個目錄中視作空文件;
  • -r:當比較目錄時,遞歸比較子目錄;
  • -u:使用同一輸出格式;

從生成補丁文件,到使用其實現更新軟件的目的,為了讓讀者清楚地了解整個過程的來龍去脈,下面我們自己創建兩個文件(分別模擬舊軟件和新軟件),通過對比新舊文件生成補丁文件,最后利用補丁文件更新舊文件,具體步驟如下:
  1. 創建兩個文件,執行如下命令:

    [root@localhost ~]# mkdir test
    #建立測試目錄
    [root@localhost ~]# cd test
    #進入測試目錄
    [root@localhost test]# vi old.txt
    our
    school
    is
    lampbrother
    #文件old.txt,為了便于比較,將每行分開
    [root@localhost test]# vi new.txt
    our
    school
    is
    lampbrother
    in
    Beijing
    #文件new.txt

  2. 利用 diff 命令,比較兩個文件(old.txt 和 new.txt)的不同,并生成補丁文件(txt.patch),執行代碼如下:

    [root@localhost test]# diff -Naur /root/test/old.txt /root/test/new.txt > txt. patch
    #比較兩個文件的不同,同時生成txt.patch補丁文件
    [root@localhost test]#vi txt.patch
    #查看一下這個文件
    --/root/test/old.txt 2012-11-23 05:51:14.347954373 +0800
    #前一個文件
    + + + /root/test/new.txt 2012-11-23 05:50:05.772988210 +0800
    #后一個文件
    @@-2, 3+2, 5@@
    school
    is
    lampbrother
    +in
    +beijing
    #后一個文件比前一個文件多兩行(用+表示)

  3. 利用補丁文件 txt.patch 更新 old.txt 舊文件,實現此步操作需利用 patch 命令,該命令基本格式如下:

    [root@localhost test]# patch -pn < 補丁文件
    #按照補丁文件進行更新

    -pn 選項中,n 為數字(例如 p1、p2、p3 等),pn 表示按照補丁文件中的路徑,指定更新文件的位置。

    這里對 -pn 選項的使用做一下額外說明。我們知道,補丁文件是要打入舊文件的,但是當前所在目錄和補丁文件中記錄的目錄不一定是匹配的,需要 "-pn" 選項來同步兩個目錄。

    例如,當前位于 "/root/test/" 目錄下(要打補丁的舊文件就在當前目錄下),補丁文件中記錄的文件目錄為 "/root/test/dd.txt",如果寫入 "-p1"(在補丁文件目錄中取消一級目錄),那么補丁文件會打入 "root/test/root/test/old.txt" 文件中,這顯然是不對的;如果寫入的是 "-p2"(在補丁文件目錄中取消二級目錄),補丁文件會打入 "/root/test/test/old.txt" 文件中,這顯然也不對。如果寫入的是 "-p3"(在補丁文件目錄中取消三級目錄),補丁文件會打入 "/root/test/old.txt" 文件中,old.txt 文件就在這個目錄下,所以應該用 "-p3" 選項。

    如果當前所在目錄是 "/root/" 目錄呢?因為補丁文件中記錄的文件目錄為 "/root/test/old.txt",所以這里就應該用 "-p2" 選項(代表取消兩級目錄),補丁打在當前目錄下的 "test/old.txt" 文件上。

    因此,-pn 選項可以這樣理解,即想要在補丁文件中所記錄的目錄中取消幾個 "/",n 就是幾。去掉目錄的目的是和當前所在目錄匹配。

    現在更新 "old.txt" 文件,命令如下:

    [root@localhost test]# patch -p3 < txt.patch
    patching file old.txt
    #給old.txt文件打補丁
    [root@localhost test]# cat old.txt
    #查看一下dd.txt文件的內容
    our
    school
    is
    lampbrother
    in
    Beijing
    #多出了in Beijing兩行

    可以看到,通過使用補丁文件 txt.patch 對舊文件進行更新,使得舊文件和新文件完全相同。

通過這個例子,大家要明白以下兩點:
  1. 給舊文件打補丁依賴的不是新文件,而是補丁文件,所以即使新文件被刪除也沒有關系。
  2. 補丁文件中記錄的目錄和當前所在目錄需要通過 "-pn" 選項實現同步,否則更新可能失敗。

給apache打入補丁

本節仍以 apache 為例,通過從官網上下載的補丁文件 "mod_proxy_ftp_CVE-2008-2939.diff",更新 httpd-2.2.9 版本的 apache。

這里使用的補丁文件,修補了 apache 代理 FTP 站點時,模塊空指針引用拒絕服務攻擊的漏洞(了解即可,不用深究)。

具體更新步驟如下:
  1. 從 apache 官網上下載補丁文件;
  2. 復制補丁文件到 apache 源碼包解壓目錄中,執行命令如下:

    [root@localhost ~]# cp mod_proxy_ftp_CVE-2008-2939.diff httpd-2.2.9

  3. 給舊 apache 打入補丁,具體執行命令如下:

    [root@localhost ~]# cd httpd-2.2.9
    #進入apache源碼目錄
    [root@localhost httpd-2.2.9]# vi mod_proxy_ftp_CVE-2008-2939.diff
    #查看補丁文件
    --modules/proxy/mod_proxy_ftp.c (Revision 682869)
    + + + modules/proxy/mod_proxy_ftp.c (Revision 682870)
    …省略部分輸出…
    #查看一下補丁文件中記錄的目錄,以便一會兒和當前所在目錄同步
    [root@localhost httpd-2.2.9]# patch - p0 < mod_proxy_ftp_CVE-2008-2939.diff
    #打入補丁

    為什么是 "-p0" 呢?因為當前在 "/root/httpd-2.2.9" 目錄中,但補丁文件中記錄的目錄是 "modules/proxy/mod_proxy_ftp.c",就在當前所在目錄中,因此一個 "/" 都不需要去掉,所以是 "-p0"。
  4. 重新編譯 apache 源碼包,執行如下命令:

    [root@localhost httpd-2.2.9]# make

  5. 安裝 apache,執行如下命令:

    [root@localhost httpd-2.2.9]# make install


通過對比《Linux源碼包安裝和卸載》一節中安裝源碼包的過程,不難發現,打補丁更新軟件的過程比安裝軟件少了 "./configure" 步驟,且編譯時也只是編譯變化的位置,編譯速度更快。

注意,如果未安裝過 httpd-2.2.9,就需要先打入補丁,再依次執行 "./configure"、"make"、
"make install" 命令。


patch 命令不僅可以給就文件打入補丁,還可以執行反操作,即恢復用補丁文件修改過的源文件,例如:

[root@localhost httpd-2.2.9]# patch -R < modjDroxy_ftp_CVE-2008-2939.diff

-R(大寫)選項表示還原補丁。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo