Linux應用程序的組成
安裝完一個軟件包以后,可能會向系統中復制大量的數據文件,并進行相關設置。在Linux系統中,典型的應用程序通常由以下幾部分組成。
普通的可執行程序文件:一般保存在“/usr/bin”目錄中,普通用戶即可執行。
服務器程序、管理程序文件:一般保存在”/usr/sbin“目錄中,只有管理員能執行。
配置文件:一般保存在”/etc“目錄中,配置文件較多時會建立相應的子目錄。
日志文件:一般保存在”/var/log“目錄中。
關于應用程序的參考文檔等數據:一般保存在”/usr/share/doc”目錄中。
執行文件及配置文件的man手冊頁:一般保存在”/usr/share/man“目錄中。
軟件包的封裝類型
對于各種應用程序的軟件包,在封裝時可以采用各種不同的類型,不同類型的軟件包其安裝方法也各不相同。常見的軟件包封裝類型如下:
RPM軟件包:這種軟件包的擴展名為”.rpm“,只能在使用RPM(RPM Package Manager,RPM軟件包管理器)機制的Linux操作系統中安裝,如RHEL 5、Fedora 9、Suse 10等。RPM軟件包一般針對特定版本的系統量身定制,因此依懶性較強。安裝RPM包需要使用Linux系統中的rpm命令。
DEB軟件包:這種軟件包文件的擴展名為“.deb”,只能在DPKG(Debian Package,Debian包管理器)機制的Linux操作系統中進行安裝,如Debian 8.0、Ubuntu 11.04等。安裝DEB軟件包需要使用Linux系統中的dpkg命令。
源代碼軟件包:這種軟件包是程序員開發完成的原始代碼,一般被制作成“.tar.gz”、“.tar.bz2”等格式的壓縮包文件,因多數使用tar命令打包而成,所以經常被稱為“TarBall”。安裝源碼軟件包需要使用相應的編譯工具,如Linux中的C語言編譯器gcc。由于大部分Linux系統中都安裝有基本的編譯環境,因此使用源碼軟件包要更加靈活。
附帶安裝程序的軟件:這種軟件包的擴展名不一,但仍以TarBall格式的居多。軟件包中會提供用于安裝的可執行程序或腳本文件,如install.sh、setup等,有時候會以”.bin”格式的單個安裝文件形式出現。只需運行安裝文件就可以根據向導程序的提示完成安裝操作。
開發源代碼的自由軟件絕大多數選擇以TarBall的形式發布,而RPM包、DEB包等則使用了二進制的文件格式,代碼相對比較封閉。
RPM概述
RPM包是各種Linux發行版本中應用最廣泛的軟件包之一。RPM包以其強大的功能和廣泛的兼容性而得到多數Linux發行版本的支持和廣大Linux使用者的擁護。
RPM軟件包管理機制最早由Red Hat公司提出,后來隨著版本的升級逐漸融入了更多的優秀特性,成為眾多Linux發行版中公認的軟件包管理標準。在其官方站點http://www.rpm.org中,可以了解到關于RPM包管理機制的詳細資料。
RPM包管理器通過建立統一的文件數據庫,對在Linux系統中安裝、卸載、升級的各種.rpm軟件包進行詳細的記錄,并能夠自動分析軟件包之間的依賴關系,保持各應用程序在一個協調、有序的整體環境中運行。
程序包管理器
二進制應用程序的組成部分:
二進制文件、庫文件、配置文件、幫助文件
程序包管理器:
debian:deb文件, dpkg包管理器
redhat:rpm文件, rpm包管理器
rpm: Redhat Package Manager
RPM Package Manager
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作
1、包文件組成 (每個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本
2、數據庫(公共)
程序包名稱及版本
依賴關系
功能說明
包安裝后生成的各文件路徑及校驗碼信息
程序包的來源
管理程序包的方式:
使用包管理器: rpm
使用前端工具: yum, dnf
獲取程序包的途徑:
(1) 系統發版的光盤或官方的服務器;
CentOS鏡像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 項目官方站點
(3) 第三方組織:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推薦,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4) 自己制作
v 注意:檢查其合法性: 來源合法性,程序包的完整性
包命名
軟件名-軟件版本-發布次數.操作系統類型.硬件架構類型.rpm
源代碼:name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
例: bash-4.2.46-19.el7.x86_64.rpm
VERSION: major.minor.release
release: release.OS
常見的arch:
x86:i386, i486, i586, i686
x86_64:x64, x86_64, amd64
powerpc: ppc
跟平臺無關: noarch
包命名和工具
包:分類和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
包之間:可能存在依賴關系,甚至循環依賴
解決依賴包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper:suse上的rpm前端管理工具
dnf:Fedora 18+ rpm包管理器前端管理工具
庫文件
查看二進制程序所依賴的庫文件:
同一個庫文件可能會被多個軟件包所依賴
ldd /PATH/TO/BINARY_FILE
[root@localhost ~]# ldd /bin/ls linux-vdso.so.1 => (0x00007ffee85f4000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb4be74f000) libcap.so.2 => /lib64/libcap.so.2 (0x00007fb4be54a000) libacl.so.1 => /lib64/libacl.so.1 (0x00007fb4be340000) libc.so.6 => /lib64/libc.so.6 (0x00007fb4bdf7f000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb4bdd1e000) liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fb4bdaf8000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fb4bd8f4000) /lib64/ld-linux-x86-64.so.2 (0x00007fb4be987000) libattr.so.1 => /lib64/libattr.so.1 (0x00007fb4bd6ef000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb4bd4d2000) [root@localhost ld.so.conf.d]# ldd /bin/bash linux-vdso.so.1 => (0x00007ffc505fe000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fcb04ad4000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fcb048d0000) libc.so.6 => /lib64/libc.so.6 (0x00007fcb0450e000) /lib64/ld-linux-x86-64.so.2 (0x00007fcb04d11000)
管理及查看本機裝載的庫文件:
ldconfig
/sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系
配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件: /etc/ld.so.cache
[root@localhost ld.so.conf.d]# /sbin/ldconfig -p 920 libs found in cache `/etc/ld.so.cache' p11-kit-trust.so (libc6,x86-64) => /lib64/p11-kit-trust.so libzapojit-0.0.so.0(libc6,x86-64)=> /lib64/libzapojit-0.0.so.0 libz.so.1 (libc6,x86-64) => /lib64/libz.so.1 libyelp.so.0 (libc6,x86-64) => /lib64/libyelp.so.0 libyajl.so.2 (libc6,x86-64) => /lib64/libyajl.so.2 libxtables.so.10 (libc6,x86-64) => /lib64/libxtables.so.10 libxslt.so.1 (libc6,x86-64) => /lib64/libxslt.so. ..
操作系統自身的庫文件
[root@localhost ld.so.conf.d]# ls /lib64/ alsa-lib libkeyutils.so.1 ao libkeyutils.so.1.5 audit libkkc avahi libkkc.so.2 bluetooth libkkc.so.2.0.0 brltty libkmod.so.2 cifs-utils libkmod.so.2.2.10 colord-plugins libkms.so.1 ...
[root@localhost ~]# cd /etc/ld.so.conf.d/ [root@localhost ld.so.conf.d]# ls dyninst-x86_64.conf libiscsi-x86_64.conf kernel-3.10.0-327.el7.x86_64.conf mariadb-x86_64.conf
以上為某些軟件自己的庫
[root@localhost ld.so.conf.d]# cat mariadb-x86_64.conf /usr/lib64/mysql #mysql相關的庫路徑 [root@localhost ld.so.conf.d]# ls /usr/lib64/mysql/ libmysqlclient.so.18 libmysqlclient.so.18.0.0
使用RPM包管理命令——RPM
rpm命令是實現RPM軟件包管理的主要工具。
rpm命令的格式
使用rpm命令能夠實現幾乎所有對RPM軟件包的管理功能,執行“man rpm”命令可以獲得關于rpm命令的詳細幫助信息。從rpm命令的手冊頁信息中可以看出,rpm命令具有相當復雜的命令格式,結合不同的命令選項及子選項主要可以實現以下三類功能。
查詢、驗證RPM軟件包的相關信息。
安裝、升級、卸載RPM軟件包。
維護RPM數據庫信息等綜合管理操作。
查詢RPM軟件包信息
使用rpm命令的查詢功能可以檢查某個軟件包是否已經安裝,了解軟件包的用途、軟件包復制到系統中的文件等各種相關信息,以便更好地管理Linux系統的應用程序。
rpm命令的查詢功能主要通過“-q”選項實現,主要針對當前系統中已經安裝的軟件包;通過“-qp”選項可以針對尚未安裝的RPM包文件進行查詢。根據所需查詢的具體項目不同,還可以為這兩個選項指定相關的字選項。
不帶子選項的“-q”選項可用于查詢已知名稱的軟件包是否已經安裝,需要使用準確的軟件名作為參數(可以有多個)。結合不同的子選項使用時,可以實現更具體的查詢。
rpm {-q|–query} [select-options] [query-options]
[select-options]
-a: 所有包
-f: 查看指定的文件由哪個程序包安裝生成
-p rpmfile:針對尚未安裝的程序包文件做查詢操作;
–whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
–whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
rpm2cpio 包文件|cpio –itv 預覽包內文件
rpm2cpio 包文件|cpio –id “ *.conf” 釋放包內文件
[query-options]
–changelog:查詢rpm包的changelog
-c: 查詢程序的配置文件
-d: 查詢程序的文檔
-i: information
-l: 查看指定的程序包安裝后生成的所有文件;
–scripts:程序包自帶的腳本片斷
-R: 查詢指定的程序包所依賴的CAPABILITY;
–provides: 列出指定程序包所提供的CAPABILITY;
-qa:顯示當前系統中以RPM方式安裝的所有軟件列表。
–qi:查看指定軟件包的名稱、版本、許可協議、用途描述等詳細信息(--info)。
–ql:顯示指定的軟件包在當前系統中安裝的所有目錄、文件列表(–-list)。
–qf:查看指定的文件或目錄是由哪個軟件包所安裝的(–-file)。
–qc:僅顯示指定軟件包安裝的配置文件。
-qd:僅顯示指定軟件包安裝的文檔文件。
直接執行“rpm -q”命令,將列出當前系統中以RPM方式安裝的所有軟件包清單,每行記錄一個軟件包的名稱、版本等信息。結合管道操作和“wc -l”命令,可以統計出系統中已經安裝的RPM軟件的個數。
查看Linux主機所有已安裝的軟件包
[root@localhost ~]# rpm -qa | more libsss_nss_idmap-1.13.0-40.el7.x86_64 pygobject2-2.28.6-11.el7.x86_64 seavgabios-bin-1.7.5-11.el7.noarch libreport-centos-2.1.11-32.el7.centos.x86_64 xkeyboard-config-2.14-1.el7.noarch jansson-2.4-6.el7.x86_64 ...
統計系統中所有軟件包安裝的個數
[root@localhost ~]# rpm -qa | wc -l 1249
查看指定的軟件包是否安裝
[root@localhost ~]# rpm -qa tree tree-1.6.0-10.el7.x86_64
查詢指定的文件由哪個軟件包生成
[root@localhost bin]# rpm -qf /etc/issue centos-release-7-2.1511.el7.centos.2.10.x86_64 [root@localhost bin]# rpm -qf /root/bin/for_num4.sh file /root/bin/for_num4.sh is not owned by any package
查詢安裝完的軟件包生成了哪些文件
[root@localhost function]# rpm -ql tree /usr/bin/tree /usr/share/doc/tree-1.6.0 /usr/share/doc/tree-1.6.0/LICENSE /usr/share/doc/tree-1.6.0/README /usr/share/man/man1/tree.1.gz
當軟件還沒安裝時,查看軟件包安裝后會生成哪些文件
[root@localhost ~]# rpm -qpl /media/Packages/tree-1.6.0-10.el7.x86_64.rpm /usr/bin/tree /usr/share/doc/tree-1.6.0 /usr/share/doc/tree-1.6.0/LICENSE /usr/share/doc/tree-1.6.0/README /usr/share/man/man1/tree.1.gz
如果并不知道準確的軟件包名稱,還可以對全部查詢結果進行過濾,使用軟件包的一部分名稱進行模糊查詢(查詢時不區分大小寫),根據查詢結果在進行判斷。
[root@localhost ~]# rpm -qa | grep -i samba samba-client-libs-4.2.3-10.el7.x86_64 samba-common-4.2.3-10.el7.noarch samba-common-tools-4.2.3-10.el7.x86_64 samba-common-libs-4.2.3-10.el7.x86_64 samba-libs-4.2.3-10.el7.x86_64
對于系統中已經安裝的各種軟件程序,如果不知道其中某個軟件的用途,同樣可以通過rpm工具進行查詢。
查看tree軟件包的詳細信息
[root@localhost ~]# rpm -qi tree Name : tree Version : 1.6.0 Release : 10.el7 Architecture: x86_64 Install Date: Thu 18 Aug 2016 06:08:41 PM CST Group : Applications/File Size : 89505 License : GPLv2+ ...
查詢rpm包的changelog
[root@CentOS6 ~]# rpm -q --changelog bash * Tue Dec 22 2015 Ondrej Oprala <ooprala@redhat.com> - 4.1.2-40 - Bash shouldn't ignore bash --debugger without a dbger installed Related: #1260568 * Wed Nov 25 2015 Ondrej Oprala <ooprala@redhat.com> - 4.1.2-39 - Wrong parsing inside for loop and brackets Resolves: #1207803 ...
當需要查看某個軟件包安裝的目錄和文件清單時,可以使用“-ql”選項。
[root@localhost ~]# rpm -ql tree /usr/bin/tree /usr/share/doc/tree-1.6.0 /usr/share/doc/tree-1.6.0/LICENSE /usr/share/doc/tree-1.6.0/README /usr/share/man/man1/tree.1.gz
當需要知道系統中的某個文件是由哪一個軟件包生成的時候,可以使用“-qf”選項。
[root@localhost ~]# which wim /usr/bin/which: no wim in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/testdir/script:) [root@localhost ~]# rpm -qf /usr/bin/vim vim-enhanced-7.4.160-1.el7.x86_64
只看指定軟件包的配置文件
[root@CentOS6 ~]# rpm -qc bash /etc/skel/.bash_logout /etc/skel/.bash_profile /etc/skel/.bashrc
只看指定軟件包的文檔
[root@CentOS6 ~]# rpm -qd bash /usr/share/doc/bash-4.1.2/COPYING /usr/share/info/bash.info.gz /usr/share/man/man1/..1.gz /usr/share/man/man1/:.1.gz /usr/share/man/man1/[.1.gz /usr/share/man/man1/alias.1.gz ...
使用rpm命令只能查詢通過RPM方式安裝的軟件包信息,對通過其他途徑安裝(例如源碼編譯、手動復制等方式)到系統中的軟件包,rpm命令將無法獲取相關信息。
查詢RPM包文件中的相關信息
使用“-qp”選項時,必須以RPM包文件的路徑作為參數(可以有多個),而不是軟件包名稱。其相關的子選項于使用“-q”查詢時類型,常用的兩個查詢選項如下所述。
-qpi:查看指定軟件包的名稱、版本、許可協議、用途描述等詳細信息。
–qpl:查看該軟件準備要安裝的所有目標目錄、文件列表。
已知光盤目錄中有一個RPM安裝包文件ethtool-6-4.el5.i386.rpm,若要在安裝之前了解該軟件的用途,可以執行以下操作。
[root@localhost ~]# rpm -qpi /media/Packages/ethtool-3.15-2.el7.x86_64.rpm Name : ethtool Epoch : 2 Version : 3.15 Release : 2.el7 Architecture: x86_64 Install Date: (not installed) Group : Applications/System Size : 313775 License : GPLv2 Signature : RSA/SHA256, Sat 14 Mar 2015 03:46:39 PM CST, Key ID 24c6a8a7f4a80eb5 Source RPM : ethtool-3.15-2.el7.src.rpm ...
若希望進一步了解該軟件包中包含哪些文件(安裝后將復制到系統中),可以執行以下操作。
[root@localhost ~]# rpm -qpl /media/Packages/ethtool-3.15-2.el7.x86_64.rpm /usr/sbin/ethtool /usr/share/doc/ethtool-3.15 /usr/share/doc/ethtool-3.15/AUTHORS /usr/share/doc/ethtool-3.15/COPYING /usr/share/doc/ethtool-3.15/ChangeLog /usr/share/doc/ethtool-3.15/LICENSE /usr/share/doc/ethtool-3.15/NEWS /usr/share/doc/ethtool-3.15/README /usr/share/man/man8/ethtool.8.gz
[root@CentOS6 ~]# rpm -q -scripts bash postinstall scriptlet (using <lua>): #安裝前腳本 ... postuninstall scriptlet (using /bin/sh): #卸載后腳本 ...
RPM軟件包安裝
在日常系統管理工作中,安裝、升級及卸載軟件包是管理應用程序最基本的工作內容。
使用rpm命令安裝軟件包時,需要指定完整的包文件名作為參數(可以有多個);而卸載軟件包時,只需要指定軟件包名稱即可。若要一次安裝多個RPM軟件包,可以使用通配符”*“,這種方式在安裝存在相互依賴關系的多個軟件包上特別有用,系統將會自動檢查依賴性并決定安裝順序,而無需管理員去判斷應該先裝哪一個包。
rpm {-i|–install} [install-options] PACKAGE_FILE…
-i,install:在當前系統中安裝一個新的RPM軟件包
-v,verbose:顯示軟件安裝過程中的詳細信息
-vv:顯示比-v更加詳細信息
-h:在安裝或升級軟件包的過程中,以#號顯示進度狀態
–test:測試安裝,但不真正執行安裝,dry run模式
–nodeps:忽略依賴關系
–replacepkgs| replacefiles (覆蓋包)當安裝的rpm文件被破壞時,會用到,相當于重新安裝一遍
–replacefiles (覆蓋文件)
–nosignature: 不檢查來源合法性
–nodigest:不檢查包完整性
–noscipts:不執行程序包腳本片斷
%pre: 安裝前腳本; –nopre
%post: 安裝后腳本; –nopost
%preun: 卸載前腳本; –nopreun
%postun: 卸載后腳本; –nopostun
RPM軟件包升級、卸載
在安裝一個新的軟件包時,通常使用”-ivh“的組合選項,這樣便于了解軟件安裝的過程信息,及時跟蹤安裝進度。如果是使用新版本的軟件包替換舊的版本,則只需將”-i”換成“-U”即可。
rpm {-U|–upgrade} [install-options] PACKAGE_FILE…
v rpm {-F|–freshen} [install-options] PACKAGE_FILE…
-e:卸載指定名稱的軟件包
-U,upgrade:檢查并升級系統中的某個軟件包,若該軟件包原來并未安裝,則等同于“-i”選項
-F,freshen:檢查并更新系統中的某個軟件包,若該軟件包原來并未安裝,則放棄安裝。還有幾個相關的命令選項,可以用于輔助安裝、卸載軟件包的過程
–force:強制安裝某個軟件包,當需要替換已安裝的軟件包及文件,或者安裝一個比當前使用的軟件版本更舊的軟件時,可以使用此選項。
–nodeps:在安裝或升級、卸載一個軟件包時,不檢查與其他軟件包的依賴關系。
–oldpackage:降級
升級注意項
(1) 不要對內核做升級操作; Linux支持多內核版本并存,因此,對直接安裝新版本內核
(2) 如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
卸載一個軟件包時,主要使用“-e”選項。
當需要安裝、卸載一個與其他程序存在依賴關系的軟件包時,系統將提示存在依賴關系而放棄執行。這是可以結合“–nodeps”選項忽略依賴關系,而強行安裝或卸載指定的軟件包。忽略依賴關系可能會導致軟件功能異?;蚴?,因此只在學習或者調試程序時使用,生產環境中應避免使用。
[root@localhost ~]# rpm -qa tree tree-1.6.0-10.el7.x86_64 [root@localhost ~]# rpm -e tree [root@localhost ~]# rpm -q tree package tree is not installed
軟件包效驗
rpm {-V|–verify} [select-options] [verify-options]
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
包來源合法性驗正及完整性驗正:
完整性驗正: SHA256
來源合法性驗正: RSA
公鑰加密:
對稱加密:加密、解密使用同一密鑰;
非對稱加密:密鑰是成對兒的
public key: 公鑰,公開所有人
secret key: 私鑰, 不能公開
導入所需要公鑰:
rpm -K|checksig rpmfile 檢查包的完整性和簽名
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7發行版光盤提供: RPM-GPG-KEY-CentOS-7
rpm -qa gpg-pubkey*
修改軟件包生成文件后進行效驗
[root@CentOS6 ~]# rpm -ql tree /usr/bin/tree /usr/share/doc/tree-1.5.3 /usr/share/doc/tree-1.5.3/LICENSE /usr/share/doc/tree-1.5.3/README /usr/share/man/man1/tree.1.gz [root@CentOS6 ~]# ll /usr/share/doc/tree-1.5.3/README -rw-r--r--. 1 root root 4167 Oct 20 2009 /usr/share/doc/tree-1.5.3/README [root@CentOS6 ~]# chown cyh /usr/share/doc/tree-1.5.3/README [root@CentOS6 ~]# ll /usr/share/doc/tree-1.5.3/README -rw-r--r--. 1 cyh root 4167 Oct 20 2009 /usr/share/doc/tree-1.5.3/README [root@CentOS6 ~]# rpm -V tree .....U... d /usr/share/doc/tree-1.5.3/README [root@CentOS6 ~]# echo >> /usr/share/doc/tree-1.5.3/README [root@CentOS6 ~]# ll /usr/share/doc/tree-1.5.3/README -rw-r--r--. 1 cyh root 4168 Aug 21 09:43 /usr/share/doc/tree-1.5.3/README [root@CentOS6 ~]# rpm -V tree S.5..U.T. d /usr/share/doc/tree-1.5.3/README
恢復文件再次效驗軟件包
[root@CentOS6 ~]# sed -i '$d' /usr/share/doc/tree-1.5.3/README [root@CentOS6 ~]# rpm -V tree .....U.T. d /usr/share/doc/tree-1.5.3/README
效驗Linux系統上所有安裝的軟件包
[root@CentOS6 ~]# rpm -Va S.5....T. c /etc/updatedb.conf S.5....T. c /root/.bash_profile S.5....T. c /root/.bashrc .......T. c /etc/inittab ...
RPM數據庫
數據庫重建:
/var/lib/rpm
rpm {–initdb|–rebuilddb}
initdb: 初始化
如果事先不存在數據庫,則新建之
否則,不執行任何操作
rebuilddb:重建
無論當前存在與否,直接重新創建數據庫
重建RPM數據庫
用于記錄在Linux系統中安裝、卸載、升級應用程序的相關信息,由RPM包管理系統自動完成維護,一般不需要用戶干預。當RPM數據庫發生損壞(誤刪文件、非法關機、病毒破壞等導致),且Linux系統無法自動完成修復時。將導致無法使用rpm命令正常地安裝、卸載及查詢軟件包。這時可以使用rpm命令的“–rebuiddb”或“–initdb”功能對RPM數據庫進行重建。
rebuilddb重建后,后安裝的軟件包及文件查詢不到,建議使用initdb
[root@localhost ~]# rpm –rebuilddb
或
[root@localhost ~]# rpm –initdb
導入驗證公鑰
在Linux/UNIX應用領域,相當一部分軟件廠商會對發布的軟件包進行數字簽名,以確保軟件的完整性、合法性。對于用戶來說,可以利用軟件官方提供的公鑰文件,自動對下載的軟件包進行驗證,如果在安裝軟件時出現驗證失敗的提示,則表示該軟件包可能已經被非法篡改。
向RPM數據庫中導入公鑰文件時,需要用到“–import”選項。例如,執行以下操作可以把光盤目錄中的RPM-GPG-KEY-redhat-release公鑰文件導入到RPM數據庫中。
導入所需要公鑰
[root@CentOS6 ~]# mount /dev/cdrom /media/ mount: block device /dev/sr0 is write-protected, mounting read-only [root@CentOS6 ~]# cp /media/Packages/tree-1.5.3-3.el6.x86_64.rpm . [root@CentOS6 ~]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm warning: tree-1.5.3-3.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ################################### [100%] package tree-1.5.3-3.el6.x86_64 is already installed [root@CentOS6 ~]# rpm -K tree-1.5.3-3.el6.x86_64.rpm tree-1.5.3-3.el6.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#c105b9de) [root@CentOS6 ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #導入公鑰文件 [root@CentOS6 ~]# echo >> tree-1.5.3-3.el6.x86_64.rpm [root@CentOS6 ~]# rpm -K tree-1.5.3-3.el6.x86_64.rpm tree-1.5.3-3.el6.x86_64.rpm: rsa sha1 (MD5) PGP MD5 NOT OK [root@CentOS6 ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.5 (GNU/Linux) mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW NyPBZRpM2R+Rg5eVqlborp7TmktBP/sSsxc8eJ+3P2aQWSWc5ol74Y0OznJUCrBr bIdypJllsD9Fe+h7gLBXTh3vdBEWr2lR+xA+Oou8UlO2gFbVFQqMafUgU1s0vqaE ... [root@CentOS6 ~]# rpm -qa gpg-pubkey* gpg-pubkey-c105b9de-4e0fd3a3 [root@CentOS6 ~]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3 Name : gpg-pubkey Relocations: (not relocatable) Version : c105b9de Vendor: (none) Release : 4e0fd3a3 Build Date: Sun 21 Aug 2016 09:54:42 AM CST Install Date: Sun 21 Aug 2016 09:54:42 AM CST Build Host: localhost Group : Public Keys Source RPM: (none) Size : 0 License: pubkey Signature : (none) Summary : gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>) Description : -----BEGIN PGP PUBLIC KEY BLOCK----- Version: rpm-4.8.0 (NSS-3) mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW NyPBZRpM2R+Rg5eVqlborp7TmktBP/sSsxc8eJ+3P2aQWSWc5ol74Y0OznJUCrBr bIdypJllsD9Fe+h7gLBXTh3vdBEWr2lR+xA+Oou8UlO2gFbVFQqMafUgU1s0vqaE ... [root@CentOS6 ~]# rpm -e gpg-pubkey-c105b9de-4e0fd3a3 [root@CentOS6 ~]# rpm -q gpg-pubkey* package gpg-pubkey* is not installed [root@CentOS6 ~]# rpm -K /media/Packages/tree-1.5.3-3.el6.x86_64.rpm /media/Packages/tree-1.5.3-3.el6.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#c105b9de) [root@CentOS6 ~]# cd /var/lib/rpm/ [root@CentOS6 rpm]# ll total 74856 -rw-r--r--. 1 root root 5521408 Jul 25 17:18 Basenames -rw-r--r--. 1 root root 12288 Jul 19 18:19 Conflictname -rw-r--r--. 1 root root 73728 Aug 21 10:05 __db.001 -rw-r--r--. 1 root root 229376 Aug 21 10:05 __db.002 -rw-r--r--. 1 root root 1318912 Aug 21 10:05 __db.003 -rw-r--r--. 1 root root 753664 Aug 21 10:05 __db.004 -rw-r--r--. 1 root root 1351680 Jul 25 17:18 Dirnames -rw-r--r--. 1 root root 10518528 Jul 25 17:18 Filedigests ... [root@CentOS6 rpm]# rpm -e tree [root@CentOS6 rpm]# ll total 74848 -rw-r--r--. 1 root root 5521408 Aug 21 10:07 Basenames -rw-r--r--. 1 root root 12288 Jul 19 18:19 Conflictname -rw-r--r--. 1 root root 73728 Aug 21 10:07 __db.001 -rw-r--r--. 1 root root 229376 Aug 21 10:07 __db.002 -rw-r--r--. 1 root root 1318912 Aug 21 10:07 __db.003 -rw-r--r--. 1 root root 753664 Aug 21 10:07 __db.004 -rw-r--r--. 1 root root 1351680 Aug 21 10:07 Dirnames -rw-r--r--. 1 root root 10518528 Aug 21 10:07 Filedigests ...
當執行安裝或升級rpm軟件包,rpm數據庫文件時間也會發生變化
備份rpm數據庫文件
[root@CentOS6 rpm]# \cp -a /var/lib/rpm/* /root/rpmdatedb/
原創文章,作者:cyh5217,如若轉載,請注明出處:http://www.www58058.com/38588