rpm

運維記錄:

rpm -qf which 程序名

[root@localhost /]# rpm -qf `which python`
python-2.6.6-36.el6.x86_64

rpm -i 它做了什麼

一說到rpm,人們第一時間想到的就是rpm能用來安裝軟件。正如我們前面提及到的,安裝軟件時一個複雜的,經常出錯的事情,但在rpm眼中,安裝軟件只不過是一個命令的事。

rpm -i (等同於rpm –install)命令能夠安裝已經被打包成rpm格式的軟件,它主要做以下幾件事:

依賴檢查.

檢測衝突

做一些正式安裝前必須做的準備工作

根據配置文件確定如何安裝軟件

解壓包並把它們放在一個合適的路徑下

執行一些在安裝後須要做的工作

對它自身的所作所爲進行跟蹤

下面將逐個解釋上述所述的幾點:

依賴檢查

有時候,一些安裝包須要在它所依賴的安裝包安裝好了之後才能正常安裝。RPM將會確認所需安裝軟件的依賴包已經安裝好了,它也會保證安裝軟件包時不影響其它已經安裝好的軟件。

檢測衝突

RPM在這個階段將會進行一系列檢測,如果試圖安裝一個已經安裝過的軟件,或者用舊版本覆蓋新版本的軟件,或者是非法改寫某個已安裝軟件的軟件。這些RPM都能檢測出來並及時制止。
做一些正式安裝前必須做的準備工作

一些命令必須在正式軟件安裝開始之前優先執行,RPM將會執行你所定義的這些命令,這樣能夠避免在安裝時遇到很多問題。

根據配置文件確定如何安裝軟件

RPM與其他包管理軟件不同的一點是,它會使用配置文件,儘管有時候改變配置文件只是爲了個性化地安裝軟件,但這會激怒你的小夥伴,因爲他們之前所做的一些個性化配置全都沒了。而RPM會分析配置文件,並嘗試去做正確的事,即使這些軟件一開始並不是使用RPM安裝的。
解壓包並把它們放在一個合適的路徑下

每個安裝包都會包含許多待安裝的文件,並且包含了每個文件需要被安裝到哪個目錄下,而且,文件的其他一些屬性,例如權限和所有者,RPM都會進行正確的設置。
執行一些在安裝後須要做的工作

有時候,需要在軟件安裝後執行一些命令。比如說,執行ldconfig命令來使一些庫變成公用的。
對它自身的所作所爲進行跟蹤

每當RPM把軟件安裝到你的系統上後,它會在數據庫中保留對文件的跟蹤,數據庫中存儲了大量有用的信息,例如,當RPM檢測衝突時,它就會使用到它存儲在數據庫中的信息

RPM安裝實戰

讓我們來看看一個例子,安裝一個軟件,你只需要使用命令 rpm -i ,命令後跟着rpm包文件就可以:

# rpm -i eject-1.2-2.i386.rpm

這時候,上文中所提到的幾件事情在這個時候已經完成了。這個軟件包已經被安裝好了,需要注意的是,這裏的安裝包文件並不需要嚴格遵守rpm包的命名規範,例如:
# mv eject-1.2-2.i386.rpm baz.txt
# rpm -i baz.txt

在這個例子中,我們把rpm包的名字從eject-1.2-2.i386.rpm改爲了baz.txt,安裝結果將會和之前的安裝結果的一樣。rpm包的名字在RPM進行安裝時,將不會被使用。RPM用的是包裏的文件的內容,無論名字怎麼改,RPM始終都能讀取包裏的文件來實現正確安裝。

兩個有用的選項

有兩個選項,能夠幫助rpm -i 工作得更好,也很有用。你也許會意味它們是RPM的默認行爲,但實際上不是,只不過要使用它們,你得多打一些字:
使用 -v 選項得到更多的反饋

儘管rpm -i 已經做了很多事情,但是還不夠,不是嗎? 當進行安裝的時候,rpm表現得太安靜了,除非安裝過程中出了錯。不過我們可以通過加上 -v 選項來讓它輸出更多的# rpm -iv eject-1.2-2.i386.rpm
Installing eject-1.2-2.i386.rpm-v 好處是很多的,特別是當你需要用一行命令來安裝多個軟件的# rpm -iv *.rpm
Installing eject-1.2-2.i386.rpm
Installing iBCS-1.2-3.i386.rpm
Installing logrotate-1.0-1.i386.rpm者的福音 -h

