軟件包管理之rpm

    一、Linux下軟件包的命名格式:

        1.源碼包

            name-version.tar.[gz|bz2|xz]

                 version:major.minor.release

            如:bash-4.1.2.tar.gz

        2.rpm包

            name-version-release.arch.rpm

                 version:major.minor.release #此release號是源碼包的release號

                 release:rpm包的release號,可能會包含所適用的操作系統

                        el6:rhel6

                        el5:rhel5

                        centos6

                        suse11

                        ......

                 arch:平臺   

                        x86:i386,i686

                        x86_64:redhat系列的軟件包

                        amd64:debian系統的軟件包

                        ppc:基於powerpc的軟件包

                        noarch:不依賴於平臺的軟件包

            如:bash-4.1.2.el6.x86_64.rpm


    二、軟件包的組成

        1.二進制程序:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin

        2.配置文件:/etc:純文本、xml格式的配置文件

        3.庫文件:/lib,/usr/lib,/usr/local/lib

        4.幫助手冊:/usr/share/man, /usr/loacl/share/man

                   /usr/share/doc


    三、軟件包的獲取方式


       安裝光盤

        http://mirrors.163.com

        http://mirrors.sohu.com

        http://mirrors.ustc.edu.cn

        http://rpmfind.net

        http://rpm.pbone.net

        .....


    四、RPM管理軟件包

       下面以光盤中的rpm包爲例:

        1.驗證

          驗證我們使用的rpm包的合法性和完整性  

[root@wsh /]# mount /dev/cdrom /media/cdrom/    #掛在光盤
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@wsh /]# cd /media/cdrom/
[root@wsh cdrom]# ls
CentOS_BuildTag  GPL                       RPM-GPG-KEY-CentOS-6           RPM-GPG-KEY-CentOS-Testing-6  isolinux
EFI              Packages                  RPM-GPG-KEY-CentOS-Debug-6     TRANS.TBL                     repodata
EULA             RELEASE-NOTES-en-US.html  RPM-GPG-KEY-CentOS-Security-6  p_w_picpaths
[root@wsh cdrom]# cd Packages/
[root@wsh Packages]# rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-6  #--import導入光盤中的公鑰;在/etc/pki/rpm-gpg/下也會有公鑰
[root@wsh Packages]# rpm -K zsh-4.3.10-5.el6.x86_64.rpm  #-K驗證rpm包的合法性
zsh-4.3.10-5.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
[root@wsh Packages]# rpm --checksig zsh-4.3.10-5.el6.x86_64.rpm #--checksig和-K一樣
zsh-4.3.10-5.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

      

        2.安裝

           -i:安裝

            -v:詳細詳細信息,-vv:比-v更詳細

            -h:顯示安裝進度條,一個#代表2%

            -ivh:一般組合使用

            -ivh --nodeps:忽略依賴關係

            -ivh --test:測試安裝

            -ivh --replacepkgs:重新安裝已經安裝的rpm包

[root@wsh Packages]# pwd
/media/cdrom/Packages    #此目錄下存放的就是rpm包
[root@wsh Packages]# ls | less
389-ds-base-1.2.10.2-15.el6.x86_64.rpm
389-ds-base-libs-1.2.10.2-15.el6.i686.rpm
389-ds-base-libs-1.2.10.2-15.el6.x86_64.rpm
.......

[root@wsh Packages]# [root@wsh Packages]# rpm -ivh bind-dyndb-ldap-1.1.0-0.9.b1.el6.x86_64.rpm 
error: Failed dependencies:
	bind >= 32:9.6.1-0.3.b1 is needed by bind-dyndb-ldap-1.1.0-0.9.b1.el6.x86_64  #有的rpm包的安裝,依賴於其他rpm包,這時就需要先安裝其依賴的包
	
[root@wsh Packages]# rpm -ivh bind-9.8.2-0.10.rc1.el6.x86_64.rpm #安裝依賴的包
Preparing...                ########################################### [100%]
   1:bind                   ########################################### [100%]
