首頁 > 軟體

RPM Database 實戰詳解

2020-06-16 17:26:57

RPM 不僅在安裝、升級、解除安裝方面工作出色,而且在查詢和驗證方面也表現非凡。你很久前安裝了一個資料庫軟體,但現在忘記了它的版本號,也不知道它的說明文件的位置,可以通過 RPM 查詢命令得到這個資訊;你有一個系統安全方面的包要升級,但是不清楚哪些相關包會受到影響,可以通過 RPM 依賴查詢來確定;你系統中安裝了一個網路軟體,想了解哪些檔案發生了變化,可以通過 RPM 驗證命令獲悉。這些操作都得益於 RPM Database,RPM Database 記錄了已安裝 RPM 包的所有資訊,使得我們可以方便地查詢和驗證 RPM。本文結合實際例子,帶大家走入 RPM Database 的世界。

RPM 簡介

RPM 是 RPM Package Manager 的簡寫,是發源於 Red-hat 系統的軟體管理工具,所以最初的名字叫做 Red-hat Packager Manager。目前,RPM 已發展成為業界認可的 Linux 系統軟體管理工具,適用於各種基於 Linux 核心的系統,如 SUSEFedora、Power 等。RPM 製作靈活且方便使用,能夠有效地管理軟體包的安裝、解除安裝和升級。

RPM 自身維護了一個資料庫(RPM Database),用於記錄所有通過 RPM 安裝的軟體包及其檔案資訊。RPM Database 提供多種形式的查詢功能,同時也提供軟體包和相關檔案的驗證功能。下面的章節,我們結合一些實際的例子來重點介紹 RPM Database 的查詢功能、驗證功能以及 RPM Database 的備份與恢復。

RPM 包元件查詢

RPM Database 記錄了通過 RPM 安裝的軟體包的所有資訊,我們可以使用 rpm 命令對其進行查詢。 可查詢的內容包括:軟體包的名稱、版本、描述資訊、組態檔、文件檔案、安裝解除安裝前後執行的指令碼和軟體包的修改歷史等。 下面,我們通過常見的元件查詢例子來詳細說明。

1. 列出全部已安裝的 RPM 包

命令格式:rpm -qa

清單 1. 列出系統中已安裝的全部 RPM 包
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -qa 
 libchamplain-gtk-0.12.4-4.el7.x86_64 
 Python-heatclient-0.4.0-1.ibm.el7.noarch 
 perl-Filter-1.49-3.el7.x86_64 
 pinentry-0.8.1-14.el7.x86_64 
 iso-codes-3.46-2.el7.noarch 
 zip-3.0-10.el7.x86_64 
 p11-kit-0.20.7-3.el7.x86_64 
 dbus-1.6.12-11.el7.x86_64 
 python-itsdangerous-0.22-2.ibm.el7.noarch 
 libXvMC-1.0.8-2.1.el7.x86_64 
 python-requests-2.6.0-1.el7_1.noarch 
 compat-openldap-2.3.43-5.el7.x86_64 
 # The following lines are omitted

在實際的應用中,該命令常常結合萬用字元或管道命令,實現一些特定的查詢功能。比如:

清單 2. 結合萬用字元,查詢以 mysql 開頭的 rpm 包
 [root@server01 ~]# rpm -qa "mysql*"
 mysql-server-5.1.73-5.el6_6.x86_64 
 mysql-5.1.73-5.el6_6.x86_64 
 mysql-devel-5.1.73-5.el6_6.x86_64 
 mysql-libs-5.1.73-5.el6_6.x86_64
清單 3. 結合管道命令,查詢含有 openstack-nova 的 rpm 包
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -qa |grep openstack-nova 
 openstack-nova-scheduler-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-network-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-conductor-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-api-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-novncproxy-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-objectstore-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-compute-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-console-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-cells-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-compute-prereqs-2013.1-201503302013.ibm.2.x86_64 
 openstack-nova-cert-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openstack-nova-common-2015.1.1.1-201509142203.ibm.el7.140.noarch