有時候一個安裝包可能非常大,除了呆呆地看着硬盤的燈在閃,你找不到其他方式知道RPM的工作進度,還要多久才能安裝完。加上-h選項,RPM會打印出 # 來顯示進度,50個 # 的出現意味着安裝完成。

# rpm -ih eject-1.2-2.i386.rpm
##################################################

一旦50# 出先了,那麼就代表軟件已經完成,這一點在你安裝多個軟件時也很有用:

# rpm -ivh *.rpm
eject          ##################################################
iBCS           ##################################################
logrotate      ##################################################

更多rpm -i 的選項

-vv:得到更多的信息
--test:只進行安裝測試
--replacepkgs:覆蓋安裝
--replacefiles:即使覆蓋了其他軟件的文件,也照常安裝
--nodeps:安裝前不做依賴檢查
--force:無論怎樣,都給老子安裝
--excludedocs:不安裝文檔
--includedocs:安裝文檔
--prefix :重定向安裝包路徑爲
--noscripts:不執行安裝前後的腳本命令
--percent:顯示安裝進度的百分比
--rcfile :使用作爲備選的rcfile
--root:使用作爲備選的root
--dbpath :使用來訪問數據庫
--ftpport :使用所指定的端口來執行基於FTP協議的安裝
--ftpproxy :使用所指定的地址作爲FTP代理
--ignorearch:不校驗安裝包的格式
--ignoreos:不檢查安裝包的操作系統信息

faq

1.我的系統中安裝了那些rpm軟件包
rpm -qa 講列出所有安裝過的包

如果要查找所有安裝過的包含某個字符串sql的軟件包

rpm -qa |grep sql

2.如何獲得某個軟件包的文件全名
rpm -q mysql 可以獲得系統中安裝的mysql軟件包全名,從中可以獲得
當前軟件包的版本等信息。這個例子中可以得到信息mysql-3.23.54a-11
3.一個rpm包中的文件安裝到那裏去了?
rpm -ql 包名
注意這裏的是不包括.rpm後綴的軟件包的名稱
也就是說只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。
如果只是想知道可執行程序放到那裏去了,也可以用which,比如
which mysql
4.一個rpm包中包含那些文件
一個沒有安裝過的軟件包,使用rpm -qlp **.rpm
一個已經安裝過的軟件包,還可以使用rpm -ql **.rpm
5.如何獲取關於一個軟件包的版本,用途等相關信息?
一個沒有安裝過的軟件包,使用rpm -qip **.rpm
一個已經安裝過的軟件包,還可以使用rpm -qi **.rpm

6.某個程序是哪個軟件包安裝的,或者哪個軟件包包含這個程序
rpm -qf which 程序名 返回軟件包的全名
rpm -qif which 程序名 返回軟件包的有關信息
rpm -qlf which 程序名 返回軟件包的文件列表
注意,這裏不是引號,而是`,就是鍵盤左上角的那個鍵。
也可以使用rpm -qilf,同時輸出軟件包信息和文件列表
7.某個文件是哪個軟件包安裝的,或者哪個軟件包包含這個文件
注意,前一個問題中的方法,只適用與可執行的程序,而下面的方法,不僅可以
用於可執行程序,也可以用於普通的任何文件。前提是知道這個文件名。
首先獲得這個程序的完整路徑,可以用whereis或者which,然後使用rpm -qf例如:

# whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
# rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1
# rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1

總結:
獲得軟件包相關的信息用rpm -q,q表示查詢query,後面可以跟其他選項,比如
i 表示info,獲得軟件包的信息;
l 表示list,獲得文件列表;
a 表示all,在所有包中執行查詢;
f 表示file,根據文件進行相關的查詢;
p 表示package,根據軟件包進行查詢
需要的查詢條件可以使用grep產生,或者從”“中的命令行產生

6.關於rpm軟件包的一些相關知識

如何查看Centos版本

cat /etc/redhat-release 
CentOS release 6.4 (Final)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章