1. 程式人生 > >Linux yum原始碼包安裝和解除安裝

Linux yum原始碼包安裝和解除安裝

Linux 下的絕大多數原始碼包都是用 C 語言編寫的,還有少部分是用 C++ 等其他程式語言編寫的。所以,要想安裝原始碼包,必須安裝 C 語言編譯器 gcc(如果是用 C++ 編寫的程式,則還需要安裝 gcc-c++)。

我們可以先檢測一下 gcc 是否已經安裝,命令如下:

[[email protected] ~]# rpm -q gcc
gcc-4.4.6-4.el6.i686

如果沒有安裝 gcc,則推薦大家採用 yum 安裝方式安裝。因為如果手工使用 rpm 命令安裝,那麼 gcc 所依賴的包太多了。命令如下:

[[email protected]

yum.repos.d]#yum -y install gcc

有了編譯器,還需要考慮一個問題:剛剛寫的"hello.c"只有一個原始碼檔案,所以我們可以利用 gcc 手工編譯。但是真正釋出的原始碼包軟體內的原始碼檔案可能有成百上千個,而且這些檔案之間都是有聯絡的,編譯時有先後順序。如果這樣的原始碼檔案需要手工編譯,光想想就是一項難以完成的工作。

這時就需要 make 命令來幫助我們完成編譯,所以make也是必須安裝的。我們也需要査看一下 make 是否已經安裝,命令如下:

[[email protected] yum. repos.d]# rpm -q make
make-3.81-20.el6.i686

原始碼包的獲取

RPM 包是儲存在 CentOS 6.3 的安裝光碟中的,那麼原始碼包從哪裡來呢?從官方網站上下載,我們依然以下載和安裝 apache 為例。

原始碼包安裝

在安裝之前,我們先來解釋一下原始碼包的安裝注意事項:

  • 軟體包是從網際網路上下載的。比如 apache 是從北京理工大學開源軟體映象服務網站上下載的。
  • 下載的軟體包格式。下載格式一般都是壓縮格式,常見的是".tar.gz"或".tar.bz2",選擇你習慣的格式下載即可。
  • 下載之後的原始碼儲存位置。Linux 是一個非常嚴謹的作業系統,每個目錄的作用都是固定而且明確的,作為管理員,養成良好的操作習憤非常重要,在正確的目錄中儲存正確的資料就是一個約定俗成的習慣。系統中儲存原始碼的位置主要有兩個:"/usr/src"和 "/usr/local/src"。其中,"/usr/src"用來儲存核心原始碼,"/usr/local/src"用來儲存使用者下載的原始碼。
  • 軟體安裝位置。我們剛說了 Linux 非常注意每個目錄的作用,所以安裝軟體也有預設目錄,即"/usr/local/軟體名"。我們需要給安裝的軟體包單獨規劃一個安裝目錄,以便於管理和解除安裝。想象一下,如果我把每個軟體都安裝到"/usr/local/"目錄下,但是沒有給每個軟體單獨分配安裝目錄,那麼以後還能分清哪 個軟體是哪個軟體嗎?這樣一來也就不能正確地解除安裝軟體了。
  • 軟體安裝報錯。原始碼包如果安裝不報錯,那麼安裝還是很方便的。但是報錯後的排錯對剛學習的人來說還是有難度的,不過我們先要知道什麼樣的情況是報錯。報錯有兩個典型特點,這兩個特點必須都具備才是報錯:其一是出現"error"或"warning"字樣;其二是安裝過程停止。如果沒有停止但是出現警告資訊,那麼軟體中的部分功能不能使用,而不是報錯。

安裝步驟

我們來解釋一下原始碼包安裝的具體步驟:
1) 下載軟體包。

2) 解壓縮。

3) 進入解壓目錄。

