Linux 程序包管理
linux系統中的諸多程序都是由源代碼編譯或者由二次發行商選擇性編譯分布,其大部分的程序安裝得了需要依賴于三方的庫文件,甚至很多的程序依賴關系會進入到死循環的情況中。由于直接使用源代碼編譯安裝比較繁,故出現了一系列的安裝包管理程序。
各系統包及包管理程序:
Debian
1、軟件包后綴
.deb
2、前端管理工具
- apt-get
RHEL系
1、軟件包后綴
.rpm
2、前端管理工具
- rpm
- yum(centos5、6)
- dnf(centos 7)
SUSE
1、軟件包后綴
.rpm
2、實現工具
- zypper
Fedora
1、軟件包后綴
.rpm
2、前端管理工具
- dnf
RHEL Linux軟件包命名規范
源代碼
- name-major-minor-release
RPM包命名格式
- name-version-release.arch.rpm
- release : 2.el7
* 2 : 編譯次數
* el7: 適用于centos7平臺
* arch : 架構
* rpm : 以rpm后綴命名
- release : 2.el7
程序包管理器
功能
- 將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便的快捷實現程序包的安裝,查詢,卸載,升級等功能
組成部分
-
程序包的組成清單
- 文件清單
- 安裝或卸載時運行的腳本,有如下四類:
- preinstall : 安裝過程開始之前運行的腳本,%pre定義 —nopre
- postinstall: 安裝過程完成之后運行的腳本,%post定義 —nopost
- preuninstall : 卸載過程真正開始執行之前運行的腳本,%preun定義 —nopreun
- postuninstall: 卸載過程完成之后運行的腳本,%postun定義 —nopostun
注意:他將程序的多個功能分拆多個安裝包,單獨實現
-
數據庫部分
- 存儲程序包的名稱和版本
- 包與包的依賴關系
- 各包的功能說明
- 程序安裝生成的各文件的文件路徑及檢驗碼信息
正確獲取安裝程序包的途徑
1. 系統發行版的光盤或官方的鏡像站點
2. 項目的官方站點
3. 第三方的組織制作方
- EPEL:紅帽官方社區組織維護
- 搜索引擎
4.明確知道來源的RPM(自已制作等)
注意:建議在使用程序安裝包時檢查其合法性,針對其做來源合法性
和程序包的完整性
做校驗
RPM包管理程序
1. RPM包的安裝
synopsis: rpm {-i| —install} [install-options] PACKAGE_FILE
-
options
:-
-i , --install
: 安裝 -
-v
: verbos,輸出詳細信息 -
-vv
: verbos,輸出更詳細的信息
-
-
install-options
:-
-h
: 以hash marks格式輸出進度條,每個#代表2%的進度 -
--test
: 測試安裝,只做環境檢查,并不真正安裝 -
--nodeps
: 忽略程序依賴關系 -
--replacepkgs
: 覆蓋安裝,如果文件修改錯誤,需要將其找回,可以使用此方法,但需要把修改錯誤的文件提前刪除 -
--justdb
: 不執行安裝操作,只更新數據庫 -
--noscripts
: 不執行rpm自帶的所有腳本 -
--nosignature
: 不檢查包簽名信息,即不檢查來源合法性 -
--nodigest
:不檢查包完整性信息
-
2. RPM包的升級
synopsis:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE …
-
[options]
-
-U
: 升級或安裝 -
-F
: 升級但不安裝
-
-
[install-options]
-
--oldpackage
: 降級 -
--force
: 強制升級
-
注意:
- 不要對內核做升級操作;4.0之前內核升級需要重啟系統,Linux支持多內核版本并存,因此直接安裝新版本內核,以防止新的內核出故障,導致系統無法正常啟動,或者會中斷在線業務
- 如果某源程序包的配置文件安裝后曾被修改過, 升級時新版本的程序包提供的同一個配置文件不會覆蓋老版本已經修改過的文件,而是把新版本的文件重命名后提供(filename.rpm.new的格式)
3. RPM包的卸載
synopsis:
rpm {-e|--erase} [--allmatches] [--nodeps] [—noscripts]
-
[options]
:-
-e
: 刪除指定程序 -
--allmatches
: 卸載所有匹配指定名稱的程序包的各版本 -
--nodeps
: 卸載時忽略依賴關系 -
--test
: 測試卸載,dry run模式
-
4. RPM包的查詢
synopsis : rpm {-q|--query} [select-options] [query-options]
-
options
-
-qa ,-all
: 查詢所有已經安裝的包 -
-f , --file FILE
: 查詢指定的文件是由哪個包安裝生成的 -
-g , --group GROUP
: 查詢指定包由哪個包組提供 -
-p, --package PACKAGE_FILE
: 對未安裝的程序包執行查詢操作 -
--wahtprovides CAPADILITY
: 查詢指定的capability由哪個程序包提供 -
—whatrequires CAPABILITY
: 查詢指定的capability被哪個包所依賴
-
-
[query-options]
-
--changelog
: 查詢rpm包的changelog -
-l ,--list
: 列出程序包安裝生成的所有文件列表 -
-i , --info
: 查詢程序包想著的infomation.包括其版本號、大小、所屬的包組等信息 -
-c --configfiles
: 查詢指定的程序包提供的配置文件 -
-d --docfiles
: 列出指定的程序包提供的文檔 -
--provides
: 列出指定的程序包提供的所有capability -
-R --requires
: 查詢指定程序包的依賴關系 -
--script
: 查看程序包自帶的腳本
-
用法
-qi
-qc
-ql
-qd
-qpi
-qpc
-qpl
-qpd
注意:RPM的查詢支持正則表達式的格式
5. RPM包的校驗
synopsis: rpm {-V|--verify} [select-options] [verify-options]
-
[options]
:-
-V PACKAGE_FILE
: 自動檢查其數據的完整性及合法性 -
-K PACKAGE_FILE
: 手動檢查其數據的完整性及合法性 -
--import KEY
: 手動導入GPG KEY
-
-
校驗程序包后的Format
- 例:
- rpm -V zsh
- S.5....T. d /usr/share/doc/zsh-4.3.11/README
- 例:
S.5....T.
: 說明
S 文件大小改變了
M 文件權限改變了
5 MD5校驗碼變了
D 主次設備不匹配
L read link變化 了
U 屬主改變了
G 屬組改變了
T 修改時間變了
P CAPABILITY變了
注意:如果其在某位上有變化,才會顯示相應值," . "代表未修改過
程序包來源合法性驗證和完整性驗證:
1. 取公鑰
- 系統路徑為:/etc/pki/rpm-gpg/RPM-GPG-KEY-Centos7
- 系統安裝盤:鏡像文件根目錄下RPM-GPG-KEY-CentOS-6
2. 導入公鑰
- rpm --import /path/from/keyfile
3.檢驗方式
- 安裝此組織簽名的程序時,會自動執行驗證
- 手動驗證:
rpm -K package_file
4.查看導入的公鑰
- rpm -qa gpg-pub*
- 所有被導入的GPG-KEY都會顯示出來
5.刪除導入的公鑰
- rpm -e gpg-pubkey-c105b9de-4e0fd3a3(獲取這個公鑰需要使用
rpm -qa gpg-pub*
查看)
6.數據庫的重建
1. RPM的數據庫存放路徑
/var/lib/rpm/
2. 獲取幫助
- Centos 6
man rpm
- Centos 7
man rpmdb
3. 重建方法
synopsis: rpm {--initdb|—rebuilddb}
-
--initdb
- 初始化數據庫,當前無任何數據庫時, 可初始化并創建一個新的,當前有時不執行任何操作
-
--rebuilddb
- 重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建
-
--dbpath
- 指明庫的路徑,一般用于重建
例:
rpm --initdb --dbpath /tmp/rpmdb/
rpm --rebuilddb --dbpath /tmp/rpmdb/
=========
7.RPM檢查合法性和完整性原理
1. 作者首先使用非對稱加密算法生成一組密鑰,即公鑰與私鑰
2. 作者再使用單身加密算法算出程序包特征碼
3. 利用私鑰對其特征碼進行加密,這個過程叫簽名
4. 使用者拿到作者發布的公鑰對其特征碼解密 ,如果這個過程通過,即能驗證其來源的合法性
5. 使用與作者一樣的單向加密算法算出已經擁有軟件包的特征碼,與之前解密后的特征碼進行對比,其稱之為完整性校驗
=============
yum前端程序包管理工具
yum工具的出現
Linux平臺中軟件的安裝都由源碼文件編譯成二進制文件后再運行,其在很多的制作好的rpm程序包,制作方在制作的過程中把通常不常用的功能去除進行編譯打包,或者再將不同功能的包進行單獨編譯打包,提供多個功能程序包,這個情況安裝軟件時,一個功能包或者程序會依賴于其他程序的庫文件,甚至有的時候會出現死循環依賴,導致軟件的安裝不正常工作或者根本安裝不成功。此yum工具就是為了有效解決程序之間的依賴關系。早期yum工具是由RHEL的程序人員使用perl語言開發,隨著長時間的使用后,發現性能比較低下或難于使用,此后再由RHEL官方使用C語言重寫。
yum工具的實現原理
將諸多程序的包信息和頭文件提取出來,放到一個集中的地方,記錄其依賴關系。在下次安裝的時候,均于存儲的庫文件查找相應的對應關系,再安裝所依賴的軟件程序。
yum的工作機制
其更像C/S架構模式,提供yum源的一方類似服務端,使用yum工具的一方類似客戶端。客戶端每次下載遠程服務器軟件包的一個元數據表,存放至本地進行緩存 ,在要安裝程序時,查詢緩存,如果存在, 就向遠程服務器請求軟件安裝,如果有依賴關系,YUM服務器會檢查其軟件安裝情況并記錄本地,把有依賴并沒有安裝的軟件提示用戶安裝。下載的元數據緩存至本地時,服務器會對元數據進行特征算法,與自己本地進行對比,如果變動了, 就要下載新的元數據
yum工具的傳輸協議及格式
-
http
- 格式為:
http://mirrors.aliyun.com
- 格式為:
-
ftp
- 格式為:
ftp://mirros.aliyun.com
- 格式為:
-
nfs
- 格式為:
-
file
- 格式為:
file:///media/cdrom
- 格式為:
yum的安裝及卸載
- 安裝
rpm -i yum-version.rpm
- 卸載
rpm -e yum
yum配置文件及格式:
/etc/yum.conf
- 各倉庫文件的公共配置,或者不屬于倉庫的配置,格式如下:
- [main]:主名稱,固定名稱
- cachedir= : 緩存目錄
- keepcache=0:要不要保存緩存
- exactarch=1:要不要做精確嚴格的平臺匹配
- gpgcheck=1:檢查來源法性和完整性
- plugins=1:要不要支持插件
- installonly_limit: 同時安裝幾個
/etc/yum.repos.d/*.repo
- 為倉庫的指向及其配置,格式如下:
- [repository ID] :ID名稱,即倉庫名稱,不可與其他ID重命
- name= : 對ID名稱的說明
- baserul=URL1
URL2
URL3 (如果同一個源有多個鏡像,可以在此我寫幾個,但每個URL需換行) - mirrorlist= (有一臺服務器在網絡上,保存了多個baseurl,如果使用這項,就不使用baseurl項)
- enabled={1|0}
- gpgcheck={1|0}
- repo_gpgcheck= : 檢查倉庫的元數據的簽名信息
- gpgkey=URL (gpg密鑰文件)
- enablegroups= {1|0}}是否在此倉庫中上使用組來指管理程序包
- failovermethod= roundrobin|priority (對多個baseurl做優先級的,roundrobin為輪循,priority為優先級,默認為輪循,意為隨機)
- keepalive= 如果對方是http 1.0是否要保持連接
- username= yum的驗證用戶
- password= yum的驗證用戶密碼
- cost=默認baseurl都為1000
* 注意:等號左右不能出現空格
yum命令
yum
- yum - Yellowdog Updater Modified
synopsis: yum [options] [command] [package ...]
-
options
:-
—nogpgcheck
: 禁止進行gpg check -
-y
: 自動回答為Yes -
-q
: 靜默模式 -
—enablerepo
: 臨時啟用此處指定的repo -
—disablereop
:臨時禁用此處指定的reop -
—noplugins
:禁用所有插件
-
========
yum軟件管理
yum的程序安裝:
-
install Package1....
: 安裝 -
reinstall Package1...
: 重新安裝 -
downgrade Package1...
:降級安裝 -
localinstall Package1...
: 安裝本地程序
yum程序包的升級
-
update soft_name
-
localupdate Package1...
yum檢查升級
-
check-update
yum程序卸載
-
remove | erase soft_name
yum顯示程序包
-
list {all|available|updates|installed}
- all : 顯示所有倉庫中的包
- available : 顯示可用的軟件包
- updates : 顯示可用于升級的包
- installed : 顯示已經安裝的包
yum list php* : 顯示想著以php開頭的所有軟件包
yum查看包的infomation信息
-
info Packages1....
yum查看文件是由哪個包提供
-
provides packages1 | FILE….
yum清理本地緩存
clean [ package ] | metadata | expire-cache| rpmdb | plugins | all ]
yum生成緩存
makecache
yum搜索程序包名及summary信息
search [ string1…]
yum顯示程序包的依賴關系:
deplist packages1….
查看yum事務歷史(事務只記錄安裝、升級、卸載的信息)
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
yum顯示倉庫列表:
-
repolist [all | enabled| |disabled}
- all : 查看全部的倉庫
- enabled : 查看地可用的倉庫
- disabled : 查看不可用的倉庫
此項就是在/etc/yum.repos.d/*.reop中定義了enabled=1或者等于0的
=========
yum組管理
yum組的安裝
-
groupinstall
yum組的查看
-
grouplist
yum組的基本信息查看
-
groupinfo
yum組的刪除
-
groupremove
yum組的更新
-
groupupdate
==========
YUM的repo配置文件中可用的變量
-
$releasever
:當前os的發行版本的主版本號 -
$arch
:平臺 -
$basearch
:基礎平臺 -
$YUM0-$YUM9
:用戶自定義的變量
===========
yum倉庫的配置文件示例
[base] #光盤的基本軟件,即os代表光盤
name=CentOS $releasever $basearch on local server 172.16.0.1
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.7-$basearch/ #此處如果使用公網公開的repo,這里的地址一定要為repodata目錄相同層級地址
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enable=1 #如果此項未寫,默認表示啟用
[extra] # extra表示額外的程序
name=CentOS $releasever $basearch extras
baseurl=http://172.16.0.1/centos/$releasever/extras/$basearch/
gpgcheck=0
[epel] # 是由公共組織權威維護
name=Fedora EPEL for CentOS$releasever $basearch on local server 172.16.0.1
baseurl=http://172.16.0.1/fedora-epel/$releasever/$basearch/
gpgcheck=0
[cdrom]
name=cdrom
baseurl=file:///media/
gpgcheck=0
=========
創建yum倉庫:
-
yum install createrepo
createrepo
- Create repomd (xml-rpm-metadata) repository
-
synosis
: createrepo [options] <directory>- [options]
-
—baseurl : 指定repodate的目錄位置
- repodate: 使用sqlite格式存儲
-
- [options]