清單 4. 結合管道命令,查詢系統中近期安裝的 rpm 包
 [root@server01 ~]# rpm -qa --last | head 
 chefdk-0.6.2-1.el6.x86_64                     Wed 09 Sep 2015 10:51:29 PM EDT 
 docker-engine-1.7.1-1.el6.x86_64              Fri 24 Jul 2015 09:39:25 PM EDT 
 mysql-devel-5.1.73-5.el6_6.x86_64             Wed 08 Jul 2015 02:51:59 AM EDT 
 mysql-server-5.1.73-5.el6_6.x86_64            Wed 08 Jul 2015 02:51:58 AM EDT 
 perl-DBD-MySQL-4.013-3.el6.x86_64             Wed 08 Jul 2015 02:51:56 AM EDT 
 mysql-5.1.73-5.el6_6.x86_64                   Wed 08 Jul 2015 02:51:56 AM EDT 
 mysql-libs-5.1.73-5.el6_6.x86_64              Wed 08 Jul 2015 02:51:54 AM EDT 
 jenkins-1.613-1.1.noarch                      Tue 12 May 2015 04:23:18 AM EDT 
 gpg-pubkey-d50582e6-4a3feef6                  Tue 12 May 2015 03:23:00 AM EDT 
 scap-security-guide-0.1.18-3.el6.noarch       Wed 29 Apr 2015 01:26:32 AM EDT

2. 查詢特定 RPM 包是否已安裝

命令格式:rpm -q package_name

如果是已安裝的包,則返回詳細包名;否則,返回此包未安裝的提示。比如:

清單 5. 查詢某 RPM 包是否已安裝
 [root@server01 ~]# rpm -q mysql-server 
 mysql-server-5.1.73-5.el6_6.x86_64 

 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -q docker-engine 
 package docker-engine is not installed

注意:實際操作中,請確認 package_name 拼寫正確!查詢時輸錯包名,會返回此包未安裝的提示資訊,常常給系統管理員帶來誤導。比如:

清單 6. 查詢拼寫錯誤的包名,返回此包未安裝
 [root@server01 ~]# rpm -q myaql-server 
 package myaql-server is not installed

提示:如果不能確定包名,建議使用清單 3. 中 rpm -qa | grep name的方法,進行嘗試查詢得到確切的包名。

3. 查詢特定 RPM 包的基本資訊

命令格式:rpm -qi package_name

這個命令查詢到的基本資訊包括:包名、版本號、發行號、群組、檔案大小、描述等資訊。比如:

清單 7. 查詢已安裝 RPM 包的基本資訊
 [root@server01 ~]# rpm -qi bash 
 Name        : bash                        
  Relocations: (not relocatable) 
 Version     : 4.1.2                           
   Vendor: Red Hat, Inc. 
 Release     : 29.el6                      
   Build Date: Fri 26 Sep 2014 06:32:15 AM EDT 
 Install Date: Sun 21 Dec 2014 08:52:32 PM EST    
   Build Host: x86-026.build.eng.bos.RedHat.com 
 Group       : System Environment/Shells    
  Source RPM: bash-4.1.2-29.el6.src.rpm 
 Size        : 3140846                      
     License: GPLv3+ 
 Signature   : RSA/8, Fri 26 Sep 2014 07:02:48 AM EDT, Key ID 
 199e2f91fd431d51 
 Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla> 
 URL         : http://www.gnu.org/software/bash 
 Summary     : The GNU Bourne Again 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 C shell 
 (csh). Most sh scripts can be run by bash without modification.

4. 查詢特定 RPM 包的組態檔

命令格式:rpm -qc package_name

當系統管理員要更改軟體的設定資訊,或者檢視設定項來定位程式 bug 時,這個命令就派上用場了。比如,查詢 openstack nova 的組態檔:

清單 8. 查詢已安裝 RPM 包的組態檔
 [root@nimbus-bvt-osee-kilo-rh7 ~]
 # rpm -qc openstack-nova-common 
 /etc/logrotate.d/openstack-nova 
 /etc/nova/api-paste.ini 
 /etc/nova/logging_sample.conf 
 /etc/nova/nova.conf 
 /etc/nova/policy.json 
 /etc/nova/rootwrap.conf 
 /etc/polkit-1/localauthority/50-local.d/50-nova.pkla 
 /etc/polkit-1/rules.d/50-nova.rules 
 /etc/sudoers.d/nova

5. 查詢特定 RPM 包的文件檔案

命令格式:rpm-qd package_name

一些軟體,尤其是大型專案的關鍵元件,在安裝時會同時安裝文件檔案以方便軟體的使用。定位 RPM 文件檔案,範例如下:

清單 9. 查詢已安裝軟體包的文件檔案
 [root@server01 ~]# rpm -qd mysql 
 /usr/share/doc/mysql-5.1.73/COPYING 
 /usr/share/doc/mysql-5.1.73/README 
 /usr/share/doc/mysql-5.1.73/README.mysql-docs 
 /usr/share/doc/mysql-5.1.73/README.mysql-license 
 /usr/share/man/man1/my_print_defaults.1.gz 
 /usr/share/man/man1/mysql.1.gz 
 /usr/share/man/man1/mysql_config.1.gz 
 /usr/share/man/man1/mysql_find_rows.1.gz 
 /usr/share/man/man1/mysql_waitpid.1.gz 
 /usr/share/man/man1/mysqlaccess.1.gz 
 /usr/share/man/man1/mysqladmin.1.gz 
 /usr/share/man/man1/mysqldump.1.gz 
 /usr/share/man/man1/mysqlshow.1.gz 
 /usr/share/man/man1/mysqlslap.1.gz

6. 查詢特定 RPM 包安裝檔案的狀態

命令格式:rpm -qs package_name

清單 10. 查詢已安裝軟體包檔案狀態
 [root@server01 ~]# rpm -qs pytz 
 normal        /usr/lib/python2.6/site-packages/pytz 
 missing       /usr/lib/python2.6/site-packages/pytz-2010h-py2.6.egg-info 
 normal        /usr/lib/python2.6/site-packages/pytz/__init__.py 
 normal        /usr/lib/python2.6/site-packages/pytz/__init__.pyc 
 normal        /usr/lib/python2.6/site-packages/pytz/__init__.pyo 
 normal        /usr/lib/python2.6/site-packages/pytz/reference.py 
 normal        /usr/lib/python2.6/site-packages/pytz/reference.pyc 
 normal        /usr/lib/python2.6/site-packages/pytz/reference.pyo 
 normal        /usr/lib/python2.6/site-packages/pytz/tzfile.py 
 normal        /usr/lib/python2.6/site-packages/pytz/tzfile.pyc 
 normal        /usr/lib/python2.6/site-packages/pytz/tzfile.pyo 
 normal        /usr/lib/python2.6/site-packages/pytz/tzinfo.py 
 normal        /usr/lib/python2.6/site-packages/pytz/tzinfo.pyc 
 normal        /usr/lib/python2.6/site-packages/pytz/tzinfo.pyo 
 normal        /usr/share/doc/pytz-2010h 
 normal        /usr/share/doc/pytz-2010h/CHANGES.txt 
 normal        /usr/share/doc/pytz-2010h/LICENSE.txt 
 normal        /usr/share/doc/pytz-2010h/README.txt

RPM 檔案狀態通常有四種,詳細說明見下表:

表 1. RPM 檔案的狀態
狀態說明
Normal 正常,表明檔案未被其他軟體包修改過
not installed 未安裝,表明檔案未安裝
Replaced 已替換,表明檔案已被其他軟體包修改替換過,不再是原先的檔案
net shared 網路共用,表明檔案處於網路共用狀態

7. 列出特定 RPM 包已安裝的所有檔案

命令格式:rpm -ql package_name

軟體原始碼中的一些檔案是需要安裝到系統中的,我們可以使用這個命令來確認安裝檔案位置是否正確、內容是否缺失等。比如,查詢 openstack-glance 安裝在系統中的檔案:

清單 11. 列出 RPM 包安裝在系統中的所有檔案
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -ql openstack-glance 
 /etc/glance 
 /etc/glance/glance-api-paste.ini 
 /etc/glance/glance-api.conf 
 /etc/glance/glance-cache.conf 
 /etc/glance/glance-registry-paste.ini 
 /etc/glance/glance-registry.conf 
 /etc/glance/glance-scrubber.conf 
 /etc/glance/policy.json 
 /etc/glance/schema-image.json 
 /etc/logrotate.d/openstack-glance 
 /usr/bin/glance-api 
 /usr/bin/glance-cache-cleaner 
 /usr/bin/glance-cache-manage 
 /usr/bin/glance-cache-prefetcher 
 /usr/bin/glance-cache-pruner 
 /usr/bin/glance-control 
 /usr/bin/glance-index 
 # The following lines are omitted

注意:該命令僅適用於已安裝的 RPM 包。對於尚未安裝的包,如果我們想知道其中包含哪些檔案,可以使用 rpm2cpio 命令檢視。

命令格式:rpm2cpio package_name.rpm | cpio -t

檢視未安裝的 RPM 包中的檔案,範例如下:

清單 12. 使用 rpm2cpio 命令查詢未安裝的 RPM 包含有的檔案
 [root@server01 rpmbuild-python-passlib]# ll RPMS/noarch/ 
 total 488 
 -rw-r--r-- 1 root root 497772 Sep 25 22:58 python-passlib-1.6.5-1.ibm.noarch.rpm 
 [root@server01 noarch]# rpm -ql python-passlib 
 package python-passlib is not installed 
 [root@server01 noarch]# rpm2cpio python-passlib-1.6.5-1.ibm.noarch.rpm | cpio -t 
 ./usr/lib/python2.7/site-packages/passlib 
 ./usr/lib/python2.7/site-packages/passlib-1.6.5-py2.7.egg-info 
 ./usr/lib/python2.7/site-packages/passlib-1.6.5-py2.7.egg-info/PKG-INFO 
 ./usr/lib/python2.7/site-packages/passlib-1.6.5-py2.7.egg-info/SOURCES.txt 
 ./usr/lib/python2.7/site-packages/passlib-1.6.5-py2.7.egg-info/dependency_links.txt 
 ./usr/lib/python2.7/site-packages/passlib-1.6.5-py2.7.egg-info/pbr.json 
 ./usr/lib/python2.7/site-packages/passlib-1.6.5-py2.7.egg-info/top_level.txt 
 ./usr/lib/python2.7/site-packages/passlib-1.6.5-py2.7.egg-info/zip-safe 
 ./usr/lib/python2.7/site-packages/passlib/__init__.py 
 ./usr/lib/python2.7/site-packages/passlib/_setup 
 ./usr/lib/python2.7/site-packages/passlib/_setup/__init__.py 
 ./usr/lib/python2.7/site-packages/passlib/_setup/docdist.py 
 ./usr/lib/python2.7/site-packages/passlib/_setup/stamp.py 
 # The following lines are omitted

8. 查詢系統中某檔案是屬於哪個 RPM 包

命令格式:rpm -ql file_name

我們知道 Linux 系統中,python 的安裝檔案放在 /var/lib/python*/site-packages/ 目錄下,如果你突然對其中的某個檔案的來源很好奇,可以用這個命令來查詢它是屬於哪一個 RPM 包的。範例如下:

清單 13. 查詢某個檔案是源自哪個 RPM 包
 [root@nimbus-bvt-osee-kilo-rh7 site-packages]# pwd 
 /usr/lib/python2.7/site-packages 
 [root@nimbus-bvt-osee-kilo-rh7 site-packages]# 
 rpm -qf WSME-0.6-py2.7-nspkg.pth 
 python-wsme-0.6-2.ibm.el7.noarch

9. 查詢 RPM 包安裝、解除安裝前後的指令碼

命令格式:rpm -q --scripts package_name

通常,RPM 包可以在安裝、解除安裝前後做些特定的操作,比如:在安裝 RPM 前進行衝突檢測、建立使用者和組等操作;在安裝 RPM 後根據軟體需要啟動服務或修改檔案屬性或設定等工作。範例如下:

清單 14. 顯示軟體包安裝、解除安裝前後執行的指令碼
 [root@server01 ~]# rpm -q --scripts mysql-server 
 preinstall scriptlet (using /bin/sh): 
 /usr/sbin/groupadd -g 27 -o -r mysql >/dev/null 2>&1 || : 
 /usr/sbin/useradd -M -N -g mysql -o -r -d /var/lib/mysql -s /bin/bash  
        -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || : 
 postinstall scriptlet (using /bin/sh): 
 if [ $1 = 1 ]; then 
    /sbin/chkconfig --add mysqld 
 fi 
 /bin/chmod 0755 /var/lib/mysql 
 /bin/touch /var/log/mysqld.log 
 preuninstall scriptlet (using /bin/sh): 
 if [ $1 = 0 ]; then 
    /sbin/service mysqld stop >/dev/null 2>&1 
    /sbin/chkconfig --del mysqld 
 fi 
 postuninstall scriptlet (using /bin/sh): 
 if [ $1 -ge 1 ]; then 
    /sbin/service mysqld condrestart >/dev/null 2>&1 || : 
 fi

10. 檢視 RPM 包的修改歷史

命令格式:rpm -q --changelog package_name

檢視修改歷史,有助於我們了解軟體包的功能,特別是在決定修改、增刪 patch 的時候,研究 changelog 可以幫助我們做出正確的決定。檢視 RPM 包修改歷史,範例如下:

清單 15. 檢視軟體包的修改歷史
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -q --changelog python-oslo-db 
 * Mon Mar 23 2015 Gang Xu <xugangsh@cn.ibm.com> - 1.7.1-1.ibm 
 - Fix rtc 197582 to update to 1.7.1 in Kilo 

 * Sun Mar 08 2015 Gang Xu <xugangsh@cn.ibm.com> - 1.5.0-3.ibm 
 - Fix rtc 196366 to add one patch to remove import testresources and 
 - testscenarios in oslo.db 1.5.0 

 * Fri Mar 06 2015 Wen Jianjiao <wenjianj@cn.ibm.com> - 1.5.0-1.ibm 
 - Update dependency version since oslo.db requirements.txt changed 
 - Related RTC 196366 
 # The following lines are omitted

11. 列出特定群組已安裝的 RPM 包

命令格式:rpm -qg group_name

RPM 包的基本資訊中有一項是組(Group),它定義了 RPM 包所屬的類別。我們可以使用 rpm 命令查詢定義在某個組下的全部 RPM 包。比如,列出系統中安裝的應用程式資料庫(Applications/Databases)相關的 RPM 包。

清單 16. 查詢某個群組裡的 RPM 包
 [root@server01 ~]# rpm -qg Applications/Databases 
 sqlite-3.6.20-1.el6.x86_64 
 db4-utils-4.7.25-18.el6_4.x86_64 
 postgresql-libs-8.4.20-2.el6_6.x86_64 
 postgresql-8.4.20-2.el6_6.x86_64 
 mysql-libs-5.1.73-5.el6_6.x86_64 
 mysql-5.1.73-5.el6_6.x86_64 
 mysql-server-5.1.73-5.el6_6.x86_64 
 mysql-devel-5.1.73-5.el6_6.x86_64

通常,RPM 可以分為這幾大類:娛樂(Amusement)、開發(Development)、文件(Document)、硬體(Hardware)、綜合包(Metapackages)、多媒體(Multimedia)、生產力(Productivity)和系統(System)。清單 15. 列出了常見的 Group:

清單 17. RPM 常見 Group
 Amusements/Games 
 Amusements/Graphics 
 Applications/Archiving 
 Applications/Communications 
 Applications/Databases 
 Applications/Editors 
 Applications/Emulators 
 Applications/Engineering 
 Applications/File 
 Applications/Internet 
 Applications/Multimedia 
 Applications/Productivity 
 Applications/Publishing 
 Applications/System 
 Applications/Text 
 Development/Debuggers 
 Development/Languages 
 Development/Libraries 
 Development/System 
 Development/Tools 
 Documentation 
 System Environment/Base 
 System Environment/Daemons 
 System Environment/Kernel 
 System Environment/Libraries 
 System Environment/Shells 
 User Interface/Desktops 
 User Interface/X 
 User Interface/X Hardware Support

RPM 包依賴關係查詢

Linux 系統中,RPM 之間往往存在依賴關係,即一個軟體可能應用到其他軟體提供的某些功能。RPM 依賴機制,極大地減少了軟體系統的冗餘,且方便了軟體包的版本升級、安裝和解除安裝、衝突檢查等,從而有利於系統的維護和管理。

RPM 在描述軟體包之間依賴關係時,使用了一個術語:能力(capability)。"能力"可理解為軟體功能的一種抽象,定義每個 RPM 包會提供一種或多種"能力",某些 RPM 包會依賴其他包提供的"能力"。

RPM Database 通過記錄已安裝的軟體包所依賴的和提供的"能力"資訊,來表示軟體之間的依賴關係。在安裝某個 RPM 包時,系統會自動檢測該包所依賴的"能力"是否已安裝,如果是的則可以安裝該包。成功安裝後,該包提供的"能力"會被儲存至 RPM Database。如果系統中缺少任何其依賴的"能力",則提示錯誤資訊無法安裝;在解除安裝某個 RPM 包時,系統會自動檢測該包所提供的"能力"是否仍被其他 RPM 包使用,如果尚被其他 RPM 包依賴,則無法解除安裝。這一小節中,我們介紹如何查詢 RPM Database 中記錄的 RPM 包和"能力"之間的依賴、供給關係。

1. 查詢特定 RPM 包依賴哪些"能力"

命令格式:rpm -q query_options --requires package_namee

大多數情況下,"能力"用檔名或者軟體包的名字表示。上面的命令將列出軟體包依賴的所有"能力",比如:

清單 18. 查詢 RPM 包依賴的“能力”
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -q --requires python-keystoneclient 
 /usr/bin/python 
 python(abi) = 2.7 
 python-argparse 
 python-iso8601 >= 0.1.9 
 python-keyring 
 python-netaddr >= 0.7.12 
 python-oslo-config >= 1:1.9.0 
 python-oslo-i18n >= 1.3.0 
 python-oslo-serialization >= 1.2.0 
 python-oslo-utils >= 1.2.0 
 python-pbr >= 0.6 
 python-pbr < 1.0 
 python-prettytable > 0.7 
 python-prettytable < 0.8 
 python-requests >= 2.2.0 
 python-six >= 1.9.0 
 python-stevedore >= 1.1.0 
 rpmlib(CompressedFileNames) <= 3.0.4-1 
 rpmlib(FileDigests) <= 4.6.0-1 
 rpmlib(PartialHardlinkSets) <= 4.0.4-1 
 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 
 rpmlib(PayloadIsXz) <= 5.2-1

2. 查詢特定 RPM 包提供哪些"能力"

命令格式:rpm -q query_options --provides package_name

RPM 包會對外提供某些"能力",比如:

清單 19. 查詢 RPM 包提供的“能力”
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -q --provides python-six 
 python-six = 1.9.0-1.ibm.el7 

 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -q --provides bash 
 /bin/bash 
 /bin/sh 
 bash = 4.2.46-12.el7 
 bash(x86-64) = 4.2.46-12.el7 
 config(bash) = 4.2.46-12.el7

通常"能力"與包名相同,我們也可以在 spec 檔案中指定 RPM 提供哪些能力。

語法格式:Provides: capability

3. 查詢依賴某種"能力"的 RPM 包

命令格式:rpm -q query_options --whatrequires capability

這個命令可以查詢到所有依賴該"能力"的 RPM 包,比如:

清單 20. 查詢依賴某“能力”的 RPM 包
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -q --whatrequires openssl 
 perl-IO-Socket-SSL-1.94-3.el7.noarch 
 unbound-libs-1.4.20-19.el7.x86_64 
 python-cryptography-0.8.1-1.ibm.el7.x86_64 
 python-nova-2015.1.1.1-201509142203.ibm.el7.140.noarch 
 openvswitch-2.3.0-3.ibm.el7.x86_64

解除安裝 RPM 包時,如果其提供的"能力"被其他的 RPM 包所依賴,則解除安裝命令會生成一個錯誤資訊,最終無法解除安裝此包。比如:

清單 21. openssl 被其他 RPM 包依賴,解除安裝失敗
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -e openssl 
 error: Failed dependencies: 
        openssl >= 0.9.8 is needed by (installed) 
         perl-IO-Socket-SSL-1.94-3.el7.noarch 
        openssl >= 0.9.8g-12 is needed by (installed) 
         unbound-libs-1.4.20-19.el7.x86_64 
        openssl is needed by (installed) 
        python-cryptography-0.8.1-1.ibm.el7.x86_64 
        openssl is needed by (installed) 
        python-nova-2015.1.1.1-201509142203.ibm.el7.140.noarch 
        openssl is needed by (installed) 
        openvswitch-2.3.0-3.ibm.el7.x86_64 
    /usr/bin/openssl is needed by (installed) 
     authconfig-6.2.8-9.el7.x86_64

此時,如仍需解除安裝,可以加上引數 --nodeps(不考慮依賴關係)來強制解除安裝。

命令格式:rpm -e --nodeps package_name

注意:強制解除安裝可能導致系統癱瘓,請慎用此命令!

4. 查詢提供某種"能力"的 RPM 包

命令格式:rpm -q query_options --whatprovides capability

現在,我們用這個命令來驗證上面提到的 openssl "能力"確實由 openssl RPM 包提供。

清單 22. 查詢提供某“能力”的 RPM 包
 [root@nimbus-bvt-osee-kilo-rh7 ~]# rpm -q --whatprovides openssl 
 openssl-1.0.1e-42.el7.x86_64

提示:一般情況下,一種"能力"由一個 RPM 提供,如果多個 RPM 都提供同一種"能力",則可能產生衝突(conflicts)。

RPM 包的驗證

RPM Database 不僅提供了 RPM 包的查詢功能,還提供了對已安裝的 RPM 包進行驗證的功能。通過驗證,我們可以很清楚地知道一個檔案變動了什麼,這是 RPM 的聰明之處。本節我們來介紹幾個常用的驗證命令。

1. 驗證某個 RPM 包的狀態

