1. 程式人生 > >Linux軟體包管理 RMP包管理

Linux軟體包管理 RMP包管理

RPM 包的命名一般都會遵守統一的命名規則,例如:

httpd-2.2.15-15.el6.centos.1.i686.rpm

其中的各項代表的含義如下:

  • httpd:軟體包名。
  • 2.2.15:軟體版本。
  • 15:軟體釋出的次數。
  • el6:軟體發行商。el6 是由 Red Hat 公司釋出的,適合在 RHEL 6.x (Red Hat Enterprise Unux) 和 CentOS 6.x 上使用。
  • i686:適合的硬體平臺。RPM 包可以在不同的硬體平臺上安裝,選擇適合不同 CPU 的軟體版本,可以最大限度地發揮 CPU 效能,所以出現了所謂的 i386(386 以上的計算機都可以安裝)、i586 (586 以上的計算機都可以安裝)、i686(奔騰II以上的計算機都可以安裝,目前所有的 CPU 是奔騰II以上的,所以這個軟體版本居多)、x86_64 (64 位 CPU 可以安裝)和 noarch(沒有硬體限制)等檔名。
  • rpm:RPM 包的副檔名。我們說過,Linux 下的檔案不是靠副檔名區分檔案型別的,也就是說 Linux 中的副檔名沒有任何含義。可是這裡怎麼又出現了副檔名呢?原因很簡單,如果不把 RPM 包的副檔名叫作".rpm",那麼管理員很難知道這是一個 RPM 包,當然也就無法正確安裝了。換句話說,如果 RPM 包不用".rpm"作為副檔名,那麼系統可以正確識別,但是管理員很難識別這是一個什麼樣的軟體。

注意,我們把 httpd-2.2.15-15.el6.centos.1.i686.rpm 叫作包全名,而把 httpd 叫作包名。為什麼要做出特殊說明呢?因為有些命令後面一定跟的是包全名,如安裝和升級;而有些命令後面一定跟的是包名,如查詢和解除安裝。如果弄錯,命令就會報錯。

RPM 包預設安裝路徑

RPM 包一般採用系統預設路徑安裝,而原始碼包一般通過手工指定安裝路徑(一般安裝到 /usr/local/ 中)安裝。
RPM 包預設安裝路徑是可以通過命令査詢的,一般安裝在如表 1 所示的目錄中。

表 1 RPM包預設安裝路徑
安裝路徑 含 義
/etc/ 配置檔案安裝目錄
/usr/bin/ 可執行的命令安裝目錄
/usr/lib/ 程式所使用的函式庫儲存位置
/usr/share/doc/ 基本的軟體使用手冊儲存位置
/usr/share/man/ 幫助檔案儲存位置


RPM 包也可以手工指定安裝路徑,但是一旦手工指定安裝路徑,所有的安裝檔案就會安裝到手工指定位置,而不會安裝到系統預設位置。而系統的預設搜尋位置並不會改變,依然會去預設位置之下搜尋,當然系統就不能直接找到所需的檔案,也就失去了作為系統預設安裝路徑的一些好處。所以我們一般不會指定 RPM 包的安裝路徑,而使用預設安裝路徑。

RPM包的安裝

[[email protected] ~]# rpm -ivh 包全名
#注意一定是包全名。如果是跟包全名的命令,則要注意路徑,因為軟體包在光碟當中

選項:

  • -i:安裝(install);
  • -v:顯示更詳細的資訊(verbose);
  • -h:列印 #,顯示安裝進度(hash);

例如,安裝 apache 軟體包,注意出現兩個 100% 才是正確安裝,第一個 100% 僅是在準備,第二個 100% 才是正確安裝。如下所示:

[[email protected] ~]# rpm -ivh \
/mnt/cdrom/Packages/httpd-2.2.15-15.el6.centos.1.i686.rpm
Preparing...
####################
[100%]
1:httpd
####################
[100%]

如果打算同時安裝多個軟體包呢?可以用一條命令同時安裝,將多個軟體包用空格分開就可以了。

