一、程序包管理基礎
1、API接口:
在不同的開發環境中,編寫程序時會調用內核kernel或者庫文件,不同系統的庫文件不同(Linux、Windows等),爲了增強開發程序的兼容性,不同庫使用統一標準的API接口,使得不同開發環境開發的程序能夠兼容
2、源碼到程序執行的流程:
源碼(文本) ---> 預處理 ---> 編譯(編譯器) ---> 彙編(彙編代碼)---> 機器指令
3、編譯方式:
靜態編輯:
把編譯器封裝到程序中,程序執行時不需要依賴外部編譯器
兼容性強,但程序體積大
共享編譯:
程序內無編譯器,而是通過連接到運行環境中的lib共享庫裏的編譯器進行編譯
兼容性弱,但程序體積小
4、二進制應用程序的組成部分
二進制文件
庫文件
配置文件
幫助文件
5、程序包管理
將編譯好的應用程序的各個組件,如二進制文件、庫文件、配置文件、幫助文件等程序文件統一打包成爲程序包,實現程序的簡化安裝、安裝追蹤、查詢、升級、拆卸等管理功能
6、程序包管理器的作用
將編譯好的應用程序的各個組件,如二進制文件、庫文件、配置文件、幫助文件等程序文件統一打包成爲程序包,實現程序的簡化安裝、安裝追蹤、查詢、升級、拆卸等管理功能
程序包的構成:
(1、程序的組成清單
文件清單
安裝或者拆卸時運行的腳本
(2、數據庫(公共)
程序包名稱及版本
依賴關係
功能說明
安裝生成的各文件的文件路徑及校驗碼信息
(3、程序數據
程序包管理器:
管理器:rpm
管理器前端工具:yum
7、常見的程序包管理器
debin公司:
管理器:deb
程序包格式:.dpt
redhat公司:
管理器:rpm------redhat packet manager
程序包格式:.rpm
8、源代碼文件及rpm包命名格式
源代碼文件命名格式:
name-version.tar.gz
name-version.tar.bz2
name-version.tar.xz
version:major.minor.release(主版本.次版本.發行版)
rpm包命名格式:
name-version-release.os.arch.rpm
- version # 版本號(主版本.次版本.發行版)
- release # 包發行號
- os # 操作系統
- arch # 運行平臺(x86:i386、i486 、i586 、i686、x86_64、amd64)
- rpm # 文件後綴名
示例:
[root@localhost ~]# rpm -qa | grep python-2.7
python-2.7.5-68.el7.x86_64
python # 包名
2.7.5 # 發行版本號(major:2、minor:7、release:5)
68 # 包的release號
el7 # 操作系統:企業級redhat
x86_64 # 運行平臺
9、主包、子包、包依賴關係
主包:用於實現程序主要功能的包
app01-version-release.os.arch.rpm
子包:用於實現程序額外附加功能的包
app01-devel-version-release.os.arch.rpm
包依賴關係:程序運行可能需要依賴於另外一個程序,被依賴的程序包叫依賴包
10、程序包的獲取方式:
(1、系統發行版的光盤或者官方的服務器鏡像;
(2、第三方服務器鏡像
教育服務器鏡像(清華、北大)
阿里雲鏡像:http://mirrors.aliyun.com
搜狐鏡像:http://mirrors.sohu.com
163鏡像:http://mirrors.163.com
(3、項目官方站點
(4、第三方組織社區站點
Fedora-EPEL
GitHub
(5、搜索引擎
二、ldd命令及ldcongif命令
ldd /path/to/file #查看二進制程序文件所依賴的庫文件
示例:
[root@localhost ~]# ldd /bin/cat
linux-vdso.so.1 => (0x00007fff12890000)
libc.so.6 => /lib64/libc.so.6 (0x00007f20eb858000)
/lib64/ld-linux-x86-64.so.2 (0x00007f20ebc25000)
ldconfig -p 或 /sbin/ldconfig -p #顯示已經裝載到緩存的所有可用庫文件及文件路徑映射關係
示例:
[root@localhost ~]# ldconfig -p | grep libGL
libGL.so.1 (libc6,x86-64) => /lib64/libGL.so.1
ldconfig 或 /sbin/ldconfig # 根據庫文件的緩存配置文件重讀緩存
庫文件的緩存配置文件:
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf
庫文件的緩存文件:
/etc/ld.so.cache
示例:
[root@localhost ~]# cat /etc/ld.so.conf.d/dyninst-x86_64.conf
/usr/lib64/dyninst
[root@localhost ~]#
[root@localhost ~]# ldconfig
三、rpm包管理器的使用
1、程序包來源合法性及完整性校驗
校驗文件:
程序包的製作者會使用MD5或者SHA算法對做好的程序包進行計算,得到程序包的特徵碼,並用私鑰加密,安裝前用戶使用公鑰解密並計算比較特徵碼,若不同則說明包被篡改過,不完整,或被植入病毒(所以進行校驗前首先需要信任程序包的製作者)
公鑰的導入:
rpm --import /path/to/poblickeyfile公鑰
程序包的校驗:
使用rpm安裝程序包,此時會使用剛剛導入的密鑰進行校驗
2、程序包的安裝及拆卸
格式:rpm 選項 /path/to/file.rpm
常用選項:
-i 或 --install # 安裝指定程序包(若有依賴包,需要先逐一安裝依賴包)
-v # 顯示安裝過程
-h # 顯示安裝進度
-e # 拆卸程序包
--face # 強制安裝
--test # 測試程序包是否能被安裝,不真正執行安裝
--nodeps # 忽略依賴關係強行安裝(容易造成安裝後程序無法正常運行)
--replacepkgs # 程序安裝
--nosignature # 不檢查來源合法性
--nodigest # 不檢查包的完整性
--noscipts # 安裝時不執行程序包腳本
--nopre #不執行安裝前腳本%pre
--nopost #不執行安裝後腳本%post)
--nopreun # 不執行卸載前腳本%preun)
--nopostun # 執行卸載後腳本%postun)
常用選項搭配:
rpm -i --test /path/to/file.rpm # 測試程序包是否能安裝
rpm -ivh /path/to/file.rpm # 安裝程序包,並顯示進度
rpm -ivh --replacepkgs /path/to/file.rpm # 重新安裝程序包,並顯示進度
rpm -evh /path/to/file.rpm # 拆卸程序包,並顯示進度
示例:
[root@localhost ~]# ll
total 48
-rw-r--r--. 1 root root 47508 Jul 4 2014 tree-1.6.0-10.el7.x86_64.rpm
[root@localhost ~]# rpm -i --test tree-1.6.0-10.el7.x86_64.rpm
[root@localhost ~]# rpm -ivh tree-1.6.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:tree-1.6.0-10.el7 ################################# [100%]
[root@localhost ~]# rpm -ivh --replacepkgs tree-1.6.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:tree-1.6.0-10.el7 ################################# [100%]
[root@localhost ~]# rpm -evh tree
Preparing... ################################# [100%]
Cleaning up / removing...
1:tree-1.6.0-10.el7 ################################# [100%]
3、程序包的升級及降級
格式:rpm 選項 /path/to/file.rpm
常用選項:
-U # 升級程序包(若不存在舊的程序包,則重新安裝程序包)
-F # 升級程序包(若不存在舊的程序包,則不執行)
--oldpacage # 降級程序包(用舊版的程序包替換新的程序包)
4、程序包安裝情況校驗
格式:rpm 選項 /path/to/file.rpm
常用選項:
-V # 執行校驗操作
--nodeps #不檢查依賴關係
--nodigest #不檢查完整性
--nofiles #不檢查生成文件
--noscripts #不檢查腳本模塊
--nosignature #不檢查來源合法性
--nolinkto #不檢查連接
--nofiledigest #不檢查MD
--nosize #不檢查大小
--nouser #不檢查屬主
--nogroup #不檢查屬組
校驗結果:
SM5DLUGTP
S:大小改變
M:權限改變(屬主、屬組)
5:MD5碼不同
D:設備文件主次設備號不同
L:路徑不同
U:屬主不同
G:屬組不同
T:最後一次修改時間不同
P:功能不匹配
示例:
[root@localhost ~]# rpm -ivh tree-1.6.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:tree-1.6.0-10.el7 ################################# [100%]
[root@localhost ~]# rpm -V tree
5、程序包的安裝情況查詢
格式:rpm 選項 /path/to/file.rpm
常用選項:
-q # 進行程序包安裝情況查詢操作
-a # 查詢所有已安裝程序包
-f # 查詢指定文件由那個程序包生成
-g # 查詢指定包組的程序包
-P # 查詢未安裝的程序包信息(結合查詢選項可查看未安裝程序包的詳細信息)
--whatprovides # 查詢指定功能或文件是由那個程序包提供的
--whatrequires # 查詢指定功能或文件有那些依賴程序包
--changelog # 查詢rpm包的修改日誌
-c # 查詢指定程序包有哪些配置文件
--conflicts # 查詢指定程序包可能會和那些程序發生衝突
-d # 查詢程序包安裝生成的文檔
-i # 查詢查詢包的概要信息
-L # 查詢包的許可證文件
-l # 查詢包安裝生成的所有文件
--scripts # 查詢程序包的腳本
--triggers # 查詢包的觸發器腳本
-R # 查詢包所依賴的庫文件
--provides # 查看程序包所提供的功能
示例:
[root@localhost ~]# rpm -q tree
tree-1.6.0-10.el7.x86_64
[root@localhost ~]# rpm -qa | grep tree
tree-1.6.0-10.el7.x86_64
[root@localhost ~]# rpm -qd tree
/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 -qi tree
Name : tree
Version : 1.6.0
Release : 10.el7
Architecture: x86_64
Install Date: Tue 03 Mar 2020 02:13:52 PM CST
Group : Applications/File
Size : 89505
License : GPLv2+
Signature : RSA/SHA256, Fri 04 Jul 2014 01:36:46 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : tree-1.6.0-10.el7.src.rpm
Build Date : Tue 10 Jun 2014 03:28:53 AM CST
Build Host : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://mama.indstate.edu/users/ice/tree/
Summary : File system tree viewer
Description :
The tree utility recursively displays the contents of directories in a
tree-like format. Tree is basically a UNIX port of the DOS tree
utility.
[root@localhost ~]# rpm -q -l 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
6、rpm包管理器的數據庫
rpm管理程序包時候,會將相關數據存儲到數據庫文件:/var/lib/rpm
[root@localhost ~]# cd /var/lib/rpm
[root@localhost rpm]# ls
Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5
Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername
如果以上文件損壞,有的查詢操作將無法進行,需要讀取原程序信息重建數據庫
rpm --initdb # 初始化數據庫(存在數據庫則不進行操作、不存在則進行重建初始化)
rpm --rebuilddb # 重建數據庫(無論數據庫存在與否,都進行重建)