[root@wsh Packages]# rpm -ivh bind-dyndb-ldap-1.1.0-0.9.b1.el6.x86_64.rpm #再次安裝,成功
Preparing...                ########################################### [100%]
   1:bind-dyndb-ldap        ########################################### [100%]

[root@wsh Packages]# rpm -ivh --test zsh-4.3.10-5.el6.x86_64.rpm #只是測試,沒有真正安裝
Preparing...                ########################################### [100%]   	

	

        3.查詢:

          查詢已安裝的軟件包信息:

            -q name:

[root@wsh Packages]# rpm -q bind #查詢bind是否安裝
bind-9.8.2-0.10.rc1.el6.x86_64
[root@wsh Packages]# rpm -q bind-dyndb-ldap
bind-dyndb-ldap-1.1.0-0.9.b1.el6.x86_64

          -qa:查詢所有已安裝的包

[root@wsh Packages]# rpm -qa | grep "bind"    #rpm -qa列出所有安裝的包,grep匹配出你想查詢的包
samba-winbind-clients-3.6.9-164.el6.x86_64
bind-dyndb-ldap-1.1.0-0.9.b1.el6.x86_64
rpcbind-0.2.0-11.el6.x86_64
bind-libs-9.8.2-0.10.rc1.el6.x86_64
bind-9.8.2-0.10.rc1.el6.x86_64
samba-winbind-3.6.9-164.el6.x86_64
ypbind-1.20.4-30.el6.x86_64
PackageKit-device-rebind-0.5.8-21.el6.x86_64

          -qi name:查詢包的摘要信息

[root@wsh Packages]# rpm -qi bind
Name        : bind                         Relocations: (not relocatable)
Version     : 9.8.2                             Vendor: CentOS
Release     : 0.10.rc1.el6                  Build Date: Fri Jun 22 23:24:10 2012
Install Date: Fri May 23 09:17:34 2014         Build Host: c6b7.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: bind-9.8.2-0.10.rc1.el6.src.rpm
Size        : 7580392                          License: ISC
Signature   : RSA/SHA1, Mon Jun 25 06:18:46 2012, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.isc.org/products/BIND/
Summary     : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
Description :
BIND (Berkeley Internet Name Domain) is an implementation of the DNS
(Domain Name System) protocols. BIND includes a DNS server (named),
which resolves host names to IP addresses; a resolver library
(routines for applications to use when interfacing with DNS); and
tools for verifying that the DNS server is operating properly.

           -ql name:查詢安裝生成文件清單

[root@wsh Packages]# rpm -ql bind
/etc/NetworkManager/dispatcher.d/13-named
/etc/logrotate.d/named
/etc/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/portreserve/named
/etc/rc.d/init.d/named
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/usr/lib64/bind
/usr/sbin/arpaname
/usr/sbin/ddns-confgen
/usr/sbin/dnssec-dsfromkey
...............

             -qc name:查詢生成的配置文件

[root@wsh Packages]# rpm -qc man    #man的配置文件
/etc/man.config

             -qd name:查詢生成的幫助文檔

[root@wsh Packages]# rpm -qd grep    #grep的幫助文檔
/usr/share/doc/grep-2.6.3/ABOUT-NLS
/usr/share/doc/grep-2.6.3/AUTHORS
/usr/share/doc/grep-2.6.3/COPYING
/usr/share/doc/grep-2.6.3/ChangeLog
/usr/share/doc/grep-2.6.3/NEWS
/usr/share/doc/grep-2.6.3/README
/usr/share/doc/grep-2.6.3/THANKS
/usr/share/doc/grep-2.6.3/TODO
/usr/share/info/grep.info.gz
/usr/share/man/man1/egrep.1.gz
/usr/share/man/man1/fgrep.1.gz
/usr/share/man/man1/grep.1.gz

               -qf /path/to/file_name:查詢文件是由哪個軟件生成的