4) ./configure 軟體配置與檢查。這一步主要有三個作用:

  1. 在安裝之前需要檢測系統環境是否符合安裝要求。
  2. 定義需要的功能選項。"./configure"支援的功能選項較多,可以執行"./configure--help"命令査詢其支援的功能。一般都會通過"./configure--prefix=安裝路徑"來指定安裝路徑。
  3. 把系統環境的檢測結果和定義好的功能選項寫入 Makefile 檔案,後續的編譯和安裝需要依賴這個檔案的內容。

需要注意的是,configure 不是系統命令,而是原始碼包軟體自帶的一個指令碼程式,所以必須採用"./configure"方式執行("./"代表在當前目錄下)。

5) make編譯。make 會呼叫 gcc 編譯器,並讀取 Makefile 檔案中的資訊進行系統軟體編譯。編譯的目的就是把原始碼程式轉變為能被 Linux 識別的可執行檔案,這些可執行檔案儲存在當前目錄下。程式設計過程較為耗時,需要有足夠的耐心。

6) make clean:清空編譯內容(非必需步驟)。如果在"./configure"或"make"編譯中報錯,那麼我們在重新執行命令前一定要記得執行 make clean 命令,它會清空 Makefile 檔案或編譯產生的".o"頭文 件。

7) make install:安裝。這才是真正的安裝過程,一般會寫清楚程式的安裝位置。如果忘記指定安裝目錄,則可以把這個命令的執行過程儲存下來,以備將來刪除使用。

舉例安裝apache

1) 下載。

2) 解壓縮。

[[email protected] ~]#tar -zxvf httpd-2.2.9.tar.gz|more


3) 進入解壓目錄。

[[email protected] ~]# ls
anaconda-ks.cfg httpd-2.2.9 httpd-2.2.9.tar.gz install.log install.log.syslog
[[email protected] ~]# cd httpd-2.2.9


4) 軟體配置。

[[email protected] httpd-2.2.9]# ./configure --prefix=/usr/local/apache2
checking for chosen layout...Apache
checking for working mkdir -p…yes
checking build system type...i686-pc-linux-gnu
checking host system type...i686-pc-linux-gnu
checking target system typa...i686-pc-linux-gnu
…省略部分輸出…

選項:

  • --prefix: 指定安裝目錄


這裡的安裝選項沒有載入其他功能,只是指定安裝目錄。"/usr/local/apache2"目錄不需要手工建立,安裝完成後會自動建立,這個目錄是否生成也是檢測軟體是否正確安裝的重要標誌。

當然,在配置之前也可以查詢一下 apache 支援的選項功能,命令如下:

[[email protected] httpd-2.2.9]#./configure --help|more
#查詢apache支援的選項功能(不是必需步驟)


5) 編譯。

[[email protected] httpd-2.2.9]# make

這一步命令較為簡單,醒編譯時間賬,主要作用是把原始碼檔案轉換為二進位制檔案。

6)安裝。

[[email protected] httpd-2.2.9]# make install

如果不報錯,這一步完成後就安裝成功了。

原始碼包解除安裝

我們在說原始碼包解除安裝之前,先回顧一下 Windows 系列作業系統中的軟體解除安裝。在 Windows 系統中是不能用滑鼠右鍵單擊安裝之後的軟體,選擇直接刪除的,因為這樣做會遺留大量的垃圾檔案。這些垃圾檔案越多,會導致 Window 系統越不穩定。

那麼, Linux 中刪除原始碼包應該怎樣操作呢?太簡單了,只要找到軟體的安裝位置,然後直接刪除就可以了。比如刪除 apache,只需執行如下命令即可,而且不會遺留任何垃圾檔案。

[[email protected] ~]# rm -rf /usr/local/apache2/

如果 apache 服務啟動了,那麼,記得先停止服務再刪除。

 

Linux原始碼包升級

我們的軟體如果進行了資料更新,那麼是否需要先把整個軟體解除安裝,然後重新安裝呢?當然不需要,我們只需要下載補丁、打上補丁,重新編譯和安裝就可以了(不用 ./configured 成新的 Makefile 檔案,make 命令也只是重新編譯資料),速度回比重新安裝一次快得多。