命令格式:rpm -V package_name

校驗時,若發現檔案丟失,RPM 將輸出"missing 檔名"。若有屬性方面錯誤,RPM 將用表 2. 中的屬性程式碼輸出錯誤型別。

表 2. RPM 校驗屬性說明
程式碼含義
S 表示檔案大小
M 表示檔案許可權
5 表示 MD5 校驗和
D 表示主從裝置號
L 表示符號連結
U 表示屬主
G 表示屬組
T 表示最後修改時間

如果檔案某項屬性正常,則會顯示點(.)字元,否則顯示相應的表示字元。範例如下:

清單 23. 驗證某個 RPM 包
 [root@server01 ~]# rpm -V pytz 
 missing     /usr/lib/python2.6/site-packages/pytz-2010h-py2.6.egg-info 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/__init__.py 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/__init__.pyc 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/__init__.pyo 
 .......T.    /usr/lib/python2.6/site-packages/pytz/reference.py 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/reference.pyc 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzfile.py 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzfile.pyc 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzinfo.py 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzinfo.pyc 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzinfo.pyo

2. 驗證系統中所有的 RPM 包

命令格式:rpm -Va

使用這個命令,我們可以對系統中所有 RPM 檔案做一個全面檢查。範例如下:

清單 24. 驗證系統中所有 RPM 包
 [root@server01 ~]# rpm -Va 
 S.5....T.  c /etc/rsyslog.conf 
 SM5....T.  c /etc/sysconfig/rhn/up2date 
 S.5....T.    /usr/lib/jenkins/jenkins.war 
 prelink: /usr/bin/certutil: at least one of file's
  dependencies has changed since prelinking 
 S.?......    /usr/bin/certutil 
 prelink: /usr/bin/cmsutil: at least one of file's 
 dependencies has changed since prelinking 
 S.?......    /usr/bin/cmsutil 
 prelink: /usr/bin/crlutil: at least one of file's 
 dependencies has changed since prelinking 
 S.?......    /usr/bin/crlutil 
 # The following lines are omitted

3. 驗證某個組的 RPM 包

命令格式:rpm -Vg group_name

當不必要對整個系統做檢查,只需驗證某類別的 RPM 檔案狀態時,我們可以使用這個命令。比如,驗證 Development/Lanuages 組下面的 RPM 檔案狀態:

清單 25. 驗證某個組的 RPM 包
 [root@server01 ~]# rpm -Vg Development/Languages 
 missing     /usr/lib/python2.6/site-packages/pytz-2010h-py2.6.egg-info 
 S.5....T.   /usr/lib/python2.6/site-packages/pytz/__init__.py 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/__init__.pyc 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/__init__.pyo 
 .......T.    /usr/lib/python2.6/site-packages/pytz/reference.py 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/reference.pyc 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzfile.py 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzfile.pyc 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzinfo.py 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzinfo.pyc 
 S.5....T.    /usr/lib/python2.6/site-packages/pytz/tzinfo.pyo

RPM Database 備份與恢復

經過上面的講述,我們不難發現 RPM Database 在系統中的重要作用。一旦 RPM Database 遭到損壞,輕則可能導致系統中已安裝的 RPM 無法使用,重則導致整個系統的癱瘓。在這一小節中,我們來介紹 RPM Database 的基本結構,以及如何對其備份和恢復。

1.RPM Database 基本結構

預設情況下,RPM Database 存放在 /var/lib/rpm 目錄,除了 __db.00* 是資料檔案外,其他檔案都屬於 Berkeley DB 格式。

清單 26. RPM Database 結構
 [root@server01 ~]# file /var/lib/rpm/* 
 /var/lib/rpm/Basenames:      Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Conflictname:   Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/__db.001:       Applesoft BASIC program data 
 /var/lib/rpm/__db.002:       386 pure executable 
 /var/lib/rpm/__db.003:       386 pure executable not stripped 
 /var/lib/rpm/__db.004:       386 pure executable 
 /var/lib/rpm/Dirnames:       Berkeley DB (Btree, version 9, native byte-order) 
 /var/lib/rpm/Filedigests:    Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Group:          Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Installtid:     Berkeley DB (Btree, version 9, native byte-order) 
 /var/lib/rpm/Name:           Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Obsoletename:   Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Packages:       Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Providename:    Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Provideversion: Berkeley DB (Btree, version 9, native byte-order) 
 /var/lib/rpm/Pubkeys:        Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Requirename:    Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Requireversion: Berkeley DB (Btree, version 9, native byte-order) 
 /var/lib/rpm/Sha1header:     Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Sigmd5:         Berkeley DB (Hash, version 9, native byte-order) 
 /var/lib/rpm/Triggername:    Berkeley DB (Hash, version 9, native byte-order)