[root@wsh Packages]# rpm -qf /etc/man.config #man.config是由man.-1.6f-32.el6.x86_64生成的
man-1.6f-32.el6.x86_64

               -q --scripts name:查詢安裝

[root@wsh Packages]# rpm -q --scripts bind    
#preinstall,安裝前腳本
#postinstall,安裝後腳本
#preuninstall,卸載前腳本
#postuninstall,卸載後腳本
preinstall scriptlet (using /bin/sh):
if [ "$1" -eq 1 ]; then
  /usr/sbin/groupadd -g 25 -f -r named >/dev/null 2>&1 || :;
  /usr/sbin/useradd  -u 25 -r -N -M -g named -s /sbin/nologin -d /var/named -c Named named >/dev/null 2>&1 || :;
fi;
:;
postinstall scriptlet (using /bin/sh):
/sbin/ldconfig
/sbin/chkconfig --add named
if [ "$1" -eq 1 ]; then
  [ -x /sbin/restorecon ] && /sbin/restorecon /etc/rndc.* /etc/named.* >/dev/null 2>&1 ;
  # rndc.key has to have correct perms and ownership, CVE-2007-6283
  [ -e /etc/rndc.key ] && chown root:named /etc/rndc.key
  [ -e /etc/rndc.key ] && chmod 0640 /etc/rndc.key
fi
:;
preuninstall scriptlet (using /bin/sh):
if [ "$1" -eq 0 ]; then
  /sbin/service named stop >/dev/null 2>&1 || :;
  /sbin/chkconfig --del named || :;
fi;
:;
postuninstall scriptlet (using /bin/sh):
/sbin/ldconfig
if [ "$1" -ge 1 ]; then
  /sbin/service named try-restart >/dev/null 2>&1 || :;
fi;
:;

           查詢未安裝的rpm包的相關信息,加入-p選項即可:

                rpm -qp[i|l|c|d|--scripts] name-version.release.arch.rpm

                               
        

        4.卸載

           -e : 卸載

            --nodeps:忽略依賴關係

[root@wsh Packages]# rpm -q bind    #查詢bind包已安裝
bind-9.8.2-0.10.rc1.el6.x86_64
[root@wsh Packages]# rpm -e bind    #-e卸載提示有依賴關係
error: Failed dependencies:
	bind >= 32:9.6.1-0.3.b1 is needed by (installed) bind-dyndb-ldap-1.1.0-0.9.b1.el6.x86_64
[root@wsh Packages]# rpm -e --nodeps bind    #忽略依賴關係卸載
[root@wsh Packages]# rpm -q bind    #查詢已經卸載
package bind is not installed

        5.升級

            -U:升級或安裝,如果軟件包沒有安裝則安裝;否則,升級

            -F:升級,只能升級,即需要升級的軟件包必須已經安裝

            常用組合:

            -Uvh

            -Fvh

            --force:

            --nodeps:

          注意:內核不應該升級,儘可能安裝,因爲內核允許多版本並存。


        6.校驗

            rpm -V name

        

[root@wsh ~]# vim /usr/share/doc/man-1.6f/README     #README的最後一行加入內容
[root@wsh ~]# rpm -V man    
S.5....T.  d /usr/share/doc/man-1.6f/README  #校驗出改變的README

#校驗已安裝的包的文件與保存在rpm數據庫裏的包的元數據,如果相同則無任何顯示,如果不用則標#
#示出改變的地方,如下是每個字符代表的意義:
#      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


        7.rpm包的數據庫

            /var/lib/rpm

            如果rpm的數據庫損壞,會導致查詢等相關操作無法正常進行,這時就需要重建數據庫

            數據庫重建:

                --initdb:新建,不會覆蓋原有數據庫

                --rebuilddb:重建,覆蓋原有數據庫,常用

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