2018-3-14Linux系統管理(12) Linux程序包管理(2)yum前端管理工具
rpm命令實現程序管理: 安裝:-ivh, --nodeps, --replacepkgs 卸載:-e, --nodeps, --replacepkgs 升級:-Uvh, -Fvh, --nodeps, --oldpackage 查詢:-q, -qa, -qf, -qi, -qd, -qc, -q, --scripts, -q --chagelog, -q --pvevides, -q --requires 校驗:-V 導入GPG密鑰:--import, -K, --nodigest, --nosignature 數據庫重建:--initdb, --rebuiliddb
那麽在接下來的章節中,我們繼續來將Linux程序包管理。
一、Linux程序包管理
在上一章中我們講述過,使用rpm包管理程序會有一些問題,比如說安裝包之間存在這依賴關系,一旦安裝時,如果很復雜的話,安裝時需要很長時間才能完成,因為我們必須要想辦法手動解決依賴關系,當然,我們可以使用--nodeps
來忽略安裝包之間的依賴關系,其導致的結果就是,安裝時沒有問題,但使用時會就有些問題,所以說為了能夠保證正常使用的前提下,就必須要解決依賴關系。而手動解決通常是一件很麻煩的事情,那麽我們就要采用高於.deb
或高於.rpm
包的底層管理工具,它能實現前端自動解決依賴關系,完成正常的安裝,解決用戶的後顧之憂,在這種場景下完成對應的
CentOS
系統當中有兩個前端安裝工具,一種為yum
,另一種是新版的dnf
。 由於CentOS
還沒有官方支持的dnf
工具,該工具在Fedora22+
當中才剛開始引入,不過在CentOS 7
中使用dnf
也並非不可能,yum是一款C/S架構的程序包管理工具,在本地客戶端可達的網絡服務器,首先該服務器是一個文件服務器,要提供文件存儲並提供文件服務等功能,提供了很大的存儲空間去放置我們所能使用的各種rpm包,而後整個目錄通過文件共享的服務功能輸出到外部主機能夠進行訪問,而後任何一個Linux主機,本身支持rpm包的基本功能,同時在這個基礎之上又能使用yum工具,而yum的工作原理是當用戶安裝某個程序包時,使用yum命令接收到由用戶所安裝到的包請求之後,該命令就會嘗試根據本地的配置文件提供的服務器路徑訪問地址
URL
,那麽yum接收到所謂的安裝包程序之後,嘗試著通過本地的配置文件指令的URL去找遠程網絡服務器主機。1.1 yum工作原理
為了避免將網絡遠程服務器所提供的所有安裝包下載到本地,遠程服務器和yum它們彼此之間互相工作的模式為:這個服務器要提供一個叫做程序包的倉庫(repository),對於這個倉庫要有元數據信息或者要有描述性的數據信息,這個信息文件存放這文件包的名字、版本以及包與包之間的依賴關系等,都存放在該文件中,所以當這個yum客戶端試圖通過遠程網絡服務器去獲取某個安裝包時,yum客戶端首先請求將元數據信息文件發送過來,下載至本地之後放置在本地的一個緩存區域中,yum客戶端就開始分析本地元數據當中有沒有用戶去請求的安裝包名,如果有,讀取這個包,嘗試著分析該包的依賴關系,而分析依賴關系也根據這個元數據文件,因為這個元數據文件定義在網絡上的服務倉庫所有的安裝包,以及程序包之間的依賴關系,所以yum客戶端在本地通過該文件分析完成之後,而後又查詢本地所被依賴的安裝包,分析完成之後剩余未安裝的包列舉出來,最後扮演文件服務器去在該網絡主機中下載程序包,下載完成之後先緩存在本地,之後開始執行類似於rpm的安裝操作。而安裝時首先會安裝被依賴的安裝包,安裝完成之後則返回客戶端提示安裝成功,之後將緩存下來的安裝包刪除,以節約空間。但元數據文件不會刪除,等到下次安裝時,可直接讀取該元數據文件。
yum客戶端每一次都會去請求網絡主機上的元數據,以檢測數據包等信息是否發生改變,當然頻繁請求也會占用帶寬,所以元數據可能不止一個,有的存放包名,有的存放版本等,除此之外,還有特殊文件,這個特殊文件記錄了每一個元數據文件的校驗碼,所以在請求時,先請求的是校驗碼,緩存在本地進行對比,如果校驗碼一樣,本地緩存有效,否則請求元數據。
對於應用場景來講,yum首先是客戶端,也是一個自我獨立的管理組件,這個組件需要請求遠程網絡服務主機上的倉庫,從倉庫中下載元數據文件,在本地能夠完成yum的查詢等操作,當進行安裝時,yum需要請求網絡服務器去下載該程序包文件進行安裝,這並不是傳統的C/S,而是訪問機制為C/S架構。
為了能夠進行快速訪問,全球有許多的鏡像站,我們可以找一個能夠快速訪問並且受信任的鏡像站訪問就可以了。該配置文件能夠指向一大推鏡像服務器,我們稱之為鏡像列表,從鏡像列表當中挑選出符合一個,我們就能夠進行訪問。
1.2 yum缺點
yum在設計上是有很大缺陷的,其缺點為:比如雖然能夠解決依賴關系,但在某個安裝過程中如果半途中止時,下一次重啟安裝時將無法解決,因此dnf主要就是應該解決這個問題的。但使用dnf時和yum是沒有什麽區別。
1.3 yum與rpm
因此對於我們來講,首先對於本地Linux上要有yum客戶端及工具還有yum命令,第二步yum本身需要通過配置文件去找到該網絡主機或者本地主機的遠程倉庫,所以這個配置文件作為管理員需要指定,那麽第三步就是如果互聯網帶寬足夠大的話,可以使用互聯網上某個機構提供的倉庫,尤其是鏡像站點中的倉庫,畢竟有許多較為新版的安裝包。或許可以將遠程服務器的鏡像到本地。
但其實yum並不是rpm命令的取代者,它只是rpm的前端管理工具,意味著yum需要依賴rpm的存在,如果僅有yum是不可以的。
如果在本地創建yum倉庫的話,我們甚至還得需要配置一臺服務器主機,一般來說yum支持的文件服務器共有兩種,一種是ftp,另一種是http,無論是哪一種,都得需要通過URL來進行輸出,把程序包復制在存儲空間之後,還得需要創建一個元數據文件,這個元數據我們可以使用命令來創建完成,對於元數據文件並不是憑空而來,而是分析每一個程序包自帶的rpm數據抽取出來給羅列堆積在文件中實現的。而創建元數據文件的命令為:createrepo
。
不過該命令可能創建高級倉庫比較難,因為高級倉庫有可能要對程序包進行分組,在安裝時我們可以對這個一個組的程序包進行安裝,而且創建該組時使用.xml
格式的。意味著我們必須精通xml的語法才可能編寫,好在我們必須選擇。
1.4 yum的由來
其實yum是由yellow dog
所研發的,那麽yum的全稱為Yellow Update Modifiter
,yum要依賴於它的yum倉庫,全稱為yum repository
,簡稱為yum repo
,那麽我們將yum的特性總結如下:
CentOS: yum, dnf URL: http://mirrors.aliyun.com YUM: Yellow Dog, Yellow Update Modifter yum repository: yum repo 存儲了眾多rpm包,以及包相關的元數據文件(放置於特定的目錄下:repodata);
需要註意一點的是:repodata所在的路徑,就是倉庫所指向的路徑。
一個倉庫在訪問時有多種路徑,一般都是由文件服務器來提供的,我們在文件服務器上通過某種協議來對用戶進行訪問。
文件服務器: ftp:// http:// nfs:// file:///
1.5 yum客戶端
yum本身就是一個獨立程序包來可以進行安裝,也有自己的配置文件,共有兩段組成,其配置文件路徑在:
yum客戶端: 配置文件: /etc/yum.conf:為所有倉庫提供公共配置; /etc/yum.repos.d/*.repo:為倉庫的指向提供配置;
對於用戶來說,我們在/etc/yum.repos.d/
目錄下去配置yum源倉庫配置文件,名稱必須得是.repo
,那麽我們接下來看一下yum是如何使用倉庫的。
yum倉庫的配置格式為,每一個中括號都代表著倉庫的ID,且具有唯一性,之後我們指明它的名字和URL等信息用來配置進行定義。需要註意的是,等號=
左右是不能有分隔符的,否則就會有語法錯誤。
倉庫指向的定義: [repositoryID] name=Some name for this repository baseurl=url://path/to/directory/ enabled={1|0} gpgcheck={1|0} gpgkey=URL enablegroups={1|0} failovermethod={roundrobin|priority} 默認為:roundroin,意為隨機挑選; cost= 默認為1000;
具有了這些概念之後,我們就可以開始配置yum指向,而後開始使用倉庫,以及使用yum命令了。
二、yum命令的用法
2.1 安裝包管理的相關命令
yum有許多的子命令,其命令用法格式為:
yum [options] [command] [package ...]
yum剛才講到過有許許多多的子命令,每一個子命令都用於實現不同的管理功能,在man手冊中記錄了許多的子功能,我們總結出來並查看。
command is one of: * install package1 [package2] [...] * update [package1] [package2] [...] * update-to [package1] [package2] [...] * update-minimal [package1] [package2] [...] * check-update * upgrade [package1] [package2] [...] * upgrade [package1] [package2] [...] * upgrade-to [package1] [package2] [...] * distribution-synchronization [package1] [package2] [...] * remove | erase package1 [package2] [...] * autoremove [package1] [...] * list [...] * info [...] * provides | whatprovides feature1 [feature2] [...] * provides | whatprovides feature1 [feature2] [...] * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] * makecache [fast] * groups [...] * search string1 [string2] [...] * shell [filename] * resolvedep dep1 [dep2] [...] (maintained for legacy reasons only - use repoquery or yum provides) * localinstall rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use install) * localupdate rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use update) * reinstall package1 [package2] [...] * downgrade package1 [package2] [...] * deplist package1 [package2] [...] * repolist [all|enabled|disabled] * repoinfo [all|enabled|disabled] * repository-packages <enabled-repoid> <install|remove|remove-or-reinstall|remove-or-distribution-synchronization> [package2] [...] * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ] * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats] * load-transaction [txfile] * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel] * fssnapshot [summary | list | have-space | create | delete] * fs [filters | refilter | refilter-cleanup | du] * check * help [command]
以上可以看的出來子命令很多,我們例舉一些常用的子命令來總結一下該命令的用法,其總結如下:
那麽第一個就是顯示如何顯示倉庫列表,該子命令為repolist,可以顯示所有、啟用和禁用的,默認顯示啟用的。
顯示倉庫列表: repolist [all|enabled|disabled]
第二個簡述的是如何顯示程序包我們使用list子命令,不僅可以顯示所有,還可以使用glob通配機制。
顯示程序包: list # yum list [all | glob_exp1] [glob_exp2] [...] # yum list {available|installed|updates} {glob_exp1} {...}
我們學會如何列出並顯示程序包之後,可以安裝程序包,當有多個版本時,可以指明版本安裝,默認安裝最新版,該子命令為install。
安裝程序包: install package1 [package2] [...] reinstall package1 [package2] [...]
接下來說的是升級某個程序包,該子命令為update。
升級程序包: update [package1] [package2] [...] downgrade package1 [package2] [...] (降級)
那麽還有一個叫做ckeck-update,該子命令為檢查有哪些升級包可用。
檢查可用升級: ckeck-update
如果在系統裏面卸載一個程序包時,需要註意的是,卸載時,如果依賴於該程序包的程序也會被卸載,那麽卸載使用remove子命令。
卸載程序包: remove | erase package1 [package2] [...]
我們如果想查看某一個程序包的簡要信息,顯示類型和rpm -qi
命令基本相同,比如大小、日期、修改時間等,我們可以用info子命令。
查看程序包的information: info [...]
還有就是可以查看某個特性或查看某個命令是由那個安裝包提供的,該子命令為provides,相當於rpm -qf
。
查看指定的特性(可以是某文件)是由那個程序包所提供: provides | whatprovides feature1 [feature2] [...]
clean子命令是清理緩存的子命令,如果不想刪除元數據文件就要使用該子命令,還可以指定清理那種,或者清理所有。
clean [ packages | metdata | expire-cache | rpmdb | plugins | all ]
除了清理緩存,我們還可以構建緩存,該子命令為makecache,此操作可以不用做,因為在安裝時就會自動構建緩存。
構建緩存: makecache
根據關鍵字可以搜索相關的信息,可以用search子命令,後面跟上關鍵字即可。
搜索: search string1 string2 [...] 以指定的關鍵字搜索程序包及summary信息;
我們還可以查看指定所依賴的程序包提供的功能。
查看指定包所依賴的capabilites: deplist package1 [package2] [...]
如果想查看過去安裝或卸載過那種程序包,或者叫做在過去產生了某個事務,那麽事務指的就是改變或者操作了某個具體的程序,比如說,在某一時刻成功安裝或卸載了某個程序包。
查看yum事務歷史: history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
接下來說的是localinstall和localupdate這兩個子命令,如果在yum倉庫中沒有某個程序包時,我們從互聯網上下載某個安裝包的話,使用rpm -ivh
來進行安裝,但是所帶來的問題是如果該程序包所依賴於其它的程序包時,或者說那些被依賴的安裝包在倉庫中,這時候localinstall子命令就表示使用yum localinstall
來安裝該rpm包時,將該程序包中的被依賴的程序包在倉庫中提取並安裝進行解決。到CentOS 6
和CentOS 7
,我們可以直接使用install子命令來進行安裝本地的rpm包,也建議這樣操作。
安裝及升級本地程序包: localinstall rpmfile1 [rpmfile2] [...] (maintained for legacy reason only - use install) localupdate rpmfile1 [rpmfile2] [...] (maintained for legacy reason only - use update)
2.2 包組管理的相關命令
包組管理的相關命令有如下:
包組管理的相關命令: groupinstall group1 [group2] [...] geoupupdate group1 [group2] [...] grouplist [hidden] [groupwildcard] [...] groupremove group1 [group2] [...] groupinfo group1 [...]
我們如果想安裝某個包組的,可使用子命令groupinstall
跟上某個包組就可以,如果包組名有空格的話,我們使用雙引號來引起該包組名稱。
2.3 在CentOS 7中如何使用本地yum源
每一個光盤介質就是程序包的集合,無論是在CentOS 5、6、7中,都有相應的repodata文件,所以可以直接將光盤當作本地yum源來使用,使用file加上路徑就可以了,介質可以不用復制到本地某個目錄當中,首先將光驅打開,將光盤放置在服務器中,然後進行掛載,掛載路徑在/media/cdrom
中,如果沒有該目錄則先創建。
# mkdir -r /media/cdrom # mount -r /dev/sr0 /media/cdrom
之後我們進入/etc/yum.reops.d/目錄下,在該目錄下有個CentOS-Media.repo文件,我們使用vim來進行編輯該文件,修改格式如下:
# cd /etc/yum.repos.d/ # vim CentOS-Media.repo [c7-media] name=CentOS-$releasever - Media baseurl=file:///media/cdrom/ gpgcheck=1 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
以上修改完成之後,保存並退出,之後我們使用yum repolist
命令查看一下,顯示出軟件包的數量出來則即為成功。
# yum repolist Loaded plugins: fastestmirror, langpacks c7-media | 3.6 kB 00:00:00 (1/2): c7-media/group_gz | 156 kB 00:00:00 (2/2): c7-media/primary_db | 5.7 MB 00:00:00 Loading mirror speeds from cached hostfile repo id repo name status c7-media CentOS-7 - Media 9,591 repolist: 9,591
最後我們總結一下如何使用本地yum源。
如何使用光盤並掛載yum倉庫: (1) 掛載光盤至某目錄,例如:/media/cdrom # mount -r /dev/sr0 /media/cdrom (2) 創建配置文件 [CentOS 7] name= baseurl= gpgcheck= enabled=
2018-3-14Linux系統管理(12) Linux程序包管理(2)yum前端管理工具