rpm使用

概述

RPM Red Hat PackageManager 的縮寫,本意是Red Hat 軟件包管理,顧名思義是Red Hat 貢獻出來的軟件包管理;在Fedora RedhatMandrivaSuSEYellowDog等主流發行版本,以及在這些版本基礎上二次開發出來的發行版採用;

RPM包裏面都包含什麼?裏面包含可執行的二進制程序,這個程序和Windows的軟件包中的.exe文件類似是可執行的;RPM包中還包括程序運行時所需要的文件,這也和Windows的軟件包類似,Windows的程序的運行,除了.exe文件以外,也有其它的文件;

一個RPM 包中的應用程序,有時除了自身所帶的附加文件保證其正常以外,還需要其它特定版本文件,這就是軟件包的依賴關係;依賴關係並不是Linux特有的,Windows操作系統中也是同樣存在的;比如我們在Windows系統中運行3D遊戲,在安裝的時候,他可能會提示,要安裝Direct 9 LinuxWindows原理是差不多的。

 

 

命名格式

源代碼命名格式:

name-VERSION.tar.gz

VERSIONmajor.minor.release

 

例如:

nginx-1.4.7.tar.gz

1:是主版本號

4:是次版本號

7:是發行號

 

rpm包命名格式:

name-VERSION-release.arch.rpm

VERSIONmajor.minor.release

release.archrpm包的發行號

archetecture(架構或平臺):i386,x64(amd64), ppc, noarch

 

例如:

zsh-4.3.10-7.el6.x86_64.rpm

4:是主版本號

3:是次版本號

10:修訂

7:是第幾次發佈版本

el6:適用於RHEL6或兼容Centos6

x86_64CPU架構系統平臺

 

el6 enterprice linux  6   RHEL 6centos 6

el5 rhel5

 

redis-3.0.2.tar.gz -->redis-3.0.2-1.centos7.x64.rpm

 

拆包:主包和支包

主包:name-VERSION-release.arch.rpm

支包:name-function-VERSION-release.arch.rpm

functiondevel(開發), utils(工具程序), libs(庫文件), ...

 

 

前端工具:自動解決依賴關係;

  • yumrhel系列系統上rpm包管理器的前端工具;

  • apt-get (apt-cache)deb包管理器的前端工具;

  • zyppersuserpm管理器前端工具;

  • dnfFedora 22+系統上rpm包管理器的前端工具;

 

程序包管理器的組成:

功能:將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操作;

 

1、程序包的組成清單(每個程序包都單獨實現);

  1. 文件清單

  2. 安裝或卸載時運行的腳本

 

2、數據庫(公共)

  1. 程序包的名稱和版本;

  2. 依賴關係;

  3. 功能說明;

  4. 安裝生成的各文件的文件路徑及校驗碼信息;

  5. 等等等

 

rpm包的數據庫文件:/var/lib/rpm/

[root@Linux_1 mysql]# cd /var/lib/rpm/

[root@Linux_1 rpm]# ls

Basenames    Dirnames      Packages        Sha1header

Conflictname Filedigests   Providename     Sigmd5

__db.001     Group         Provideversion  Triggername

__db.002     Installtid    Pubkeys

__db.003     Name          Requirename

__db.004     Obsoletename  Requireversion

獲取程序包的途徑:

  1. 系統發行版的光盤或官方的文件服務器(或鏡像站點):

  2. a)        http://mirrors.aliyun.com,

  3. b)       http://mirrors.sohu.com,

  4. c)        http://mirrors.163.com

  5. 項目的官方站點。例如:http://www.zabbix.com/

  6. 第三方組織:

i.             EPEL

ii.             搜索引擎

  1. 1.        http://pkgs.org

  2. 2.        http://rpmfind.net

  3. 3.        http://rpm.pbone.net

iii.             (4) 自己製作rpm

 

 

建議:檢查其合法性

  • 來源合法性;

  • 程序包的完整性;

 

什麼是EPEL

