1. 程式人生 > >Linux 包管理工具之RPM詳解

Linux 包管理工具之RPM詳解

linux rpm

講到包管理工具,先來了解下應用程序接口 (API)與應用程序二進制接口 (ABI)。

  • API:

    • 編程接口 Application Program Interface
    • 換句話說也就是你編寫“應用程序”時候調用的函數之類的東西。對於內核來說,它的“應用程序”有兩種:一種是在它之上的,用戶空間的真正的應用程序,內核給它們提供的是系統調用這種接口,比如 read(2),write(2);另一種就是內核模塊了,它們和內核處於同一層,內核給它們提供的是導出的內核函數,比如 kmalloc(),printk()。這些接口都是你可以在編寫程序的時候直接看到的,可以直接拿來用的。
  • ABI:
    • 運行時候的調用接口Application Binary Interface
    • 二進制接口調用,如果二進制接口發生改變,則二進制文件也要對應改變,源代碼不需要改變,只要重新編譯,編譯器會幫你完成其中改變。除非你直接使用匯編語言,這種接口一般是不能直接拿來用的。比如,內核系統調用用哪些寄存器或者幹脆用堆棧來傳遞參數,返回值又是通過哪個寄存器傳遞回去,內核裏面定義的某個結構體的某個字段偏移是多少等等,這些都是二進制層面上的接口。這些接口是直接給編譯好的二進制用的。換句話說,如果 ABI 保持穩定的話,你在之前版本上編譯好的二進制應用程序、內核模塊,完全可以無須重新編譯直接在新版本上運行。另一種比較特殊的 ABI 是像 /proc,/sys 目錄下面導出的文件,它們雖然不是直接的二進制形式,但也會影響編譯出來的二進制,如果它裏面使用到它們的話,因此這些“接口”也是一種 ABI。

RPM是RPM Package Manager(RPM軟件包管理器)的縮寫,是RedHat的包管理工具,跟S.u.S.E的包管理工具有說不清道不明的關系,也是公認的行業標準,OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分發版本都有采用。

RPM功能:將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操作;

獲取程序包的途徑: 系統發行版的光盤或官方的文件服務器(或鏡像站點)

命名規範

  • 源代碼命名規範 name-version.tar.gz

    • version: major.minor.release
      • major :主版本
      • minor:次版本
      • release:bug之類修復
  • rpm包命名規範:name-[function]-version-release.[os].arch.rpm
    • function :例如dev、utils等輔加、開發各種功能包
    • version: major.minor.release 源代碼包
    • release.: rpm自己的發布版本
    • os:例如el7 redhat7 兼centos 7
    • arch:cpu架構 如x64 (noarch跟平臺無關)
  • demo :源碼包redis-3.0.2.tar.gz --> rpm包:redis-3.0.2-1.el7.x64.rpm

rpm使用

1、常用選項

-v:verbose,詳細信息
-vv:更詳細的輸出

2、包來源合法性驗正和完整性驗正
包的合法性太重要了,在安裝包之前必須確認好。
驗證原理:采集包的特征碼md5,用私鑰加密方式(基於rsa的pgp算法)對特征碼進行加密,客戶端只要導入正確的公鑰,就能解開私鑰的加密,得到數據特征碼(因為私鑰只存在服務端,第三方都無法解碼特征碼加密的字段。意思就是不用服務端的私鑰加密特征碼,客戶端就無法解密),然後在根據文件得到特征碼跟包裏面的特征碼做比較。

#導入公鑰
[root@localhost dvd]# rpm --import RPM-GPG-KEY-CentOS-7
[root@localhost Packages]# rpm -K zsh-5.0.2-28.el7.x86_64.rpm
zsh-5.0.2-28.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 確定

3、安裝

rpm {-i|--install} [install-options] PACKAGE_FILE ...
常用install-options:
-h:hash marks輸出進度條;打印50個#,每個#表示2%的進度;
--test:測試安裝,檢查並報告依賴關系及沖突消息等;
--nodeps:忽略依賴關系;不建議;
--replacepkgs:重新安裝;
--noscripts:不執行任何腳本;
--nopre:preinstall:安裝過程開始之前運行的腳本,%pre;
--nopost:postinstall:安裝過程完成之後運行的腳本,%post;
--nopreun:preuninstall:卸載過程真正開始執行之前運行的腳本,%preun;
--nopostun:postuninstall:卸載過程完成之後運行的腳本,%postun;
--nosignature:不檢查包簽名信息,不檢查來源合法性;
--nodigest:不檢查包完整性信息;