[[email protected] ~]# rpm -ivh a.rpm b.rpm c.rpm
#一次安裝多個軟體包

如果還有其他安裝要求,比如想強制安裝某個軟體包而不管它是否有依賴性,就可以通過選項進行調整:

  • -nodeps:不檢測依賴性安裝。軟體安裝時會檢測依賴性,確定所需的底層軟體是否安裝,如果沒有安裝則會報錯。如果不管依賴性,想強制安裝,則可以使用這個選項。注意:這樣不檢測依賴性安裝的軟體基本上是不能使用的,所以不建議這樣做。
  • -replacefiles:替換檔案安裝。如果要安裝軟體包,但是包中的部分檔案已經存在,那麼在正常安裝時會報"某個檔案已經存在"的錯誤,從而導致軟體無法安裝。使用這個選項可以忽略這個報錯而覆蓋安裝。
  • -replacepkgs:替換軟體包安裝。如果軟體包已經安裝,那麼此選項可以把軟體包重複安裝一遍。
  • -force:強制安裝。不管是否已經安裝,都重新安裝。也就是-replacefiles和-replacepkgs的綜合。
  • -test:測試安裝。不會實際安裝,只是檢測一下依賴性。
  • -prefix:指定安裝路徑。為安裝軟體指定安裝路徑,而不使用預設安裝路徑。注意:如果指定了安裝路徑,軟體沒有安裝到系統預設路徑中,那麼系統會找不到這些安裝的軟體,需要進行手工配置才能被系統識別。所以,我們一遍採用預設路徑安裝RPM包。

 

注意,RPM 包預設儲存在系統光碟的 Packages(注意 P 大寫)目錄中,所以在安裝軟體前需要掛載光碟。例如:

mkdir/mnt/cdrom <-建立掛載點
mount /dev/cdrom /mnt/cdrom <-掛載光碟

我們一直在說依賴性很麻煩,那麼依賴性報錯是什麼樣呢?我們來繼續說說 gcc 這個軟體,剛剛我們在寫 hello.c 的時候假設這個軟體已經安裝成功了。其實,如果採用"基本伺服器"方式安裝 Linux 系統,那麼 gcc 這個軟體是沒有安裝的,需要我們手工安裝,但是安裝這個軟體是會報依賴性錯誤的。

[[email protected] ~]# rpm -ivh /mnt/cdrom/Packages/ gcc-4.4.6-4.el6.i686.rpm
error: Failed dependencies: <―依賴性錯誤
cloog-ppi >= 0.15 is needed by gcc-4.4.6-4.el6.i686
cpp = 4.4.6-4.el6 is needed by gcc-4.4.6-4.el6.i686
glibc-devel >= 2.2.90-12 is needed by gcc-4.4.6-4.el6.i686

這裡的依賴性很明顯,需要我們先安裝 cloog-ppl、cpp 和 glibc-devel 三個軟體,其中:

  • ">="表示版本要大於或等於所顯示版本;
  • "<="表示版本要小於或等於所顯示版本;
  • "="表示版本要等於所顯示版本;


我們當然可以手工安裝,只是比較麻煩。那麼,有辦法讓它自動解決依賴性,直接安裝嗎?有,我們可以使用 yum 線上安裝工具,它會自動安裝依賴的軟體,幫助我們解決依賴性。所以,再賣一個關子,我們不在這裡安裝 gcc,留到安裝 yum 的時候讓 gcc 自動安裝。

RPM包的升級

[[email protected] ~]# rpm -Uvh 包全名

選項:

  • -U(大寫):升級安裝。如果沒有安裝過,則系統直接安裝。如果安裝過的版本較低,則升級到新版本(upgrade);

[[email protected] ~]# rpm -Fvh 包全名

選項:

  • -F(大寫):升級安裝。如果沒有安裝過,則不會安裝。必須安裝有較低版本才能升級(freshen);

RPM包解除安裝

