1. yum概述
之前在上一篇文章裡提到的rpm包管理器雖然在資料庫中為使用者指定了程式包之間的依賴關系,但使用者仍需根據程式包的依賴關系去手動使用rpm指令來安裝每個程式包,過程略為繁瑣。而yum作為前端管理工具則為使用者解決這一問題。
yum的全稱為:Yellow dog Updater, Modifier,是通過修改Yellow Dog Linux的Yellow Dog Updater開發而成。
yum是基于rpm包管理器的前端程式包管理器,可以從指定伺服器上自動下載下傳程式包,并自動分析程式包的中繼資料、自動處理程式包之間的依賴關系,能一次性安裝完所有依賴的包,而無須繁瑣地一次次安裝所有依賴包。
需要注意的是,yum前端管理工具是基于rpm管理功能的,是以yum不能脫離rpm而存在。yum隻是讓程式包管理起來更為友善,但不意味着可以取代rpm。另外,yum通路檔案伺服器(倉庫)的模式是基于C/S架構的,而檔案伺服器(倉庫)則需要以某種共享服務方式将其提供的程式包及包相關的中繼資料提供給其他主機使用,通常使用到的協定有http、https、ftp、nfs等。此外,還可以使用CD光牒作為本地倉庫或者自己制作本地倉庫,通常使用到的協定是file。
是以對于使用者來講,使用yum這樣的前端程式管理工具比直接使用rpm就要簡便得多了。下面介紹yum的工作原理。
2. yum的工作原理
要能使用yum這個工具來安裝程式包,首先要確定系統上支援rpm包管理功能,并且安裝了yum程式。以下将使用yum下載下傳程式包的流程繪制成圖:

當使用者使用yum去請求安裝某一個程式包時,yum工具會先去yum配置檔案中查找yum倉庫指向的路徑,根據該路徑去通路遠端或本地的檔案伺服器,這個伺服器作為yum倉庫并且存儲了衆多的rpm包以及包相關的中繼資料檔案。當yum根據倉庫路徑通路到倉庫後,會首先嘗試請求擷取rpm包的中繼資料檔案并緩存至本地(/var/cache/yum目錄),而這個中繼資料檔案包括了該倉庫所有rpm包的程式包名、版本号、依賴性以及每個程式包所提供的capabilities等。而後,yum根據使用者要安裝的程式包名去中繼資料檔案裡查找,看看倉庫裡是否有使用者請求下載下傳的程式封包件,如果找到了則根據中繼資料檔案分析該程式包的依賴關系并分析本地系統上有哪些包已安裝、哪些包還沒安裝,再将所有使用者需要安裝且本地尚未安裝的程式包名列出來,并以用戶端的角色發送至檔案伺服器(倉庫)請求下載下傳之。如果請求成功,則yum将要安裝的程式封包件也緩存至本地并執行安裝操作。安裝完成之後将緩存的程式封包件删除以節約空間,而緩存中隻留下中繼資料檔案。
為什麼隻緩存中繼資料而不緩存程式包呢?因為程式包一般隻安裝一次即可,很少會再安裝第二次,而且基于節約空間的考慮,是以yum在安裝完程式包後會将緩存中的程式包删除。而緩存中繼資料好處則是當下一次使用者使用yum請求安裝程式包時可以節約帶寬,無需再次重新請求擷取全部的中繼資料檔案,并且可以提高本地分析程式包的速度。
當使用者第二次使用yum請求安裝程式包時,基于實時同步更新緩存以及節約帶寬的考慮,yum會先請求下載下傳yum倉庫下rpm包中繼資料的校驗碼檔案至本地,将其與本地緩存上的中繼資料校驗碼相比較,如果相同,說明無須更新;如果不同,則說明倉庫中rpm包已經更新,是以yum會重新請求下載下傳倉庫上的中繼資料檔案以更新中繼資料緩存。接着同樣是分析程式包依賴性、請求要安裝的全部程式包等。
3. yum用戶端配置檔案
yum的配置檔案主要有/etc/yum.conf和/etc/yum.repos.d/*.repo,其中/etc/yum.conf為主配置檔案,為所有yum倉庫提供公共配置;而/etc/yum.repos.d目錄下以.repo結尾的檔案則為各yum倉庫的指向提供配置資訊。需要注意的是,在CentOS發行版中,/etc/yum.repos.d目錄下使用多個以.repo結尾的倉庫配置檔案是為了友善管理,既可以用多個以.repo結尾的檔案分别配置多個不同的倉庫指向,又可以在一個.repo檔案中配置多個倉庫指向。而且,當同時存在多個同一類的倉庫時,每個倉庫稱為鏡像,yum支援鏡像清單插件并且隻使用其中的一個倉庫指向即可,因為同一類倉庫中的程式包是相同的。這時應該使用離使用者較近的鏡像站點,在repo選項中可通過開銷(cost)指定具體使用哪一個倉庫。當同時存在多個不同類的倉庫時,每個倉庫中的程式包各不相同,yum也可同時分析、使用這些倉庫。
我們通常在/etc/yum.repos.d目錄下配置yum的指向路徑相關資訊,而在這個配置檔案中的倉庫指向的定義選項主要有以下幾項:
[repositoryID] //倉庫名
name=Some name for this repository //對repo作功能性說明;
baseurl=url://path/to/repository/ //倉庫指向的路徑,可指向多個路徑;
enabled={1|0} //是否啟用該倉庫,預設為1(啟用);
gpgcheck={1|0} //是否要對程式包資料的來源合法性和資料完整性做校驗;
gpgkey=URL //指定GPG密鑰檔案的通路路徑,可由倉庫提供;
enablegroups={1|0} //是否允許以組的方式管理倉庫;
failovermethod={roundrobin|priority}
//當baseurl同時指向多個倉庫路徑時,可指定以什麼方式選擇url去通路倉庫,以及當某一路徑通路
失敗時,可指定如何再選擇路徑;roundrobin是随機挑選路徑通路,priority是自上而下選擇路徑訪
問;預設為roundrobin;
cost= //開銷;開銷越小,該倉庫url更優;預設為1000.
各類型檔案伺服器:
示例:使用CD光牒當做本地yum倉庫
(1) 挂載CD光牒至某目錄,例如/media/cdrom
# mount -r -t iso9660 /dev/cdrom /media/cdrom
(2) 建立配置檔案
[CentOS7]
name=this is a local repo.
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1
4. yum指令的用法
配置好本地倉庫指向後,就可以使用yum安裝程式包了,接下來介紹yum指令如何使用:
文法格式:
yum [options] [command] [package ...]
常用選項:
--nogpgcheck:禁止進行gpg check;
-y:自動回答為"yes"
-q:靜默模式;
--disablerepo=repoidglob:臨時禁用此處指定的repo;支援glob風格通配,表示某一類repo;
--enablerepo=repoidglob:臨時啟用此處指定的repo;支援glob風格通配,表示某一類repo;
--noplugins:臨時禁用所有插件。
yum的子指令用法:
(1)顯示倉庫清單:
# yum repolist [all|enabled|disabled]
(2)顯示程式包:
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates} [glob_exp1] [...]
(3)安裝程式包:
# yum install package1 [package2] [...]
(4)重新安裝:
# yum reinstall package1 [package2] [...]
相當于:rpm -ivh --replacepkgs
(5)更新程式包:
# yum update [package1] [package2] [...]
(6)降級程式包:
# yum downgrade package1 [package2] [...]
相當于:rpm -Uvh --oldpackage
(7)檢查可用更新:
# yum check-update
(8)解除安裝程式包:
# yum remove | erase package1 [package2] [...]
注意:依賴于此包的程式會一同被解除安裝。
(9)檢視程式包information:
# yum info [...]
(10)檢視指定的特性(可以是檔案)是由哪個程式包所提供:
# yum provides | whatprovides feature1 [feature2] [...]
相當于rpm -qf FILE;
(11)清理本地緩存:
# yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
(12)建構緩存:
# yum makecache [fast]
(13)搜尋:
# yum search string1 [string2] [...]
以指定的關鍵字搜尋程式包名及summary資訊;比對方式為模糊比對;
(14)檢視指定包所依賴的capabilities:
# yum deplist package1 [package2] [...]
(15)檢視yum事務曆史:
# yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollbac
k|new|sync|stats]
僅能查到有改動的曆史,例如安裝、更新、解除安裝等。
(16)安裝及更新本地程式包:
# yum localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
# yum localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
注意:本地程式包指非倉庫的程式包,可以是從網際網路上下載下傳的程式包。當本地程式包的安裝存在依賴關系并且該包依賴于倉庫裡的程式包時,使用此選項可借助yum安裝這個本地程式包。但從CentOS 6/7後,直接install選項指定本地rpm程式包即可,即:# yum install local_rpmfile.
(17)包組管理的相關指令:
# yum groupinstall group1 [group2] [...]
# yum groupupdate group1 [group2] [...]
# yum grouplist [hidden] [groupwildcard] [...]
# yum groupremove group1 [group2] [...]
# yum groupinfo group1 [...]
5. yum的repo配置檔案中可用的變量
前面提到,/etc/yum.repos.d目錄下的配置檔案能為yum指明倉庫的路徑及其相關資訊,而使用不同平台類型的使用者可通過鏡像網站來安裝倉庫裡的程式包。而在/etc/yum.repos目錄下的配置檔案中,通過引用變量來表示baseurl可以使yum自動指向适合其平台的倉庫路徑,這樣即使不會配置yum的repo配置檔案的使用者也可使用預設的yum源,可友善鏡像源管理者的管理。
在yum的repo配置檔案中可用的變量有:
①$releasever:目前OS的發行版的主版本号;
②$arch:平台;
③$basearch:基礎平台;例如i386,i486,i586,i686的基礎平台為i386,即隻要是32位的系統統統視
為i386基礎平台;常見的基礎平台有i386, x86_64, ppc等;
④$YUM0-$YUM9:供使用者自定義的内部變量;
示例:baseurl=http://apt.sw.be/fedora/$releasever/en/$basearch/dag
6. 建立yum倉庫--createrepo指令
如果管理上百台伺服器主機,則當全部主機要求從網際網路上某個檔案伺服器下載下傳安裝某個程式包時,會對帶寬造成極大的消耗,為了節約帶寬,可将遠端檔案伺服器上的yum倉庫鏡像至本地,做成本地伺服器,而全部主機隻需通過内網通路本地伺服器即可下載下傳安裝程式包,大大節約了帶寬。
前面提到,一個yum倉庫不僅包括衆多的rpm包,還包括包相關的中繼資料檔案。是以要建立倉庫,除了要提供rpm包之外,還需要為所有rpm包制作中繼資料檔案,而在Linux上隻需通過執行createrepo指令就可以建立出中繼資料檔案,createrepo是通過讀取各個rpm包上的中繼資料資訊并堆積形成中繼資料檔案來實作的。
接下來簡單介紹createrepo指令的使用:
createrepo指令:
createrepo - Create repomd (xml-rpm-metadata) repository
用于建立yum倉庫的中繼資料目錄檔案(repodata)
常用選項:
--basedir:可通過此選項将repodata目錄輸出到目前rpm程式包的父目錄去;
指令示範:
這裡以/local_repo/Packages目錄下事先複制過來的rpm包作為使用示例,如圖:
開始建立中繼資料目錄檔案repodata:
再次ls檢視:
可以發現,目前目錄下多了一個repodata目錄。
切換至repodata目錄檢視:
需要注意的是,rpm包的中繼資料檔案是使用UUID來命名檔案的,其中filelists類檔案用來存放程式封包件名清單,而primary類檔案則可用于存放程式包(組)的版本号、依賴性資訊等。另外,repodata目錄下的repomd.xml檔案即為中繼資料的校驗碼檔案。
7. 即将取代yum的dnf
雖然yum功能強大,并且支援許多插件擴充功能,但yum在設計體系上存在一些不足的地方,例如,yum在安裝程式包時,如果突然中斷,則下一次重新安裝時yum無法識别該程式包是否已安裝,而dnf主要就是為了解決yum這一缺陷的,預測将來dnf會取代yum這個工具。
轉載于:https://blog.51cto.com/xuweitao/1905358