本次博客詳細的介紹了rpm命令的使用方法,作為軟體包管理最基本的命令,需要熟練的使用。 ...
我們日常在使用Windows的時候,如果要安裝某個軟體,最簡單的方法就是在程式包的官網直接下載軟體包到本地,一般是以.exe或者.msi格式的文件,然後一直下一步下一步就能安裝成功了,但是在使用linux的操作系統的時候也許不是這麼的友好,即使現在有的linux發行版也可以通過簡單的搜索點擊安裝來實現軟體包的安裝,但這並不一種很好的安裝方法,因為你必須安裝桌面環境,消耗和占用一定的記憶體資源,除非只是你日常使用。本次博客就如何使用rpm命令來實現centos上的軟體包的安裝與管理,rpm也許不是最明智的選擇,但是在學習yum之前,我們還是先來看一下rpm吧!
rpm包的組成和獲取路徑
程式包,簡單的來說就是將源代碼通過編譯器編譯成二進位格式的程式,然後將二進位程式、庫文件、配置文件和幫助文件組成為一個或者有限幾個“包”文件。
在不同的linux發行版上,提供的程式包的管理器並不是都相同的,比如debian系的使用的包管理器是dpkg(包文件尾碼名.deb),在rehat和SUSE系使用都是rpm( rpm is package manager),centos作為redhat的分支,自然使用的是rpm了,而這些包文件的尾碼名就是.rpm。
來看一下這些文件吧!(這裡使用grep顯示了包文件名中只含有yum的包名)
rpm包命名的格式:
先來看一下源代碼的命令格式,一般程式的官網會提供程式的源代碼文件,你可以通過源代碼編譯安裝:
zabbix-3.4.1.tar.gz
格式: name - version.tar.gzversion:major.minor.release
major:主版本號,源碼發生巨大的改變,則會改變;
minor:次版本號,源碼發生了較大的改變,則會改變;
release:發行號,當修複了很小的bug的時候,則會改變。
再來看一下包的命令格式:
yum-3.4.3-150.el7.centos.noarch.rpm
格式:name-VERSION-release.arch.rpm
VERSION為源碼的版本號;
releas為rpm包的發行號;
arch為包可以運行的平臺,如i386,x64(amd64),ppc,noarch(說明可以在不同的平臺上安裝)等。
如這裡的yum-3.4.3-150.el7.centos.noarch.rpm,yum為包名,3.4.3為源碼版本,el7.centos代表centos7,noarch說明你可以在不同的平臺上使用它。
從上面的圖上我們可以看到,除了一個以yum為名字的包以外還有很多其他包含yum的包,當我們安裝了這些包之後,可以為yum提供更多的額外的功能。
包文件的組成(每個包都是單獨實現的):
rpm包內的文件;
rpm的元數據,依賴關係,描述等;
安裝和卸載時候運行的腳本。
公共的資料庫(/var/lib/rpm):
程式包的名稱和版本;
依賴關係;
功能說明;
安裝生成的各文件的文件路徑及校驗碼信息。
依賴關係:
做為linux重要的哲學思想之一,單一程式的組合起來完成複雜的任務,rpm包之間也是這樣的,如果想要實現一個複製的功能,可能需要多個rpm包之間相互依賴才能實現,例如,你裝A軟體包,可能依賴於B包,那麼你就需要安裝B包,你安裝B包,可能又要依賴於C包,所以你在安裝A包的時候,就需要同時報B包和C包都裝上去。這樣一個一個安裝固然很浪費時間,所以linux也提供了一些前端工具來自動解決依賴關係:
yum:rhel系列系統上rpm包管理器的前段工具
apt-get:deb包管理器的前端工具
zypper:suse的rpm管理器前端工具
dnf:Fedora 22+系統上的rpm包管理器的前端工具。
獲取程式包的途徑
(1)系統發行版的光碟或官方的文件伺服器:
http://mirrors.aliyun.com, http://mirrors.sohu.com, http://mirrors.163.com (2)項目的官方站點(3)第三方組織
(a)EPEL (b)搜索引擎 http://pkgs.org http://rpmfind.net http://rpm.pbone.net(4) 毛爺爺說過:自己動手,豐衣足食!
rpm命令
centos上使用rpm命令來實現程式包的安裝、升級、卸載、查詢、校驗和資料庫的維護。
一、安裝
rpm {-i|--install} [install-options] PACKAGE_FILE ... 選項: -i,--install:安裝包 -v:verbose,詳細信息 -vv:更詳細的輸出 [install-options]: -h:hash marks輸出進度條,每個#表示2%的進度 --test:測試安裝,但是並沒有安裝,檢查並報告依賴關係及衝突消息等 --nodeps:忽略依賴關係安裝,不建議 --replacepkgs:重新安裝 --nosignature:不檢查包的簽名信息,不檢查來源合法性 --nodigest:不檢查包完整性信息 註意:rpm可以自帶腳本 總共有4類腳本: preinstall:安裝過程開始之前運行的腳本,%pre postinstall:安裝過程完成之後運行的腳本,%post preuninstall:卸載過程真正開始執行之前運行的腳本,%preun postuninstall:卸載過程完成之後運行的腳本,%postun --noscripts:不執行這四種腳本 --noper:不執行preinstall腳本 --nopost:不執行postinstall腳本 --nopreun:不執行preuninstall腳本 --nopostun:不執行postuninstall腳本
下麵我們來舉一些例子吧!
1.安裝zsh,並顯示詳細信息和進度條:
[root@localhost Packages]# rpm -ivh zsh-5.0.2-25.el7.x86_64.rpm #最常用的組合 -ivh Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-25.el7 ################################# [100%] [root@localhost Packages]#
2.修改zsh的配置文件,再執行重新安裝:
[root@localhost Packages]# rpm -i --replacepkgs zsh-5.0.2-25.el7.x86_64.rpm
說明重新安裝並不會覆蓋原有的配置文件。
3.忽略依賴性安裝
[root@localhost Packages]# rpm -i xterm-295-3.el7.x86_64.rpm #提示需要以下的capability才能安裝成功 error: Failed dependencies: libICE.so.6()(64bit) is needed by xterm-295-3.el7.x86_64 libXaw.so.7()(64bit) is needed by xterm-295-3.el7.x86_64 libXmu.so.6()(64bit) is needed by xterm-295-3.el7.x86_64 libXpm.so.4()(64bit) is needed by xterm-295-3.el7.x86_64 libXt.so.6()(64bit) is needed by xterm-295-3.el7.x86_64 [root@localhost Packages]# rpm -i --nodeps xterm-295-3.el7.x86_64.rpm #忽略依賴性關係安裝
二、升級
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ... 選項: -U:升級或安裝 -F:升級 [install-options]:支持安裝不部分的install-options --oldpackage:降級 --force:強制升級 註意:(1)不要對內核做升級操作,linux支持多內核版本並存,因此直接安裝新版本的內核 (2)如果某原程式包的配置文件安裝後曾被修改,升級時,新版本的程式提供的同一個配置文件不會覆蓋原有的配置文件。
三、卸載
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ... 選項: -e:卸載 --allmatches:卸載所有pip指定名稱的程式包的各個版本 --nodeps:忽略依賴關係 --test:測試卸載,dry run模式
舉例:
卸載zsh,卸載後被修改的配置文件會被保存為.rpmsave的文件。
[root@localhost Packages]# rpm -e zsh warning: /etc/zshrc saved as /etc/zshrc.rpmsave [root@localhost Packages]# [root@localhost Packages]# rpm -i zsh-5.0.2-25.el7.x86_64.rpm [root@localhost Packages]# [root@localhost Packages]# vim /etc/zshrc zshrc zshrc.rpmsave
四、查詢
rpm {-q|--query} [select-options] [query-options] -q:查詢操作 [select-options]: PACKGE_NAME:查詢指定的程式包是否已經按照及版本 -a,--all:查詢所有已經按照過得包 -f FILE:查詢指定的文件是由哪個程式包安裝生成的 -p,--packges PACKAGE_FILE:用戶實現對未安裝的程式包執行查詢操作 --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程式包提供 --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴 [query-options] --changelog:查詢rpm包的changelog -l,--list:程式包安裝生成的所有文件列表 -i,--info:程式包相關的信息,版本、大小、所屬包組等 -c,--configfiles:查詢指定的程式包提供的配置文件 -d,--docfiles:查詢指定的程式包提供的文檔 --provides:查詢指定程式包提供的所有的CAPABILITY -R,--requires:查詢指定的程式包的依賴關係 --scripts:查看程式包自帶的腳本片段
舉例:
[root@localhost Packages]# rpm -q zsh #查詢zsh是否被安裝 zsh-5.0.2-25.el7.x86_64 [root@localhost Packages]# rpm -qf /etc/zshrc #查詢/etc/zshrc是由哪個包安裝生成的 zsh-5.0.2-25.el7.x86_64 [root@localhost Packages]# rpm -q --changelog zsh #查詢zsh的修改日誌 * Thu Jul 14 2016 Kamil Dudka <[email protected]> - 5.0.2-25 - improve use of new command substitution in completion (#1356388) * Fri Jun 10 2016 Kamil Dudka <[email protected]> - 5.0.2-24 - fix off-by-one error in completion utility cache code (#1344599) * Mon May 23 2016 Kamil Dudka <[email protected]> - 5.0.2-23 - fix parse error on a script with unescaped exclamation mark (#1338689) ......(略) [root@localhost Packages]# rpm -ql zsh #查詢安裝zsh會生成的文件列表 /bin/zsh /etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc /usr/lib64/zsh /usr/lib64/zsh/5.0.2 ......(略) [root@localhost Packages]# rpm -qc zsh #查詢安裝zsh所生成的配置文件 /etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc [root@localhost Packages]# rpm -qd zsh #查詢安裝zsh所生成的文檔信息 /usr/share/doc/zsh-5.0.2/BUGS /usr/share/doc/zsh-5.0.2/CONTRIBUTORS /usr/share/doc/zsh-5.0.2/FAQ /usr/share/doc/zsh-5.0.2/FEATURES /usr/share/doc/zsh-5.0.2/LICENCE /usr/share/doc/zsh-5.0.2/MACHINES /usr/share/doc/zsh-5.0.2/NEWS ......(略) [root@localhost Packages]# rpm -q --provides zsh #查詢zsh所提供的CAPABILITY config(zsh) = 5.0.2-25.el7 zsh = 5.0.2-25.el7 zsh(x86-64) = 5.0.2-25.el7 [root@localhost Packages]# rpm -qR zsh #查詢zsh所依賴的CAPABILITY /bin/sh /bin/sh /bin/sh /bin/sh /bin/zsh /sbin/install-info /sbin/install-info config(zsh) = 5.0.2-25.el7 coreutils ......(略) [root@localhost Packages]# rpm -q --scripts zsh #查詢zsh的自定的腳本片段 postinstall scriptlet (using /bin/sh): if [ ! -f /etc/shells ] ; then echo "/bin/zsh" > /etc/shells else grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells fi if [ -f /usr/share/info/zsh.info.gz ]; then # This is needed so that --excludedocs works. /sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \ --entry="* zsh: (zsh). An enhanced bourne shell." fi : preuninstall scriptlet (using /bin/sh): if [ "$1" = 0 ] ; then if [ -f /usr/share/info/zsh.info.gz ]; then # This is needed so that --excludedocs works. /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir \ --entry="* zsh: (zsh). An enhanced bourne shell." fi fi : postuninstall scriptlet (using /bin/sh): if [ "$1" = 0 ] ; then if [ -f /etc/shells ] ; then TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX` grep -v '^/bin/zsh$' /etc/shells > $TmpFile cp -f $TmpFile /etc/shells rm -f $TmpFile fi fi [root@localhost Packages]# rpm -q --whatprovides 'config(zsh)' #查詢conig(zsh)是由哪個包提供的 zsh-5.0.2-25.el7.x86_64 [root@localhost Packages]# [root@localhost Packages]# rpm -q --whatrequires 'config(zsh)' #查詢config(zsh)被哪個包所依賴 zsh-5.0.2-25.el7.x86_64 [root@localhost Packages]# rpm -qpl zenity-3.8.0-5.el7.x86_64.rpm #這裡的zenity是沒有安裝的,可以直接加-p選項,進行查詢操作,查詢zenity安裝後生成的文件列表 /usr/bin/zenity /usr/share/doc/zenity-3.8.0 /usr/share/doc/zenity-3.8.0/AUTHORS /usr/share/doc/zenity-3.8.0/COPYING /usr/share/doc/zenity-3.8.0/NEWS ......(略) [root@localhost Packages]# rpm -qp --provides zenity-3.8.0-5.el7.x86_64.rpm #查詢zenity所提供的CAPABILITY zenity = 3.8.0-5.el7 zenity(x86-64) = 3.8.0-5.el7
五、 校驗
rpm {-V|--verify} [select-options] [verify-options] 選項: --nodeps:不檢查文件的依賴性關係 --nofiles:不檢查文件的任何屬性 --nosize:不檢查文件大小 --nouser:不檢查文件的屬主 --nogroup:不檢查文件的屬組 --nomtime:不檢查文件的時間戳
舉例:
[root@localhost Packages]# rpm -V zsh .......T. c /etc/zshrc #這裡表示時間戳有變,沒有任何輸出代表校驗成功 這裡的每個點代表一個校驗的類型: S file Size differs M Mode differs (includes permissions and file type) 5 digest (formerly MD5 sum) differs D Device major/minor number mismatch L readLink(2) path mismatch U User ownership differs G Group ownership differs T mTime differs P caPabilities differ
我們在這個文件裡面添加一行試試:
再來校驗:
[root@localhost Packages]# rpm -V zsh S.5....T. c /etc/zshrc #文件大小發生改變,MD5值改變,時間戳改變 [root@localhost Packages]# rpm -V --nomtime zsh #不檢查時間戳 S.5...... c /etc/zshrc
包來源合法性驗證和完整性驗證:
那麼用戶如何獲取公鑰呢? 在centos發行版在:/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 導入包製作者的秘鑰:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
驗證:
1.安裝程式的時候,會自動執行驗證
2.手動驗證:rpm -K PACKAGE_FILE
[root@localhost Packages]# rpm -K zsh-5.0.2-25.el7.x86_64.rpm zsh-5.0.2-25.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
六、RPM的資料庫
rpm管理器的資料庫路徑位於:/var/lib/rpm/,比如查詢操作都是通過此處的資料庫進行的,當我們的資料庫損壞的時候,可有重建資料庫: 獲取幫助: centos 6: man rpm centos 7:man rpmdbrpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY] --initdb:初始化資料庫,當前無任何資料庫可實始化創建一個新的;當前有時不執行任何操作; --rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程式包進行重新創建;
一般情況下我們都不要去動RPM的資料庫。
總結:rpm命令的查詢功能是非常的重要的,但是安裝卻不顯的那麼重要,因為使用rpm安裝包,如果包存在一些依賴的包,你需要將依賴的包一個一個的安裝,這樣耗時又耗力,所以在安裝包的時候,我們一般會使用比較自動化的工具yum,它能幫我們解決依賴性的關係,yum將在下一篇博客中進行詳細的介紹。