淺談RPM
[先絮叨下編譯啊]
1、 庫:其實就是一個程序模塊(它沒有執行入口,不能獨立執行,只能被能獨立運行的程序調用時執行)你可以把它想象成工具螺絲刀,可執行的程序是就是你自己;螺絲刀能自己幹活嗎?沒有螺絲刀能擰螺絲嗎?或者說你現在製作一個?螺絲刀可以實現這個功能但需要你來執行這個動作。
2、靜態編譯:將程序所需要的所有的庫都編譯進二進制程序,不依賴於共享庫運行;就好像隨身攜帶螺絲刀一樣。
3、動態編譯:程序所依賴的共享庫並不會被編譯進整個二進制程序,運行環境依賴於共享庫;需要找到螺絲刀才能擰螺絲。
4、動態庫文件:linux以[.so]結尾 dll是windows的。
5、因爲大部分的程序都是動態編譯的方式來編譯的,可想而知我們的程序會產生依存關係鏈;也就是說你想裝一個A程序,A可能需要B的支持而B又需要X和Y的支持才能運行。當然BXY可能使庫也可能是程序。
6、不通的編譯平臺(硬件、系統)編譯的程序是不通用的。就好像螺絲刀有梅花有一子有內六角一樣,要對套才能使用。
7、新平臺兼容老平臺;所以呢在在新平臺上編譯的軟件到老平臺上一般會出現兼容性問題。我們安裝的操作系統能夠在過個平臺上使用呢高低都兼容呢,難道在很老的平臺上編譯的嗎?
[程序包管理器的兩大主流]
dpkg:由 Debian Linux 社羣所開發出來的, Debian 系的其他 Linux distributions 大多使用它來管理軟件,例如B2D, Ubuntu 等,其前端工具有apt-get。
RPM:由 Red Hat 最早開發,後期使用C語言重新編寫,效率和處理方式都非常好用。因此很多distributions 就使用其來作爲軟件安裝的管理方式。例如 Fedora, CentOS, SuSE 等等,其前端工具有yum。
[Linux程序文件的組成及存放]
程序安裝完成後由二進制文件、庫文件、配置文件、幫助文件組成。
二進制程序 /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /usr/local/APP/{bin,sbin} 注意: 有些特殊的應用程序放置於libexec目錄中 有些第三方應用默認安裝於/opt目錄 庫文件(開發庫、運行庫) /lib64, /usr/lib64, /usr/local/lib64, /usr/local/APP/lib 配置文件 /etc, /usr/local/APP/etc或conf目錄 幫助文件 /usr/share/man, /usr/local/share/man, /usr/local/APP/man 幫助文件:man, info, doc: README, INSTALL, ChangeLog
[應用程序的命名格式]
源代碼包的命名格式,一般都爲壓縮文件name-version.tar.{gz,bz2,xz}。 name-major.minor.release.tar.gz 名字-主版本號.次版本號.修訂號.tar.gz 示例:bash-4.2.3.tar.gz keepalived-1.2.13.tar.gz rpm包的命名格式 name-version-relase.arch.rpm 名字-版本-rpm包發行號.適用平臺.rpm version: major.minor.release,版本命名格式同源代碼,就是從源碼包上拷貝過來的 release: rpm自身的發行號,與程序源碼的發行號無關,僅用於標識對rpm包不同製作的修訂;同時,release還包含此包適用的OS arch: 適用於的硬件平臺:x86: i386, i486, i586, i686,ppc(Power PC)、noarch(沒有平臺就是虛擬機)
示例:
xorg-x11-fonts-ISO8859-15-75dpi-7.2-9.1.el6.noarch.rpm
qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm
名字好長啊,這就是下面我們要將的分包的名字
[分包]
我想我們都裝過精簡版的office吧,或者安裝自身的需要對office進行選擇性的安裝,這其實就是程序的分包。這在Linux上是一樣存在的,這個應該就是個操作系統的實現方式上的區別了畢竟他們都要實現同樣功能的螺絲刀就是樣子和手感不一樣而已。同樣的在Linux上一個程序的功能可能很強大強大到我們使用不過來那麼爲了節省安裝空間同樣也可以選擇安裝。這在Linux上被叫做程序包分包
一般把程序分包成主包與子包。例如一個bash程序有N多個功能(其實這個同樣也遵循28原則):可能最常用功能有10個,A功能:4個,二次開發相關功能:3個,那麼包在分包的時候就會把這最常用的功能房子核心包內,其它各相關的功能被分別打包成子安裝包。
核心包,主包:命名與源程序一致 bash-4.2.3-3.centos7.x86_64.rpm 子包: bash-a-4.2.3-3.centos7.x86_64.rpm name-分包名-major.minor.release.tar.gz bash-devel-4.2.3-3.centos7.x86_64.rpm (devel 開發)
以下下測試所使用的RPM包均來自系統安裝光盤
[root@zhuzw-centos6 CentOS_6.6_Final]# ll 總用量 712 -r--r--r--. 2 root root 14 10月 24 21:59 CentOS_BuildTag dr-xr-xr-x. 3 root root 2048 10月 24 22:12 EFI -r--r--r--. 2 root root 212 11月 28 2013 EULA -r--r--r--. 2 root root 18009 11月 28 2013 GPL dr-xr-xr-x. 3 root root 204 8 10 月 24 22:17 p_w_picpaths dr-xr-xr-x. 2 root root 2048 10月 24 22:12 isolinux dr-xr-xr-x. 2 root root 686080 10月 24 22:16 Packages #就在這個文件夾裏 -r--r--r--. 2 root root 1354 10月 20 00:00 RELEASE-NOTES-en-US.html dr-xr-xr-x. 2 root root 4096 10月 24 22:17 repodata #yum倉庫的元數據 -r--r--r--. 2 root root 1706 11月 28 2013 RPM-GPG-KEY-CentOS-6 #相應的包程序的認證KEY -r--r--r--. 2 root root 1730 11月 28 2013 RPM-GPG-KEY-CentOS-Debug-6 #相應的包程序的認證KEY -r--r--r--. 2 root root 1730 11月 28 2013 RPM-GPG-KEY-CentOS-Security-6 #相應的包程序的認證KEY -r--r--r--. 2 root root 1734 11月 28 2013 RPM-GPG-KEY-CentOS-Testing-6 #相應的包程序的認證KEY -r--r--r--. 1 root root 3380 10月 24 22:17 TRANS.TBL
[使用RPM-安裝程序包]
命令格式: rpm [option]/path/to/package_file... rpm [選項] [包路徑] (絕對路徑、相對路徑、網絡路徑)
常用選項說明:
-i:install安裝程序;
-v:顯示安裝執行過程;
-vv:顯示更詳細安裝執行過程;
-vvv:詳細了在詳細的過程;
-h:安裝進度條,#一個#表示2%
常用組合選項:-ivh
--test: 僅作測試,沒有真正執行安裝
--nodeps:忽略依賴關係,強制安裝,能安裝上,但有可能無法運行
--replacepkgs:重新安裝,會檢測已安裝的程序的文件,如原配置文件修改過,則有可能不執行替換,並將新的配置文件重命名爲 .rpmnew。同樣刪除時也會將修改過的配置文件進行備份並在平面上輸出備份文件名。
示例測試強制安裝(測試) [root@zhuzw-centos6 Packages]# rpm -ihv --test qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm --nodeps warning: qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 如果不強制忽略這個依賴關係就會出現 [root@zhuzw-centos6 Packages]# rpm -iv --test qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm warning: qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: /usr/share/gpxe/e1000-0x100e.rom is needed by qemu-kvm-2:0.12.1.2-2.445.el6.x86_64 /usr/share/gpxe/pcnet32.rom is needed by qemu-kvm-2:0.12.1.2-2.445.el6.x86_64 /usr/share/gpxe/rtl8029.rom is needed by qemu-kvm-2:0.12.1.2-2.445.el6.x86_64 /usr/share/gpxe/rtl8139.rom is needed by qemu-kvm-2:0.12.1.2-2.445.el6.x86_64 還有就不做詳細的拷貝了,這就是我們一開始說的依存關係鏈(我這麼叫而已,僅供參考)
[使用RPM-卸載程序包]
命令格式:rpm [option] package_name
常用選項說明:-e: 卸載程序 同樣刪除時也會將修改過的配置文件進行備份並在平面上輸出備份文件名。
--nodeps:忽略依賴關係,強行卸載,其他依賴於此包的程序可能無法正常運行,慎用啊
[root@zhuzw-centos6 Packages]# rpm -e --nodeps qemu-kvm [root@zhuzw-centos6 Packages]# echo $? 0
[使用RPM-升級程序包]
命令格式:rrpm [-Uvh | -Fvh] /path/to/package_file
常用組合選項:-Uvh: 升級或安裝,後面的程序安裝此電腦已安裝則進行升級,如沒有安裝則現在安裝;
-Fvh: 升級,只對電腦上已安裝的程序進行升級,如沒有安裝則不進行安裝;
--force:強制升級
內核不要進行升級,有可能會發生不可預料的錯誤出現,可以安裝新內核,系統運行多內核並存。
[使用RPM-進行查詢操作]
命令格式:rpm [option] package_name|file
-q: 查詢某包是否安裝,可以一次查詢多個,彼此間用空格隔離; rpm -q kvm zsh
[root@zhuzw-centos6 Packages]# rpm -q kvm zsh package kvm is not installed zsh-4.3.10-7.el6.x86_64
-qa: 查詢所有已經安裝的包,組合管道使用效果更佳。
[root@zhuzw-centos6 Packages]# rpm -qa | grep bash bash-4.1.2-15.el6_4.x86_64
-qi: 查詢包的描述信息(只能查詢已經安裝的包的描述信息);
[root@zhuzw-centos6 Packages]# rpm -qi bash Name : bash Relocations: (not relocatable) # 是否保留緩存的安裝包 Version : 4.1.2 Vendor: CentOS Release : 15.el6_4 Build Date: 2013年07月18日 星期四 21時21分24秒 #包創建日期 Install Date: 2015年03月09日 星期一 07時43分42秒 Build Host: c6b10.bsys.dev.centos.org #安裝日期 #編譯主機 Group : System Environment/Shells Source RPM: bash-4.1.2-15.el6_4.src.rpm Size : 3139291 License: GPLv3+ Signature : RSA/SHA1, 2013年07月18日 星期四 21時46分10秒, Key ID 0946fca2c105b9de Packager : CentOS BuildSystem <http://bugs.centos.org> 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.
-ql: 查詢某包安裝生成了哪些文件(所有);
-qc: 查詢某包安裝生成了哪些配置文件;不記得了那個程序的配置文件的時候非常常用。
-qd: 查詢某包安裝生成了哪些幫助文件;
--q--scripts package_name: 查詢程序包的相關腳本;
腳本有四類: preinstall:安裝前腳本,包安裝之前的腳本
postinstall: 安裝後腳本
preuninstall:卸載前腳本
postuninstall:卸載後腳本
[root@zhuzw-centos6 Packages]# rpm -q --scripts preinstall bash package preinstall is not installed 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 # 後面的內容不做詳細敘述了
查詢沒有安裝的包的相關信息,只需要在選項里加入-p即可,如下:
-qpi 包的描述信息
-qpl 包安裝會生成的文件
-qpc 包安裝會生成的配置文件
-qpd 包安裝會生成的幫助文件
查詢某文件是由哪個包安裝生成的:rpm -qf /path/to/some_file
[root@zhuzw-centos6 Packages]# rpm -qf /bin/bash bash-4.1.2-15.el6_4.x86_64
[使用RPM-進行校驗]
用於檢查包安裝生成的文件屬性是否發生變化
命令格式:rpm [option] package_name|file
常用選項說明:
-V :後面加的是程序名稱,若該程序屬有的文件發生改變就會顯示;
-Va :顯示目前系統上面所有可能被修改過的文件;
-Vp :後面加的是文件名,顯示該程序內可能被更改過的文件;
-Vf :後面加的是文件名,顯示某個文件是否被修改過。
[root@zhuzw-centos6 Packages]# vi /etc/skel/.bashrc # 添加了一條#ceshi [root@zhuzw-centos6 Packages]# rpm -V bash S.5....T. c /etc/skel/.bashrc
對應屬性位說明:
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 包的能力發生改變 在文件屬性發生某項屬性變化時,對應屬性位的標識才會顯示,若屬性無變化,則顯示爲[.]
RPM包的校驗與數字簽名說明:
RPM包的校驗主要有來源合法性驗證與包的完整性驗證。
數字簽名:包的製作者使用單向加密提取原始數據的特徵碼,而後使用自己的私鑰加密這段特性碼,附加原始數據後面。
驗正過程:
前提:必須有可靠機制獲取到包製作者的公鑰;
1、使用製作者的公鑰解密加密的特徵碼,能解密則意味着來源合法。
2、對文件進行相應的完整性校驗工具MD5|SHA-1 等得到特徵碼對比製作者提供的加密特徵碼,一致則認爲包完整。
rpm包來源合法性及完整性檢驗:
在當前系統上導入包的製作者的公鑰:
rpm--import /path/to/key_file 【公鑰路徑】
顯示所有已經導入的gpg格式的公鑰:
rpm -qa gpg-pubkey* 【通配符方式檢查】
顯示密鑰的詳細信息
rpm -qi gpg-pubkey-NAME
[root@zhuzw-centos6 Packages]# rpm --import /media/CentOS_6.6_Final/RPM-GPG-KEY-CentOS-6 [root@zhuzw-centos6 Packages]# rpm -qa gpg-pu* gpg-pubkey-c105b9de-4e0fd3a3 [root@zhuzw-centos6 Packages]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3 Name : gpg-pubkey Relocations: (not relocatable) Version : c105b9de Vendor: (none) Release : 4e0fd3a3 Build Date: 2015 年04月17日 星期五 19時49分12秒 Install Date: 2015年04月17日 星期五 19時49分12秒 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) <[email protected]>) Description : -----BEGIN PGP PUBLIC KEY BLOCK----- Version: rpm-4.8.0 (NSS-3) mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW NyPBZRpM2R+Rg5eVqlborp7TmktBP/sSsxc8eJ #餘下的內部不做詳細拷貝了
安裝過程中會只要有相對應的公鑰就會自動用已經導入的的公鑰,對程序包進行檢驗,一般無需進行手動校驗。
手動檢查:前提是導入KEY文件
rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE
選項說明:
-K :等同於 --checksig ,進行檢查並顯示結果;
--nodigest:不檢查包完整性;
--nosignature:不檢查來源合法性。
[ RPM的數據庫重建]
萬一哪天發現rpm不能管理我們的程序包了,可以通過RPM數據庫重建來嘗試解決。
數據庫目錄: /var/lib/rpm
重建數據庫:
rpm--initdb:初始化
如果事先沒有庫,會新建一個;如果有,則不新建。
rpm--rebuilddb : 重建
直接重建,覆蓋原有的數據庫。
RPM速查表 RPM-安裝程序包 #命令格式: rpm [option] /path/to/package_file... rpm [選項] [包路徑] -i install安裝程序; -v 顯示安裝執行過程; -vv 顯示更詳細安裝執行過程; -vvv 詳細了在詳細的過程; -h 安裝進度條,#一個#表示2% -ivh 常用組合選項 --test 僅作測試,沒有真正執行安裝 --nodeps 忽略依賴關係,強制安裝,能安裝上,但有可能無法運行 --replacepkgs 重新安裝,會檢測已安裝的程序的文件,如原配置文件修改過,則有可能不執行替換,並將新的配置文件重命名爲 .rpmnew。同樣刪除時也會將修改過的配置文件進行備份並在平面上輸出備份文件名 使用RPM-卸載程序包 #命令格式:rpm [option] package_name -e: 卸載程序 --nodeps 忽略依賴關係,強制安裝,能安裝上,但有可能無法運行 使用RPM-升級程序包 #命令格式:rrpm [-Uvh | -Fvh] /path/to/package_file -Uvh 升級或安裝,後面的程序安裝此電腦已安裝則進行升級,如沒有安裝則現在安裝; -Fvh 升級,只對電腦上已安裝的程序進行升級,如沒有安裝則不進行安裝; --force 強制升級; 內核不要進行升級,有可能會發生不可預料的錯誤出現,可以安裝新內核,系統運行多內核並存。 使用RPM-查詢操作 #命令格式:rpm [option] package_name|file -q 查詢某包是否安裝,可以一次查詢多個,彼此間用空格隔離; rpm -q kvm zsh -p 查詢某包是否安裝,可以一次查詢多個 -qa 查詢所有已經安裝的包,組合管道使用效果更佳 -qi 查詢包的描述信息(只能查詢已經安裝的包的描述信息); -ql 查詢某包安裝生成了哪些文件(所有); -qc 查詢某包安裝生成了哪些配置文件;不記得了那個程序的配置文件的時候非常常用。 -qd 查詢某包安裝生成了哪些幫助文件; -q --scripts package_name" 查詢程序包的相關腳本 preinstall:安裝前腳本,包安裝之前的腳本 postinstall: 安裝後腳本 preuninstall:卸載前腳本 postuninstall:卸載後腳本" -qpi 未安裝包的描述信息 -qpl 未安裝包安裝會生成的文件 -qpc 未安裝包安裝會生成的配置文件 -qpd 未安裝包安裝會生成的幫助文件 rpm -qf /path/to/some_file 查詢某文件是由哪個包安裝生成的 使用RPM-校驗 用於檢查包安裝生成的文件屬性是否發生變化 #命令格式:rpm [option] package_name|file -V 後面加的是程序名稱,若該程序屬有的文件發生改變就會顯示; -Va 顯示目前系統上面所有可能被修改過的文件; -Vp 後面加的是文件名,顯示該程序內可能被更改過的文件; -Vf 後面加的是文件名,顯示某個文件是否被修改過。 rpm --import /path/to/key_file 在當前系統上導入包的製作者的公鑰: rpm -qa gpg-pubkey* 顯示所有已經導入的gpg格式的公鑰: rpm -qi gpg-pubkey-NAME 顯示密鑰的詳細信息 手動檢查:rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE -K 等同於 --checksig ,進行檢查並顯示結果; --nodigest 不檢查包完整性; --nosignature 不檢查來源合法性。 RPM- 數據庫重建: rpm --initdb 初始化;如果事先沒有庫,會新建一個;如果有,則不新建; rpm --rebuilddb 重建;直接重建,覆蓋原有的數據庫