linux程式包管理之rpm
linux程式的源碼編譯安裝方式畢竟比較繁瑣,安裝後也不易管理,為此linux官方提供了專門的封裝管理員來解決這些問題 一、封裝管理員 封裝管理員:將來源程式編譯並打包成一個或有限的幾個檔案,可用於實現安裝、查詢、升級、卸載等功能 封裝管理員的管理實現: ①資料庫,用於記錄: 程式名及版本 程式之間的依賴關係 功能性說明 安裝產生的各檔案路徑及校正碼 ②程式的組成清單: 檔案清單 安裝卸載時啟動並執行指令碼 常用封裝管理員: Redhat:rpm(redhat package manager),其對應的程式包尾碼為.rpm,對應的前端工具為yum Debian:dpkg,其對應的程式包尾碼為.deb,對應的前端工具為apt-get rpm包的製作需要rpmbuild工具,其製作過程這裡不作說明,以下詳解一下rpm包的管理 二、rpm程式包 2.1、rpm包命名格式:name-version-release.arch.rpm,如httpd-2.2.15-45.el6.centos.x86_64.rpmversion:major.minor.release,同源碼release:rpm自身發行號,與源碼的發行號無關,僅用於標識對rpm包不同製作的修訂,同時release還包含此包適用的OSarch:適用的硬體平台x86: i386, i486, i586, i686等x86_64: x86_64powerpc: ppcnoarch: 依賴於虛擬機器 2.2、rpm分包機制 一個程式體積可能很大,為了方便管理,rpm包管理器依據功能性差異,將一個程式打包成若干個包主包(核心包):其name與來源程式一致,如httpd-2.2.15-45.el6.centos.x86_64.rpm 子包:httpd-devel-2.2.15-45.el6.centos.x86_64.rpm httpd-tools-2.2.15-45.el6.centos.x86_64.rpm 區別:程式x依賴於y和z,若x是基於rpm包安裝,則x依賴的是y和z的核心包;若x基於源碼編譯安裝,則x依賴的是y和z的開發包 2.3、擷取rpm包的途徑 ①官方發行的光碟片、官方網站、鏡像網站 mirros.163.com mirrors.sohu.com ②項目的官網:原始碼、rpm包 ③第三方機構或個人製作並公開發布許多rpm包 rpmfind.net rpm.pbone.net ④額外程式包的可靠途徑:EPEL,為Federa所維護 2.4、rpm包的合法性驗證 rpm包的合法性包括來源合法性和包的完整性兩個方面 包的製作者使用單向密碼編譯演算法提取出未經處理資料的特徵碼,並使用自己的私密金鑰加密這段特徵碼,附加在未經處理資料之後 驗證過程: 前提:必須有可靠機制擷取到包製作者的公開金鑰 ①使用包製作者的公開金鑰解密那段加密的特徵碼,能解密則說明來源合法 ②使用與製作者同樣的單向密碼編譯演算法提取資料的特徵碼,並與解密得到的特徵碼比對,相同則說明包完整性沒問題 2.5、rpm包管理器的使用 ㈠驗證程式包的合法性 我們在安裝rpm程式包之前,一般要檢驗其合法性,尤其是從非官方或非權威網站獲得的包。當然,不檢驗包的合法性並不影響包的安裝 ①匯入製作者的公開金鑰rpm --import /path/to/key_file ②若已匯入公開金鑰,rpm安裝程式包的過程中會自動檢查其合法性 ③手動檢查: rpm -K /path/to/pkg_name rpm --checksig /path/to/pkg_name 不檢查包完整性:rpm -K --nodigest /path/to/pkg_name 不檢查包的來源合法性:rpm -K --nosignature /path/to/pkg_name ④rpm -qa gpg-pubkey* #顯示所有已匯入的gpg格式的公開金鑰rpm -qi gpg-pubkey-NAME #顯示密鑰的詳細資料
[root@localhost ~]# mount /dev/cdrom /media #掛載centos官網發行的光碟片[root@localhost ~]# ls /media #centos光碟片中內建了許多rpm包,位於Packages目錄中CentOS_BuildTag EULA imagesPackagesrepodata RPM-GPG-KEY-CentOS-Debug-6 RPM-GPG-KEY-CentOS-Testing-6EFI GPL isolinux RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Security-6 TRANS.TBL[root@localhost ~]# cd /media/Packages/[root@localhost Packages]# ls...libreoffice-langpack-et-4.0.4.2-9.el6.x86_64.rpm zlib-devel-1.2.3-29.el6.x86_64.rpmlibreoffice-langpack-eu-4.0.4.2-9.el6.x86_64.rpm zsh-4.3.10-7.el6.x86_64.rpm[root@localhost Packages]# rpm -ivh --test samba-3.6.9-164.el6.x86_64.rpm #測試安裝warning: samba-3.6.9-164.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY#警告:沒有公開金鑰,無法驗證封裝的合法性Preparing...########################################### [100%][root@localhost Packages]# rpm --import ../RPM-GPG-KEY-CentOS-6 #匯入光碟片中提供的公開金鑰[root@localhost Packages]# rpm -ivh --test samba-3.6.9-164.el6.x86_64.rpm #可以看到警告資訊已消除,驗證通過Preparing...########################################### [100%][root@localhost Packages]# rpm -K samba-3.6.9-164.el6.x86_64.rpm #還可手動檢查samba-3.6.9-164.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK[root@localhost Packages]# rpm -qa gpg-pubkey* #查看已匯入的所有公開金鑰gpg-pubkey-c105b9de-4e0fd3a3[root@localhost Packages]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3 #查看指定公開金鑰的詳細資料Name : gpg-pubkey Relocations: (not relocatable)Version : c105b9de Vendor: (none)Release : 4e0fd3a3Build Date: Wed 28 Oct 2015 08:31:40 PM CSTInstall Date: Wed 28 Oct 2015 08:31:40 PM CSTBuild Host: localhostGroup : Public Keys Source RPM: (none)Size : 0 License: pubkeySignature : (none)Summary : gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>)Description :-----BEGIN PGP PUBLIC KEY BLOCK-----Version: rpm-4.8.0 (NSS-3)mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW...
㈡安裝程式包 rpm -i [option] /path/to/package_file 常用選項: -i:install -h:安裝時顯示hash碼,用來表示安裝進度 -v:顯示執行過程 -vv:詳細顯示執行過程 --test:僅作測試,並不真正安裝 --nodeps:忽略依賴關係 --replacepkgs:重新安裝。如果原有的設定檔作了修改,重裝可能不執行替換,而是將新產生的設定檔重新命名為X.rpmnew 常用組合選項:-ivh 如果依賴於其它包: ①解決依賴關係 ②使用--nodeps選項忽略依賴關係,能安裝上,但可能無法運行
[root@localhost Packages]# rpm -ivh samba-3.6.9-164.el6.x86_64.rpm Preparing...########################################### [100%] 1:samba########################################### [100%][root@localhost Packages]# rpm -ivh --test mysql-5.1.71-1.el6.x86_64.rpm error: Failed dependencies:提示需要先解決依賴關係libmysqlclient.so.16()(64bit) is needed by mysql-5.1.71-1.el6.x86_64libmysqlclient.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.71-1.el6.x86_64libmysqlclient_r.so.16()(64bit) is needed by mysql-5.1.71-1.el6.x86_64libmysqlclient_r.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.71-1.el6.x86_64mysql-libs = 5.1.71-1.el6 is needed by mysql-5.1.71-1.el6.x86_64[root@localhost Packages]# rpm -ivh mysql-libs-5.1.71-1.el6.x86_64.rpm #安裝被依賴的包Preparing...########################################### [100%] 1:mysql-libs ########################################### [100%][root@localhost Packages]# rpm -ivh mysql-5.1.71-1.el6.x86_64.rpmPreparing...########################################### [100%] 1:mysql########################################### [100%]
㈢卸載程式包 rpm -e [option] pkg_name 常用選項: -e:erase -v,-vv,--test,--nodeps 如果被其它包依賴: ①將依賴於此包的所有包都卸載 ②忽略依賴關係,能卸載,但可能造成其它包無法正常使用 如果包的設定檔被修改,卸載時此檔案將會被重新命名(X.rpmsave)並保留
[root@localhost Packages]# rpm -e mysql-libs #卸載指定的包error: Failed dependencies: #提示該包被mysql包依賴,無法卸載libmysqlclient.so.16()(64bit) is needed by (installed) mysql-5.1.71-1.el6.x86_64libmysqlclient.so.16(libmysqlclient_16)(64bit) is needed by (installed) mysql-5.1.71-1.el6.x86_64libmysqlclient_r.so.16()(64bit) is needed by (installed) mysql-5.1.71-1.el6.x86_64libmysqlclient_r.so.16(libmysqlclient_16)(64bit) is needed by (installed) mysql-5.1.71-1.el6.x86_64mysql-libs = 5.1.71-1.el6 is needed by (installed) mysql-5.1.71-1.el6.x86_64[root@localhost Packages]# rpm -e --nodeps mysql-libs #忽略依賴關係強制卸載[root@localhost Packages]# mysql #可以看到mysql已無法使用了mysql: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory[root@localhost Packages]# vim /etc/samba/smbusers[root@localhost Packages]# rpm -e samba #卸載sambawarning: /etc/samba/smbusers saved as /etc/samba/smbusers.rpmsave#可以看到,修改後的設定檔在程式卸載後會保留
㈣升級程式包:新版本取代老版本 rpm -U/-F [option] /path/to/package_file 常用選項: -U:升級或安裝。不管有無老版本,都安裝新版本 -F:純升級。有老版本才安裝新版本,沒有的話就不安裝 --force:強制升級,可能導致依賴此包的程式無法正常運行 -v,-h 常用組合選項:-Uvh,-Fvh 注意:不應該對核心執行升級操作,對於新核心應該直接安裝,系統支援多核心並存,新核心若有相容性問題還能用回老核心。
[root@localhost ~]# rpm -q zshpackage zsh is not installed #顯示zsh沒有安裝[root@localhost ~]# rpm -Fvh /media/Packages/zsh-4.3.10-7.el6.x86_64.rpm #沒有老版本,不安裝[root@localhost ~]# rpm -Uvh /media/Packages/zsh-4.3.10-7.el6.x86_64.rpm #不管有無老版本,都安裝新版本Preparing...########################################### [100%] 1:zsh ########################################### [100%][root@localhost ~]# rpm -q mysqlmysql-5.1.71-1.el6.x86_64[root@localhost ~]# rpm -Fvh mysql-5.1.73-5.el6_6.x86_64.rpm #安裝新版本的mysqlerror: Failed dependencies:提示依賴新版本的mysql-libs包mysql-libs = 5.1.73-5.el6_6 is needed by mysql-5.1.73-5.el6_6.x86_64[root@localhost ~]# rpm -Fvh mysql-libs-5.1.73-5.el6_6.x86_64.rpm error: Failed dependencies:mysql-libs = 5.1.71-1.el6 is needed by (installed) mysql-5.1.71-1.el6.x86_64# 這裡出現了一個問題:要升級mysql包,需要先升級其所依賴的mysql-libs包,而mysql-libs包無法升級,因為它被現有mysql包依賴,故這裡只能先卸載[root@localhost ~]# rpm -e --nodeps mysql-libs[root@localhost ~]# rpm -ivh mysql-libs-5.1.73-5.el6_6.x86_64.rpm Preparing...########################################### [100%] 1:mysql-libs ########################################### [100%][root@localhost ~]# rpm -Fvh mysql-5.1.73-5.el6_6.x86_64.rpm Preparing...########################################### [100%] 1:mysql########################################### [100%][root@localhost ~]# rpm -q mysqlmysql-5.1.73-5.el6_6.x86_64 #已升級至新版本
㈤查詢操作 rpm -q [option] [pkg_name] 常用查詢操作: ①查詢某包是否已安裝:rpm -q pkg_name ②查詢所有已安裝的包:rpm -qa 可結合grep命令使用,查詢符合指定範式的包:rpm -qa | grep 'PATTERN' ③查詢包的描述資訊:rpm -qi pkg_name ④查詢某包產生了哪些檔案:rpm -ql pkg_name 查詢某包產生了哪些設定檔:rpm -qc pkg_name 查詢某包產生了哪些協助檔案:rpm -qd pkg_name 查詢程式包相關的指令碼:rpm -q --scripts pkg_name 指令碼有四類:preinstall:安裝前指令碼postinstall:安裝後指令碼preuninstall:卸載前指令碼postuninstall:卸載後指令碼 ⑤查詢某個檔案由哪個包安裝產生:rpm -qf /path/to/somefile ⑥對尚未安裝的包進行查詢:rpm [option] /path/to/pkg_file,可用組合選項有-qpi,-qpl,-qpc,-qpd等
[root@localhost Packages]# rpm -q samba #查詢samba是否已安裝samba-3.6.9-164.el6.x86_64[root@localhost Packages]# rpm -qa #查詢所有已安裝的包pulseaudio-module-gconf-0.9.21-14.el6_3.x86_64db4-devel-4.7.25-18.el6_4.x86_64libxklavier-4.0-9.el6.x86_64...[root@localhost Packages]# rpm -qa | grep 'mysql'mysql-libs-5.1.71-1.el6.x86_64mysql-5.1.71-1.el6.x86_64[root@localhost Packages]# rpm -ql samba #查看samba包產生了哪些檔案/etc/logrotate.d/samba/etc/openldap/schema/etc/openldap/schema/samba.schema/etc/pam.d/samba/etc/rc.d/init.d/nmb/etc/rc.d/init.d/smb/etc/samba/smbusers/usr/bin/eventlogadm/usr/bin/mksmbpasswd.sh/usr/bin/smbstatus/usr/lib64/samba/auth...[root@localhost Packages]# rpm -qc samba #查看samba包產生了哪些設定檔/etc/logrotate.d/samba/etc/pam.d/samba/etc/samba/smbusers[root@localhost Packages]# rpm -qd samba #查看samba包產生了哪些協助檔案/usr/share/doc/samba-3.6.9/LDAP/README.../usr/share/man/man7/samba.7.gz...[root@localhost Packages]# rpm -qf /etc/openldap/schema #查詢指定檔案由哪個包安裝產生samba-3.6.9-164.el6.x86_64[root@localhost Packages]# rpm -qpi httpd-2.2.15-29.el6.centos.x86_64.rpm #安裝httpd包前查看其詳細資料Name : httpdRelocations: (not relocatable)Version : 2.2.15Vendor: CentOS
㈥校正程式包:用於檢查包安裝產生的檔案屬性是否發生變化rpm -V pkg_name [root@localhost ~]# vim /etc/httpd/conf/httpd.conf[root@localhost ~]# rpm -V httpdS.5....T. c /etc/httpd/conf/httpd.conf#我們修改了httpd設定檔,可以看到其大小、MD5校正碼及修改時間均發生了改變,其它屬性無變化 見上方命令列中的"S.5....T.",rpm用七個段位分別表示檔案七種不同屬性的變化狀態,這七種屬性分別為:S file Size differs #大小M Mode differs (includes permissions and file type) #許可權5 digest (formerly MD5 sum) differs #MD5校正碼D Device major/minor number mismatch #裝置檔案的主次裝置號L readLink(2) path mismatchU User ownership differs #屬主G Group ownership differs #屬組T mTime differs #修改時間P caPabilities differ 若對應段位的屬性有改變,則顯示為對應字母標識;無變化則顯示為【.】 ㈦rpm包管理器的資料庫重建 ①rpm包管理器的資料庫目錄:/var/lib/rpm ②rpm --initdb:初始化。如果事先沒有庫,會建立一個,有庫的話就不建立rpm --rebuilddb:重建。直接重建,覆蓋原有的資料庫
[root@localhost ~]# ls /var/lib/rpmBasenames __db.001 __db.003 Dirnames Group NamePackages Provideversion Requirename Sha1header TriggernameConflictname __db.002 __db.004 Filedigests Installtid Obsoletename Providename Pubkeys Requireversion Sigmd5[root@localhost ~]# rpm --initdb #已有庫,則不會建立[root@localhost ~]# rpm --rebuilddb[root@localhost ~]# ls /var/lib/rpmBasenames Dirnames Group NamePackages Provideversion Requirename Sha1header TriggernameConflictname Filedigests Installtid Obsoletename Providename Pubkeys Requireversion