【Linux相識相知】rpm包管理,linux相識相知rpm

來源:互聯網
上載者:User

【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將在下一篇部落格中進行詳細的介紹。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.