解除安裝是有依賴性的。比如,在安裝的時候,要先安裝 httpd 軟體包,再安裝 httpd 的功能模組 mod_ssl 包。那麼,在解除安裝的時候,一定要先解除安裝 mod_ssl 軟體包,再解除安裝 httpd 軟體包,否則就會報錯。軟體包解除安裝和拆除大樓是一樣的,你要拆除 2 樓和 3 樓,一定要先拆除 3 樓。

刪除格式非常簡單,如下:

[[email protected] ~]# rpm -e 包名

選項:

  • -e 解除安裝(erase);


如果不按依賴性解除安裝,就會報依賴性錯誤。例如:

[[email protected] ~]# rpm -e httpd
error: Failed dependencies:
httpd-mmn = 20051115 is needed by (installed) mod_wsgi-3.2-1.el6.i686
httpd-mmn = 20051115 is needed by (installed) php-5.3.3-3.el6_2.8.i686
httpd-mmn = 20051115 is needed by (installed) mod_ssl-1:2.2.15-15.el6.
centos.1.i686
httpd-mmn = 20051115 is needed by (installed) mod_perl-2.0.4-10.el6.i686
httpd = 2.2.15-15.el6.centos.1 is needed by (installed) httpd-manual-2.2.
15-15.el6.centos.1 .noarch
httpd is needed by (installed) webalizer-2.21_02-3.3.el6.i686
httpd is needed by (installed) mod_ssl-1:2.2.15-15.el6.centos.1.i686
httpd=0:2.2.15-15.el6.centos.1 is needed by(installed)mod_ssl-1:2.2.15-15.el6.centos.1.i686

當然,解除安裝命令是支援"--nocteps"選項的,可以不檢測依賴性直接解除安裝。但是,如果這樣做,則很可能導致其他軟體包無法正常使用,所以並不推薦這樣解除安裝。

Linux rpm命令查詢軟體包

 RPM 包管理系統是非常強大和方便的包管理系統,它比原始碼包的方便之處就在於可以使用命令查詢、升級和解除安裝。在查詢的時候,其實是在查詢 /var/lib/rpm/ 這個目錄下的資料庫檔案,那為什麼不直接檢視這些檔案呢?你可以嘗試使用 Vim 檢視這些檔案,會發現都是亂碼。也就是說,這些檔案其實都是二進位制檔案,不能直接用編輯器檢視,所以才需要使用命令檢視。

查詢命令的格式

RPM 查詢命令採用如下格式:

[[email protected] ~]# rpm 選項 查詢物件

查詢軟體包是否安裝

可以查詢軟體包是否安裝,命令格式如下:

[[email protected] ~]# rpm -q 包名

選項:

  • -q:查詢(query)


例如,檢視一下 apache 包是否安裝,可以執行如下命令:

[[email protected] ~]# rpm -q httpd
httpd-2.2.15-15.el6.centos.1.i686

因為 apache 是已經安裝完成的包,所以只需要給出"包名",系統就可以識別。而沒有安裝的包就必須使用"絕對路徑+包全名"格式才可以確定包。前面一直強調的包名和包全名不能寫混亂就是這個原因。

查詢系統中的所有安裝軟體包

可以查詢 Linux 系統中所有已經安裝的軟體包,命令格式如下:

[[email protected] ~]# rpm -qa
libsamplerate-0.1.7-2.1.el6.i686
startup-notification-0.10-2.1.el6.i686
gnome-themes-2.28.1-6.el6.noarch
fontpackages-filesystem-1.41-1.1.el6.noarch
gdm-libs-2.30.4-33.el6_2.i686
gstreamer-0.10.29-1.el6.i686
redhat-lsb-graphics-4.0-3.el6.centos.i686
…省略部分輸出…

當然,可以用管道符來檢視所需的內容,比如:

[[email protected] ~]# rpm -qa | grep httpd
httpd-devel-2.2.15-15.el6.centos.1.i686
httpd-tools-2.2.15-15.el6.centos.1.i686
httpd-manual-2.2.15-15.el6.centos.1.noarch
httpd-2.2.15-15.el6.centos.1.i686

你會發現,使用"rpm-q包名"只能檢視這個包是否安裝,但是使用"rpm-qa|grep 包名"會把包含包名稱的所有包都列出來。