這些檔案對應不同的 RPM 查詢型別,比如,上文曾提到過的包名查詢命令 rpm -q package_name就是通過 /var/lib/rpm/Name檔案得到的。如果這個檔案受到損壞或缺失,則 rpm -q package_name命令無法正常工作。舉個例子,我們先將 Name 檔案移走,然後查詢系統中某個已安裝的包,則無法找到該包。

清單 27. 破壞 RPM Database 檔案,則 RPM 查詢命令失敗
 [root@server01 rpm]# rpm -q perl 
 perl-5.10.1-136.el6_6.1.x86_64 
 [root@server01 rpm]# pwd 
 /var/lib/rpm 
 [root@server01 rpm]# mv Name .. 
 [root@server01 rpm]# ll |grep Name 
 [root@server01 rpm]# rpm -q perl 
 package perl is not installed

2.RPM Database 的備份

RPM Database 關乎重大,系統管理員一定要對其進行備份!

備份的方法十分簡單,將資料庫檔案打包儲存即可。

命令格式:tar cf rpmdb_backup.tar /var/lib/rpm

清單 28. 對 RPM Database 進行備份
 [root@server01 ~]# tar cf rpmdb_backup.tar /var/lib/rpm 
 tar: Removing leading `/' from member names 
 [root@server01 ~]# ll |grep rpmdb_backup 
 -rw-r--r--   1 root root 141004800 Sep 29 07:44 rpmdb_backup.tar

系統管理員,針對實際需要可以結合 at、crontab 等命令定期對 RPM Database 進行備份。

3.RPM Database 的恢復

命令格式:rpm --rebuild

當 RPM Database 損壞時,我們可以使用重建資料庫命令對其進行恢復。

注意:在使用重建命令恢復資料庫前,一定先要對原有資料庫檔案進行備份!

舉一個常見的資料庫損壞的例子:Error: rpmdb open failed

清單 29. RPM Database Error: rpmdb open failed
 [root@server01 install]# rpm -q mysql 
 error: db5 error(-30969) from dbenv->open: 
  BDB0091 DB_VERSION_MISMATCH: Database environment version mismatch 
 error: cannot open Packages index using db5 -  (-30969) 
 error: cannot open Packages database in /var/lib/rpm 
 error: db5 error(-30969) from dbenv->open: 
 BDB0091DB_VERSION_MISMATCH: Database environment version mismatch 
 error: cannot open Packages database in /var/lib/rpm 
 package mysql is not installed

恢復 RPM Database 前,一定先將原有資料進行備份,然後再使用恢復命令!

通常,恢復方法有下面三種:

  1. 只移除 /var/lib/rpm/__db* 檔案,然後執行 rpm --rebuilddb命令
  2. 當上面的方法沒能恢復資料庫時,轉移 /var/lib/rpm 資料夾,然後執行 rpm --rebuilddb命令
  3. 當前面兩個方法都沒奏效時,則表示情況比較嚴重,需要重新建立 RPM 資料庫,再進行重建資料庫操作。首先,選擇一個目錄建立新的資料庫,執行 rpm --initdb --dbpath new_db_path;;然後,執行重構資料庫命令:rpm --rebuilddb

針對清單 28. 中的錯誤,我們採用下面的恢復方法:

清單 30. RPM Database 恢復舉例
 [root@server01 ~]# cp -r /var/lib/rpm/ ~/rpm-db-backup 
 [root@server01 ~]# rpm – rebuilddb 
 [root@server01 ~]# rpm -q mysql 
 mysql-5.1.73-5.el6_6.x86_64

結束語

RPM 使得 Linux 系統軟體管理變得十分便利,除了 RPM 提供的自動安裝、解除安裝、升級功能極大地減輕了開發人員和系統管理員的工作量外,RPM 還提供了強大的查詢和驗證功能。本文圍繞 RPM Database,結合實際的應用場景,介紹了 RPM 基本資訊查詢、RPM 依賴關係原理、RPM 驗證和 RPM 資料庫備份與恢復等內容。希望通過本文的閱讀,對您工作中遇到的 RPM 軟體包相關問題有所幫助。

參考資料

學習

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-12/137783.htm


IT145.com E-mail:sddin#qq.com