demo:

 [root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm
 準備中...                          ################################# [100%]
正在升級/安裝...
   1:zsh-5.0.2-28.el7                 ################################# [100%]

4、升級

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U:升級或安裝;
-F:升級
--oldpackage:降級; 允許升級舊的包代替新的包
--force:強制升級;

5、卸載

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:卸載所有匹配指定名稱的程序包的各版本;
--nodeps:忽略依賴關系
--test:測試卸載,dry run模式

[root@localhost Packages]# rpm -e zsh

6、查詢

rpm {-q|--query} [select-options] [query-options]
[select-options]
PACKAGE_NAME:查詢指定的程序包是否已經安裝,及其版本;
-a, --all:查詢所有已經安裝過的包;
-f FILE:查詢指定的文件由哪個程序包安裝生成;
-p, --package PACKAGE_FILE:用於實現對未安裝的程序包執行查詢操作;
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供;
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;
[query-options]
--changelog:查詢rpm包的changlog;
-l, --list:程序安裝生成的所有文件列表;
-i, --info:程序包相關的信息,版本號、大小、所屬的包組,等;
-c, --configfiles:查詢指定的程序包提供的配置文件;
-d, --docfiles:查詢指定的程序包提供的文檔;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查詢指定的程序包的依賴關系;
--scripts:查看程序包自帶的腳本片斷;

查看安裝包數量

[root@localhost Packages]# rpm -qa|wc -l
360

查看指定文件由哪個包安裝的,很好用。

[root@localhost Packages]# rpm -qf /etc/passwd
setup-2.8.71-7.el7.noarch

查看程序包安裝的所有文件

[root@localhost Packages]# rpm -ql  zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
....

查看程序包元數據

[root@localhost Packages]# rpm -qi  zsh
Name        : zsh
Version     : 5.0.2
Release     : 28.el7
Architecture: x86_64
Install Date: 2018年04月25日 星期三 11時02分54秒
Group       : System Environment/Shells
Size        : 5855982
.....

查看程序包的配置文件

[root@localhost Packages]# rpm -qc  zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc

文檔查看

[root@localhost Packages]# rpm -qd  zsh
/usr/share/doc/zsh-5.0.2/BUGS
/usr/share/doc/zsh-5.0.2/CONTRIBUTORS
/usr/share/doc/zsh-5.0.2/FAQ
.....

查看程序包自帶的腳本片斷

4段信息 可以在install時候查看
[root@localhost Packages]# rpm -q --scripts  zsh
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
    echo "/bin/zsh" > /etc/shells
else
    grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi
.....

查看程序包依賴關系

[root@localhost Packages]# rpm -qR  zsh
/bin/sh
....

列出指定的程序包提供的所有的CAPABILITY

[root@localhost Packages]# rpm -q --provides  zsh
config(zsh) = 5.0.2-28.el7
zsh = 5.0.2-28.el7
zsh(x86-64) = 5.0.2-28.el7

查看CAPABILITY的提供者

[root@localhost Packages]# rpm -q  --whatprovides  ‘config(zsh)‘
zsh-5.0.2-28.el7.x86_64

查看CAPABILITY的提供者的依賴

[root@localhost Packages]# rpm -q --whatrequires  bash
rsyslog-8.24.0-12.el7.x86_64
lvm2-2.02.171-8.el7.x86_64
dracut-033-502.el7.x86_64
initscripts-9.49.39-1.el7.x86_64
[root@localhost Packages]# rpm -q --whatrequires  zsh
沒有軟件包需要 zsh

未安裝包所有需要安裝的文件查看

[root@localhost Packages]# rpm -qpl zsh-html-5.0.2-28.el7.x86_64.rpm
/usr/share/doc/zsh-html-5.0.2/zsh_31.html
/usr/share/doc/zsh-html-5.0.2/zsh_33.html
/usr/share/doc/zsh-html-5.0.2/zsh_34.html
/usr/share/doc/zsh-html-5.0.2/zsh_36.html
...

未安裝包元數據查看

[root@localhost Packages]# rpm -qpi  zsh-html-5.0.2-28.el7.x86_64.rpm
Name        : zsh-html
Version     : 5.0.2
Release     : 28.el7
Architecture: x86_64
....

7、校驗安裝後有沒有被修改

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

#在隨意zsh的安裝文件中添加一個空行
[root@localhost Packages]# vim /etc/skel/.zshrc 
[root@localhost Packages]# rpm -V zsh
S.5....T.  c /etc/skel/.zshrc  #文件大小不一樣  說明被改動

#刪除重裝
[root@localhost Packages]# rpm -e zsh
[root@localhost Packages]# rpm -i  --replacepkgs zsh-5.0.2-28.el7.x86_64.rpm
[root@localhost Packages]# rpm -V zsh   #沒有消息就ok

8、數據庫重建 ,一般數據庫被損壞時候使用

rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化數據庫,當前無任何數據庫可實始化創建一個新的;當前有時不執行任何操作;
--rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建;
rpm默認管理器數據庫路徑:/var/lib/rpm/

[root@localhost Packages]# rpmdb --initdb --dbpath=/tmp/rpm
[root@localhost Packages]# cd /tmp/rpm
[root@localhost rpm]# ls
Basenames     __db.002  Group       Obsoletename  Requirename  Triggername
Conflictname  __db.003  Installtid  Packages      Sha1header
__db.001      Dirnames  Name        Providename   Sigmd5

Linux 包管理工具之RPM詳解