查詢軟體包的詳細資訊

可以查詢已經安裝的某個軟體包的詳細資訊,命令格式如下:

[[email protected] ~]# rpm -qi 包名

選項:

  • -i:查詢軟體資訊(information)


例如,檢視 apache 包的安裝資訊,可以使用以下命令:

[[email protected] ~]# rpm -qi httpd
Name : httpd Relocations:(not relocatable)
#包名
Version : 2.2.15 Vendor:CentOS
#版本和廠商
Release : 15.el6.centos.1 Build Date: 2012年02月14日星期二 06時27分1秒
#發行版本和建立時間
Install Date: 2013年01月07日星期一19時22分43秒
Build Host:
c6b18n2.bsys.dev.centos.org
#安裝時間
Group : System Environment/Daemons Source RPM:
httpd-2.2.15-15.el6.centos.1.src.rpm
#組和源RPM包檔名
Size : 2896132 License: ASL 2.0
#軟體包大小和許可協議
Signature :RSA/SHA1,2012年02月14日星期二 19時11分00秒,Key ID
0946fca2c105b9de
#數字簽名
Packager:CentOS BuildSystem <http://bugs.centos.org>
URL : http://httpd.apache.org/
#廠商網址
Summary : Apache HTTP Server
#軟體包說明
Description:
The Apache HTTP Server is a powerful, efficient, and extensible web server.
#描述

通過這條命令可以看到包名、版本、發行版本、安裝時間,軟體包大小等資訊。

不僅如此,還可以查詢還沒有安裝的軟體包的詳細資訊,命令格式如下:

[[email protected] ~]# rpm -qip 包全名

選項:

  • -p:查詢沒有安裝的軟體包(package)


注意,沒有安裝的軟體包是存放在光碟中的,而且因為沒有安裝,所以需要使用包全名。

查詢軟體包中的檔案列表

可以查詢已經安裝的軟體包中的檔案列表和安裝的完整目錄,命令格式如下:

[[email protected] ~]# rpm -ql 包名

選項:

  • -l:列出軟體包中所有的檔案列表和軟體所安裝的目錄(list)


例如,想要檢視一下問 apache 包檔案的安裝位置,可以執行如下命令:

[[email protected] ~]# rpm -ql httpd

那麼,可以查詢還沒有安裝的軟體包中的檔案列表和打算安裝的位置嗎?答案是可以,命令格式如下:

[[email protected] ~]# rpm -qlp 包全名

選項:

  • -p:查詢沒有安裝的軟體包資訊(package)


想要查詢還沒有安裝的 bind 軟體包中的檔案列表和打算安裝的位置,可以執行如下命令:

[[email protected] ~]# rpm -qlp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm

查詢系統檔案屬於哪個RPM包

既然可以知道每個 RPM 包中的檔案的安裝位置,那麼可以查詢系統檔案屬於哪個 RPM 包嗎?當然可以,不過需要注意的是,手工建立的檔案是不能查詢的,因為這些檔案不是通過 RPM 包安裝的,當然不能反向查詢它屬於哪個 RPM 包。

命令格式如下:

[[email protected] ~]# rpm -qf 系統檔名

選項:

  • -f:查詢系統檔案屬於哪個軟體包(file)


想查詢一下 ls 命令是由哪個軟體包提供的,可以執行如下命令:

[[email protected] ~]# rpm -qf /bin/ls
coreutils-8.4-19.el6.i686

查詢軟體包所依賴的軟體包

查詢系統中和已經安裝的軟體包有依賴關係的軟體包,命令格式如下:

[[email protected] ~]# rpm -qR 包名

選項:

  • -R:查詢軟體包的依賴性(requires)

例如,想查詢一下 apache 包的依賴包,可以執行如下命令:

[[email protected] ~]# rpm -qR httpd

可以查詢沒有安裝的軟體包的依賴性嗎?加"-p"選項即可。例如,檢視一下還沒有安裝的 bind 軟體包的依賴包,可以執行如下命令:

[[email protected] ~]# rpm -qRp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm