1. 程式人生 > >如何使用yum安裝最新軟體包

如何使用yum安裝最新軟體包

背景

使用yum安裝軟體時,會經常遇到安裝的軟體是老版本的,被非自己期望的release版本。這到底是怎麼回事兒,得從rpmyumyum repositories說起。

rpm

RPM Package Manager 是一個包管理系統。管理著許多格式為xxx.rpm的軟體,多是二進位制包。這些軟體都是針對某種平臺下編譯的,所以可以找準與自己平臺對應的包,直接下載安裝使用。但是有一個問題,如果像使用rpm -i example.rpm直接去安裝這些包時,包會有依賴(比如這個軟體需要什麼動態庫,或者需要python等環境,或者其它什麼軟體才能執行),必須先安裝依賴。這就老火了,手動去安裝依賴,依賴還有依賴,最終會非常多的依賴要安裝。然後

yum就排上用場了,yum最主要的就時解決依賴問題

yum

yum install xxx 就可以安裝軟體了,依賴也同時被安裝。我們的問題來了,通常這樣安裝軟體我們經常遇到安裝了一個老版本,

比如yum install git或者 yum install nodejs時就安裝了一個低版本的軟體,這是怎麼回事兒呢?這跟yum 使用的有關係,請看源(repository)的介紹。

yum repository

repository 簡單來說就是對應一個url(專業叫映象地址),這個url是個列表,裡面有很多的軟體包。當yum install xxx, 就在裡面去查詢xxx 以及xxx的依賴。如果這repository裡放的xxx是一個較低版本的,我們安裝的就是個低版本的軟體了。

yum 可以同時使用多個 repository,一搬在/etc/yum.repos.d/路徑下,比如我就有這麼多

CentOS-Base.repo       CentOS-Media.repo  epel-testing.repo      webtatic.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo  nodesource-el6.repo    webtatic-testing.repo
CentOS-fasttrack.repo  epel.repo          webtatic-archive.repo

.repo

開啟.repo

檔案看,會發現一個.repo檔案裡面有多個節點,每個節點對應了一個url,這就是我們前面提到的裝有很多軟體包的url了。節點叫什麼名字並不重要,一個.repo裡可以包含1個或者多個節點。當yum install xxx安裝時,會在每個節點對應的url去查詢(前提是每個節都啟動了),預設滴會安裝xxx最新的一個版本。當然你可以yum list xxx 列出所有的版本,選擇安裝。yum search xxx是搜尋,這個和list 有區別,list是隻列出namesearch 會去找name, descr(每個包擁有一些基本資訊name,desc等等)等資訊包含xxx的軟體包。更多可以瞭解* yum list vs yum search*

其中,有個兩個.repo非常重要,預設滴CentOS-Base.repo是主要的一個repository,裡面指向了官方的源映象地址。但是也有不夠用的情況,所以epel.repo這個擴充套件包源就排上用場了,很多時候,會安裝老的版本包,加入一個不一樣的源,就可能安裝一個新版本包了。因為這個新的源裡面就有個比較新版的包,yum install xxx會優先安裝高版本epel就不多介紹了,還有一些有意思的源,這些源之所以有多種,是因為每個源裡的包功能上不一樣,比如有些源可能專放一些驅動,有些源專放一些其它工具等等。

如何為yum加入新的repository

你完全可以copy一個.repo,然後手動去改裡面的url。也有更方便的方案,就直接yum install安裝,比如epel就可以yum install epel-release.(官方提供了這樣一個包,其它源裡面也可以搜到)安裝後,/etc/yum.repos.d/ 路徑下就多一個epel.repo檔案了,已經自動配置好了。這種自動安裝對比手動還是挺好的,因為你不必去記住url。有一個問題,多個源儘量不要混著使用,可能引發依賴問題,或者嚴重的軟體跑不起來,更多參考http://dag.wiee.rs/rpm/FAQ.php#D1。 針對這個問題,我的理解是,混合使用源下載的依賴可能來自其它的源,而其它的源下載的依賴包並非你安裝包期望的版本,或者是底層的儲存架構(想要個x86 64的下了i386 32的)具體也沒見文章說得很清楚,這裡自己也有疑問,估計是yum的設計並非針對多個源混用,面對混用源,依賴方面做得有些不足。

當切換repository後依然下載老版本軟體包

你會發現,你即使加了一個epel的源,有時候還是下的老版本。原理很簡單,你所有的源裡面,最高版本就是那個老版本包。舉個實際例子,yum install nodejs 的時候,即使你有epel也只能安裝0.10.x的版本。其實有解決方案的,這種情況你去看官方是否提供了一個源,比如nodejs官方就提供https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora. 通過命令,你會下載一個nodesource-release-el6-1.noarch.rpm包,然後安裝這個rpm包,會增加一個新的源。我這裡就多了一個 nodesource-el6.repo源(這個源裡面僅僅放了nodejs相關的軟體包,及其依賴包),此時你再去 yum install nodejs,就會發現安裝的是新版本了。

參考