補丁的生成與使用

怎麼知道兩個軟體之間的不同呢?難道需要手工比對兩個軟體嗎?當然不是,Linux 有 diff 命令用來比較兩個軟體的不同,當然也是利用這個命令生成補丁檔案的。那麼我們先看看這個命令的格式:

[[email protected] ~]# diff 選項 old new
#比較old和new檔案的不同

選項:

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


我們舉一個簡單的例子,來看看補丁是怎麼來的,然後應用一下這個補丁,看看有什麼效果,這樣就可以說明補丁的作用了。先寫兩個檔案,命令如下:

[[email protected] ~]# mkdir test
#建立測試目錄
[[email protected] ~]# cd test
#進入測試目錄
[[email protected] test]# vi old.txt
our
school
is
lampbrother
#檔案old.txt,為了便於比較,將每行分開
[[email protected] test]# vi new.txt
our
school
is
lampbrother
in
Beijing
#檔案new.txt

比較一下兩個檔案的不同,並生成補丁檔案"txt.patch",命令如下:

[[email protected] test]# diff -Naur /root/test/old.txt /root/test/new.txt > txt. patch
#比較兩個檔案的不同,同時生成txt.patch補丁檔案
[[email protected] 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, [email protected]@
school
is
lampbrother
+in
+beijing
#後一個檔案比前一個檔案多兩行(用+表示)

既然"new.txt"比"old.txf檔案多了兩行,那麼我們能不能讓"old.txt"檔案按照補丁檔案"txt.patch"進行更新呢?當然可以,使用命令 patch 即可。命令格式如下:

[[email protected] test]# patch -pn < 補丁檔案
#按照補丁檔案進行更新

選項:

  • -pn:n為數字。代表按照補丁檔案中的路徑,指定更新檔案的位置;


"-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"檔案,命令如下:

[[email protected] test]# patch -p3 < txt.patch
patching file old.txt
#給old.txt檔案打補丁
[[email protected] test]# cat old.txt
#檢視一下dd.txt檔案的內容
our
school
is
lampbrother
in
Beijing
#多出了in Beijing兩行

注意以下兩點:

  1. 給舊檔案打補丁依賴的不是新檔案,而是補丁檔案,所以即使檔案被刪除也沒有關係。
  2. 補丁檔案中記錄的目錄和你當前所在目錄是需要通過"-pn"選項來同步的。

給apache打入補丁

我們再舉一個實際的例子。前面章節中我們安裝了 httpd-2.2.9 這個版本的程式,在官網上有這個版本的一個補丁"mod_proxy_ftp_CVE-2008-2939.diff",這個補丁修補了 apache 代理 FTP 站點時,模組空指標引用拒絕服務攻擊的漏洞。下面我們來看看如何安裝這個補丁。

1) 下載補丁檔案

2) 把補丁檔案複製到 apache 原始碼包解壓目錄中

[[email protected] ~]# cp mod_proxy_ftp_CVE-2008-2939.diff httpd-2.2.9


3) 打入補丁

[[email protected] ~]# cd httpd-2.2.9
#進入apache原始碼目錄
[[email protected] 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)
…省略部分輸出…
#檢視一下補丁檔案中記錄的目錄,以便一會兒和當前所在目錄同步
[[email protected] 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) 重新編譯

[[email protected] httpd-2.2.9]# make


5) 重新安裝

[[email protected]lhost httpd-2.2.9]# make install

打補丁的方法會比重新安裝少了"./configure"步驟,而且編譯時也只是編譯變化的地方,所以編譯速度也更快。但是如果沒有安裝過 httpd-2.2.9,就需要先打入補丁,再依次執行"./configure" "make" "make install"命令。

如果我不想要補丁中的內容呢?可以恢復嗎?當然可以,命令如下:

[[email protected] httpd-2.2.9]# patch -R < modjDroxy_ftp_CVE-2008-2939.diff

選項:

    • -R:還原補丁