在RHEL系列的Linux中安裝軟件包,一般來說分爲三種方式,rpm/yum/編譯安裝。
1. rpm
rpm自不必說,在RHEL系列的Linux中提供的軟件包大多都是以.rpm後綴結尾的格式提供的。比起編譯源碼包來說確實方便很多,但是linux中的軟件包往往存在複雜的依賴關係,而rpm並不能自動解決依賴關係,這讓rpm使用起來很不方便。因此真實場景中很少會用rpm去安裝軟件包,這並不說rpm沒什麼用,事實上yum的廣泛使用正是依賴於rpm建立的軟件包信息庫,也正因爲它提供了這樣一個信息庫,我們可以用它去查詢軟件包信息。
```
# 查詢軟件基本信息
[root@localhost ~]# rpm -qi httpd
# 查詢軟件配置文件
[root@localhost ~]# rpm -qc httpd
# 查詢軟件文檔文件
[root@localhost ~]# rpm -qd httpd
```
rpm的基本用法可見此[鏈接],詳細用法看man手冊。
2. yum
yum就是爲了解決rpm包的依賴關係問題而生的,它是一個C/S架構的。在服務器端建立rpm包倉庫,並通過ftp/http/nfs等網絡協議發佈出來,在客戶端配置訪問倉庫的URL路徑,安裝過程yum自動解決依賴關係,然後去包倉庫找到相應的包下載下來按依賴的先後順序安裝。
也可以在客戶端將系統安裝光盤掛載至文件系統某目錄下,將其作爲服務器端包倉庫。
yum的基本用法可見此[鏈接],詳細用法看man手冊。
客戶端配置包倉庫的最簡模式如下:
```
[base]
name=Local repo on dvd rom
http://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
gpgcheck=0
enabled=1
```
詳細配置參數見man手冊
```
man yum.conf
```
這裏想指出一個在服務端製作包倉庫時需要注意的一個問題。製作包倉庫是使用createrepo這個命令將倉庫中所有的rpm包的元數據信息抽取出來。客戶端訪問倉庫是需要先下載倉庫的元數據信息的,然後根據這些信息去下載包。元數據信息中就有每個rpm包通過單向加密算法計算出來的特徵碼(也叫做指紋信息),它是用來防止傳輸過程中包不完整或者被篡改的。
而這個單向加密算法,在5系列以前的使用的是sha1算法,而6和7系列中默認使用sha256算法,可手動指定爲sha1算法。因此這就存在一個問題,在6或7系列上創建倉庫給5系列機器用時如果沒有手動指定加密算法爲sha1,那麼5系列的機器下載下來的元數據信息所使用的加密算法就會使sha256算法,而5系列的機器的yum使用的是sha1算法,沒有辦法匹配。
因此在6或7系列機器上創建給5系列機器使用的倉庫時需要指定加密算法爲sha1。而反之是不需要的,高版本的yum設計時考慮了後向兼容。
```
[root@localhost repo]# createrepo -s sha ./
```
另外,因爲元數據信息中記錄的是倉庫中所有rpm包的信息,那麼更新或者增加了包,需要相應地更新元數據信息。
```
[root@localhost repo]# createrepo --update ./
```
3. 編譯安裝
當有些軟件沒有rpm包提供,或者以rpm包形式提供的時候有一些特性沒有啓用,或者開啓業務無關但相當消耗資源的特性時,就需要用手動編譯源代碼的方式安裝軟件了。
編譯安裝一般來說是三個步驟
```
./configure prefix=/usr/local
make
make install
```
configure是配置文件,可以指定安裝路徑,啓用或關閉某些特性,指定額外的編譯參數等等,用來生成Makefile文件。
make,安裝Makefile中描述的代碼組織邏輯去調用編譯器、鏈接器等去完成軟件編譯。
make install, 將編譯好的文件安裝到指定目錄,修改用戶/組,權限等等。
編譯安裝一般會將文件安裝到某一指定目錄中,這樣卸載時只需要刪除整個目錄即可卸載乾淨。
而這種用戶自己指定的目錄一般不會加入系統環境變量,使用起來不方便,因此軟件安裝完成後一般還需要以下四步。
導出二進制文件路徑至PATH環境變量中。
```
[root@localhost ~]# echo "export PATH=/PATH/TO/BIN:$PATH" > /etc/profile.d/NAME.sh
```
導出庫文件路徑,並讓系統重新生成緩存。
```
[root@localhost ~]# echo "/PATH/TO/LIB" > /etc/profile.d/ld.so.conf.d/NAME.conf
[root@localhost ~]# ldconfig -v
```
導出頭文件。
```
[root@localhost ~]# ln -sv /PATH/TO/INCLUDE /usr/include
```
導出幫助手冊。
```
[root@localhost ~]# echo "MANDATORY_MANPATH /PATH/TO/MAN" /etc/man_db.conf
```