如果既想獲得 RHEL 的高質量、高性能、高可靠性,又需要方便易用(關鍵是免費)的軟件包更新功能,那麼 Fedora Project 推出的 EPEL(Extra Packages for Enterprise Linux)正好適合你。EPEL(http://fedoraproject.org/wiki/EPEL)是由 Fedora 社區打造,爲 RHEL 及衍生髮行版如 CentOSScientific Linux 等提供高質量軟件包的項目。

 

rpm命令:

rpm [OPTIONS]  [PACKAGE_FILE]

  • 安裝:-i, --install

  • 升級:-U, --update, -F, --freshen

  • 卸載:-e, --erase

  • 查詢:-q, --query

  • 校驗:-V, --verify

  • 數據庫維護:--builddb, --initdb

 

提示:

-Fvh是升級RPM包的命令,它表示如果後面的軟件包沒有安裝在系統上,則這個軟件包不會安裝。也就是說只有安裝到系統上的軟件包纔會被升級。

 

安裝:

rpm {-i|--install} [install-options]PACKAGE_FILE ...

 

GENERAL OPTIONS

  • -vverbose,詳細信息

  • -vv:更詳細的輸出

 

[install-options]

  • -hhash marks輸出進度條;每個#表示2%的進度;

  • --test:測試安裝,檢查並報告依賴關係及衝突消息等;

  • --nodeps:忽略依賴關係;不建議;

  • --replacepkgs:重新安裝(如果文件被修改錯了,重新安裝並不會覆蓋這些文件,需要將這些文件刪除之後再重新安裝才能夠覆蓋還原。)

  • --justdb 使用時機: 由於 RPM 數據庫破損或者是某些緣故產生錯誤時,可使用這個選項來升級軟件在數據庫內的相關資訊。

  • --prefix 新路徑 使用時機: 要將軟件安裝到其他非正規目錄時。舉例來說,你想要將某軟件安裝到 /usr/local 而非正規的 /bin,/etc 等目錄, 就可以使用『 --prefix /usr/local 』來處理了。

  • --replacefiles 使用時機: 如果在安裝的過程當中出現了『某個文件已經被安裝在你的系統上面』的資訊,又或許出現版本不合的信息 (confilcting files) 時,可以使用這個參數來直接覆蓋文件。

  • 危險性: 覆蓋的動作是無法復原的!所以,你必須要很清楚的知道被覆蓋的文件是真的可以被覆蓋喔!否則會欲哭無淚!

 

示例:安裝rpm

[root@Linux_11 mnt]# rpm -ivhPackages/zsh

error: open of Packages/zsh failed: 沒有那個文件或目錄

[root@Linux_11 mnt]# rpm -ivhPackages/zsh-4.3.10-7.el6.i686.rpm

Preparing...               ########################################### [100%]

提示

"  安裝包的時候使用的是PACKAGE_FILE,指定安裝軟件包的完整路徑和完整名稱。

 

 

示例:重新安裝

 

 

注意:rpm可以自帶腳本;

四類:

  • preinstall:安裝過程開始之前運行的腳本,%pre --nopre

  • postinstall:安裝過程完成之後運行的腳本,%post , --nopost

  • preuninstall:卸載過程真正開始執行之前運行的腳本,%preun, --nopreun

  • postuninstall:卸載過程完成之後運行的腳本,%postun , --nopostun

 

  • --noscripts:不運行腳本

  • --nosignature:不檢查包簽名信息,不檢查來源合法性;

  • --nodigest:不檢查包完整性信息;

依賴於製作者的公鑰

 

升級與降級:

rpm {-U|--upgrade} [install-options]PACKAGE_FILE ...

rpm {-F|--freshen} [install-options]PACKAGE_FILE ...

 

  • -U:升級或安裝,如果事先安裝了老版本包則升級,沒有安裝老版本包則安裝此包

  • -F:升級,如果事先沒有安裝老版本的包則不升級

  • --oldpackage:降級;

  • --force:強制升級;

 

 

 

注意:

  • 不要對內核做升級操作;Linux支持多內核版本並存,因此,直接安裝新版本內核;

  • 如果某原程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;

卸載:

rpm {-e|--erase} [--allmatches] [--nodeps][--noscripts] [--test] PACKAGE_NAME ...

 

  • -e:卸載包

  • --allmatches:卸載所有匹配指定名稱的程序包的各版本;

  • --nodeps:忽略依賴關係

  • --test:測試卸載,dry run模式

 

查詢:

rpm {-q|--query} [select-options][query-options]

 

[select-options]

  • -a, --all:查詢所有已經安裝過的包;

  • -f  FILE:查詢指定的文件由哪個程序包安裝生成;

  • -p, --package PACKAGE_FILE:用於實現對未安裝的程序包執行查詢操作;

  • --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供;查詢提供了 CAPABILITY 功能的軟件包。

  • --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;查詢所有需要 CAPABILITY 功能才能運行的軟件包。

 

[query-options]

  • --changelog:查詢rpm包的歷史變更信息changlog

  • -l, --list:程序安裝生成的所有文件列表;

  • -i, --info:程序包相關的信息,版本號、大小、所屬的包組,等;

  • -c, --configfiles:查詢指定的程序包提供的配置文件;

  • -d, --docfiles:查詢指定的程序包提供的說明文檔;

  • --provides:列出指定的程序包提供的所有的CAPABILITY

  • -R, --requires:查詢指定的程序包的依賴關係;

  • --scripts:查看程序包自帶的腳本片斷;

 

 

示例:查看所有已經安裝的軟件包

[root@Linux_1 Packages]# rpm –qa  #查看所有已經安裝的rpm

setuptool-1.19.9-4.el6.i686

giflib-4.1.6-3.1.el6.i686

pidgin-2.7.9-11.el6.i686

libgsf-devel-1.14.15-5.el6.i686

libhangul-0.0.10-1.el6.i686

pyxdg-0.18-1.el6.noarch

keyutils-1.4-4.el6.i686

cheese-2.28.1-8.el6.i686

……

 

 

示例:查詢某個軟件包是否安裝

[root@Linux_1 Packages]# rpm -q bash  #僅查詢bash包安裝了沒有,安裝了就顯示出包名

bash-4.1.2-15.el6_4.i686

 

 

示例:查詢某一文件屬於哪個軟件包

[root@Linux_1 Packages]# rpm -qf /usr/bin/crontab

cronie-1.4.4-12.el6.i686

 

 

示例:查詢一個已經安裝的軟件包包含哪些文件

[root@Linux_1 Packages]# rpm -ql rpcbind

/etc/rc.d/init.d/rpcbind

/sbin/rpcbind

/usr/sbin/rpcinfo

/usr/share/doc/rpcbind-0.2.0

/usr/share/doc/rpcbind-0.2.0/AUTHORS

/usr/share/doc/rpcbind-0.2.0/ChangeLog

/usr/share/doc/rpcbind-0.2.0/README

/usr/share/man/man8/rpcbind.8.gz

/usr/share/man/man8/rpcinfo.8.gz

/var/cache/rpcbind

 

 

示例:查詢一個已經安裝的軟件包的詳細信息

[root@Linux_1 Packages]# rpm -qi bash

Name        : bash                         Relocations: (notrelocatable)

Version     : 4.1.2                             Vendor: CentOS

Release     : 15.el6_4                      Build Date: 20130718星期四 211724

Install Date: 20151114 星期六 235134      Build Host: c6b10.bsys.dev.centos.org

Group       : SystemEnvironment/Shells     Source RPM:bash-4.1.2-15.el6_4.src.rpm

Size        : 3104719                          License: GPLv3+

Signature   : RSA/SHA1, 20130718星期四 214609, Key ID 0946fca2c105b9de

Packager    : CentOSBuildSystem <http://bugs.centos.org>

URL         :http://www.gnu.org/software/bash

Summary     : The GNU BourneAgain shell

Description :

The GNU Bourne Again shell (Bash) is a shell or command language

interpreter that is compatible with the Bourne shell (sh). Bash

incorporates useful features from the Korn shell (ksh) and the Cshell

(csh). Most sh scripts can be run by bash without modification.

 

 

示例:查看某一個已經安裝的軟件包的配置文件有哪些

[root@Linux_1 Packages]# rpm -qc vsftpd

/etc/logrotate.d/vsftpd

/etc/pam.d/vsftpd

/etc/vsftpd/ftpusers

/etc/vsftpd/user_list

/etc/vsftpd/vsftpd.conf

 

 

 

示例:查看一個已經安裝的包自帶的說明說明文檔

[root@Linux_1 Packages]# rpm -qdnfs-utils

/usr/share/doc/nfs-utils-1.2.3/ChangeLog

/usr/share/doc/nfs-utils-1.2.3/INSTALL

/usr/share/doc/nfs-utils-1.2.3/KNOWNBUGS

/usr/share/doc/nfs-utils-1.2.3/Makefile

/usr/share/doc/nfs-utils-1.2.3/Makefile.am

/usr/share/doc/nfs-utils-1.2.3/Makefile.in

/usr/share/doc/nfs-utils-1.2.3/NEW

/usr/share/doc/nfs-utils-1.2.3/README

/usr/share/doc/nfs-utils-1.2.3/THANKS

 

 

示例:查詢一個已經安裝的軟件包依賴於什麼軟件包

[root@Linux_1 Packages]# rpm -qR bash

/bin/sh 

/bin/sh 

config(bash) = 4.1.2-15.el6_4

libc.so.6 

libc.so.6(GLIBC_2.0) 

libc.so.6(GLIBC_2.1) 

libc.so.6(GLIBC_2.11) 

libc.so.6(GLIBC_2.2) 

libc.so.6(GLIBC_2.3) 

libc.so.6(GLIBC_2.3.4) 

libc.so.6(GLIBC_2.4) 

libdl.so.2 

libdl.so.2(GLIBC_2.0) 

libdl.so.2(GLIBC_2.1) 

libtinfo.so.5 

ncurses-libs 

rpmlib(BuiltinLuaScripts) <= 4.2.2-1

rpmlib(CompressedFileNames) <= 3.0.4-1

rpmlib(FileDigests) <= 4.6.0-1

rpmlib(PayloadFilesHavePrefix) <= 4.0-1

rtld(GNU_HASH) 

rpmlib(PayloadIsXz) <= 5.2-1

 

 

示例:查詢一個軟件包中的腳本片段

[root@Linux_1 Packages]# rpm -q--scripts bash

postinstall scriptlet (using <lua>):

bashfound = false;

shfound = false;

 

f = io.open("/etc/shells", "r");

if f == nil

then

  f =io.open("/etc/shells", "w");

else

  repeat

    t = f:read();

    if t =="/bin/bash"

    then

      bashfound = true;

    end

    if t =="/bin/sh"

    then

      shfound = true;

    end

  until t == nil;

end

f:close()

 

f = io.open("/etc/shells", "a");

if not bashfound

then

 f:write("/bin/bash\n")

end

if not shfound

then

 f:write("/bin/sh\n")

end

f:close()

postuninstall scriptlet (using /bin/sh):

if [ "$1" = 0 ]; then

    /bin/grep -v '^/bin/bash$'< /etc/shells | \

      /bin/grep -v '^/bin/sh$'> /etc/shells.new

    /bin/mv /etc/shells.new/etc/shells

fi

校驗:

 

rpm {-V|--verify} [select-options][verify-options]

 

  • -V:後面接軟件名稱,若該軟件所含的文件被改動過纔會列出來

  • -Va:列出目前系統上面所有可能被改動過的文件

  • -Vp:後面加的是文件名稱,列出該軟件內可能被改動過的文件

  • -Vf:列出某個文件是否被改動過

 

  • S file Size differs:文件的容量大小是否被改變

  • M Mode differs (includespermissions and file type):文件的類型或文件的屬性(rwx)是否被改變

  • 5 digest (formerly MD5 sum)differsMD5這一種指紋碼的內容已經不同

  • D Device major/minor numbermismatch:設備的主/次代碼已經改變

  • L readLink(2) path mismatchLink路徑已被改變

  • U User ownership differs:文件的所有者已被改變

  • G Group ownership differs:文件的所有屬用戶組已被改變

  • T mTime differs:文件的創建時間已被改變

  • P capabilities differcapabilities已經改變

 

提示:當一個軟件包的文件被被動過,那麼它的顯示就會是:

SM5DLUGTP c filename

c表示文件的類型

 

  • cconfig file:設置文件

  • ddocumentation:文檔文件

  • gghost file:“鬼”文件,通常是該文件不被某個軟件所包含,較少發生

  • llinense file:授權文件

  • rread line:自述文件

 

 

示例:查看某個已經安裝的軟件包中的哪些文件被改動過

[root@Linux_1 ~]# rpm -V vsftpd  #查看vsftpd軟件包中的哪些文件被改動過

S.5....T. c /etc/vsftpd/user_list

 

 

示例:列出系統上所有的rpm包中的文件中被改動的文件有哪些(針對所有rpm包中的所有文件查詢)

[root@Linux_1 ~]# rpm -Va

prelink: /usr/lib/libgweather.so.1.5.2: at least one of file'sdependencies has changed since prelinking

S.?......   /usr/lib/libgweather.so.1.5.2

prelink: /usr/bin/gtkhtml-editor-test: at least one of file'sdependencies has changed since prelinking

S.?......   /usr/bin/gtkhtml-editor-test

prelink: /usr/lib/libgtkhtml-3.14.so.19.1.1: at least one of file'sdependencies has changed since prelinking

S.?......   /usr/lib/libgtkhtml-3.14.so.19.1.1

 

 

示例:查看某個文件是否被改動過(這個文件一定要屬於某個rpm包才行)

[root@Linux_1 ~]# rpm -Vf /etc/zshrc

S.5....T. c /etc/zshrc

 

提示:列出的是這個文件被改動的類型

 

 

示例:根據完整的軟件包名查看包內文件是否被動過

[root@Linux_1 Packages]# rpm -Vp ./zsh-4.3.10-7.el6.i686.rpm

S.5....T.  c /etc/zshrc

 

 

包來源合法性驗正和完整性驗正:

p    來源合法性驗正:

p    文件完整性驗正:

 

獲取並導入信任的包製作者的密鑰:

對於CentOS發行版來說:rpm--import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 

驗正:

(1) 安裝此組織簽名的程序時,會自動執行驗正;

(2) 手動驗正:rpm -K PACKAGE_FILE

[root@Linux_1 Packages]# rpm -Kzsh-4.3.10-7.el6.i686.rpm

zsh-4.3.10-7.el6.i686.rpm: rsa sha1 (md5) pgpmd5 OK

 

 

rpm包數據庫重建:

rpm管理器數據庫路徑:/var/lib/rpm/

查詢操作就是通過此處的數據庫進行;

 

獲取幫助:

CentOS 6man rpm

CentOS 7man rpmdb

 

rpm {--initdb|--rebuilddb} [--dbpathDIRECTORY] [--root DIRECTORY]

  • --initdb:初始化數據庫,當前無任何數據庫,可初始化創建一個新的;當前有時不執行任何操作;

  • --rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建;

  • --dbpath:指明要創建數據庫的目錄

說明:

如果rpm數據庫系統損壞可以使用此命令重建

[root@Linux_1 tmp]# mkdir -p /tmp/rpm  #創建用於放置數據庫的目錄

[root@Linux_1 tmp]# rpm --initdb--dbpath /tmp/rpm/  #初始化數據庫

[root@Linux_1 tmp]# ls /tmp/rpm/

__db.001 __db.002  __db.003  __db.004 Packages

[root@Linux_1 tmp]# rpm --rebuilddb--dbpath /tmp/rpm/  #重新構建數據庫

[root@Linux_1 tmp]# ls /tmp/rpm/

Packages

 

 

 

提問:

1、  如果把/var/lib/rpm目錄下的所有內容刪除了,那麼怎麼辦?

答:如果將此目錄刪除了,那麼使用rpm –initdbrpm –rebuilddb是不能夠重建的。因爲此目錄下的文件不光有數據文件,還有其它的相關文件,--initdb—rebuilddb只能夠重建數據庫,而不能重建其它的文件,可以這種方法是無效的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章