淺談RPM

淺談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   2048 10月 24 22:17 images
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。同樣刪除時也會將修改過的配置文件進行備份并在平面上輸出備份文件名。

示例測試強制安裝KVM
[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) <centos-6-key@centos.org>)
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 重建;直接重建,覆蓋原有的數據庫

原創文章,作者:東郭先生,如若轉載,請注明出處:http://www.www58058.com/3649

(1)
東郭先生東郭先生
上一篇 2015-04-27 21:55
下一篇 2015-04-28 19:18

相關推薦

  • pam_mysql認證ftp虛擬用戶賬號,且擁有不同的權限

    關防火墻:#systemctl stop firewalld                #setenforce 0 #yum install mariadb.server #yum install mariadb-d…

    Linux干貨 2017-06-07
  • centos查看和修改文件權限

      查看權限在終端輸入: ?ls -l?xxx.xxx (xxx.xxx是文件名)那么就會出現相類似的信息,主要都是這些:-rw-r–r–其中: 最前面那個 – 代表的是文件類型中間那三個 rw- 代表的是所有者(user)然后那三個 r– 代表的是組群(group)最后那三個 r– ? …

    2017-11-26
  • mount掛載,dd 工具,配置配額系統,RAID陣列,邏輯卷管理器LVM

    mount mount掛載 vim /etc/fstab 將常用的掛載的設備寫入系統表中 文件掛載配置文件             /etc/fstab /etc/fstab每行定義一個要掛載的文件系統;   &nbsp…

    Linux干貨 2016-09-01
  • Linux的常見文件類型

      在linux中,文件的類型和權限通常以【-rwxr-xr-x】來表示,文件以第一個字符來表示不同的文件類型,具體如下。   – :普通文件;顏色為灰白色   d :目錄文件;顏色為藍色   b :塊設備文件;顏色為黃色   c :字符設備文件;顏色為黃色   p :管道文件;顏色為綠…

    Linux干貨 2016-10-20
  • 使用fail2ban防止暴力破解ssh及vsftpd密碼

    此文介紹一個linux下通過監控日志防止密碼被暴力破解的軟件-fail2ban。fail2ban支持常用的服務,如sshd, apache, qmail, proftpd, sasl, asterisk等的密碼驗證保護,當發現暴力破解的跡像時,可以通過iptables, tcp-wrapper, shorewall等方式阻止此IP的訪問。 python安裝 …

    Linux干貨 2015-03-04
  • N25_第二周作業_leon

    第二周博客作業_leon 1.       Linux上的文件管理類命令有哪些?其常用的使用方法及其相關示例演示 常用文件管理類命令有: mkdir、touch、rmdir、cp、rm、mv   mkdir—-創建目錄 -m  直接設置權限(非默認權限) -v&nbs…

    Linux干貨 2016-12-23

評論列表(1條)

  • stanley
    stanley 2015-04-27 22:15

    東郭這次的文章進步驚人的大,贊! 記得分類和添加標簽,好文章要能被搜索到為大家提供服務才會彰顯價值

欧美性久久久久