【Linux相識相知】rpm包管理,linux相識相知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.gz
version: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:安裝過程開始之前啟動並執行指令碼,%prepostinstall:安裝過程完成之後啟動並執行指令碼,%postpreuninstall:卸載過程真正開始執行之前啟動並執行指令碼,%preunpostuninstall:卸載過程完成之後啟動並執行指令碼,%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 #最常用的組合 -ivhPreparing... ################################# [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 zshwarning: /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/zshrczshrc 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 <kdudka@redhat.com> - 5.0.2-25- improve use of new command substitution in completion (#1356388)* Fri Jun 10 2016 Kamil Dudka <kdudka@redhat.com> - 5.0.2-24- fix off-by-one error in completion utility cache code (#1344599)* Mon May 23 2016 Kamil Dudka <kdudka@redhat.com> - 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所提供的CAPABILITYconfig(zsh) = 5.0.2-25.el7zsh = 5.0.2-25.el7zsh(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-infoconfig(zsh) = 5.0.2-25.el7coreutils......(略)[root@localhost Packages]# rpm -q --scripts zsh #查詢zsh的自定的指令碼片段postinstall scriptlet (using /bin/sh): if [ ! -f /etc/shells ] ; then echo "/bin/zsh" > /etc/shellselse grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shellsfiif [ -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." fifi: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 fifi[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所提供的CAPABILITYzenity = 3.8.0-5.el7zenity(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 differsM Mode differs (includes permissions and file type)5 digest (formerly MD5 sum) differsD Device major/minor number mismatchL readLink(2) path mismatchU User ownership differsG Group ownership differsT mTime differsP caPabilities differ
我們在這個檔案裡面添加一行試試:
再來校正:
[root@localhost Packages]# rpm -V zshS.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 rpmcentos 7:man rpmdb
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]--initdb:初始化資料庫,當前無任何資料庫可實始化建立一個新的;當前有時不執行任何操作;--rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程式包進行重新建立;
一般情況下我們都不要去動RPM的資料庫。
總結:rpm命令的查詢功能是非常的重要的,但是安裝卻不顯的那麼重要,因為使用rpm安裝包,如果包存在一些依賴的包,你需要將依賴的包一個一個的安裝,這樣耗時又耗力,所以在安裝包的時候,我們一般會使用比較自動化的工具yum,它能幫我們解決依賴性的關係,yum將在下一篇部落格中進行詳細的介紹。