2010年4月24日 星期六

YUM筆記

YUM簡史

YUM(Yellow dog Updater, Modified)是Redhat系列的linux最重要的套件管理程式,他的前身是YUP(Yellow dog UPdater)。Yellow Dog很多人是很陌生的,他是在早期運行在IBM的power平台上的linux,也是使用rpm based。當時能夠跑在power上的linux大概就只有Debian以及Redhat/Fedora Linux;後來在社群不斷地維護、改善下,就產生了重大的改版--YUM。

很顯然的,YUP或是YUM的出現是因為rpm的相依性、版本、套件間衝突的問題用手動很難解決,必須要依靠一個機制來自動替我們解決所有相依性地獄(dependency hell)的問題。yum提供的服務大致有四項:

  1. 自動解決相依性問題
  2. 能夠用command自動化管理,也能有圖形化介面(pirut)
  3. 能夠管理多個套件庫來源
  4. 能夠跟rpm一樣精確的管理套件的版本以及適用平台的種種情況

Repostories

一個Redhat Linux標準的repostories設定檔,是放置在/etc/yum.repos.d/底下,任何以.repo結尾的檔案都會被視為一個套件庫。以一個RHEL5.repo為例,他的格式如下:

[Server]
name= Server catagory
enable = 1
baseurl=http://192.168.2.254/RHEL5/Server/
gpgcheck=0

[VT]
name= Virtualization catagory
enable = 1
baseurl=http://192.168.2.254/RHEL5/VT/
gpgcheck=0

[Cluster]
name= Cluster catagory
enable = 1
baseurl=http://192.168.2.254/RHEL5/Cluster/
gpgcheck=0

[ClusterStorage]
name= ClusterStorage catagory
enable = 1
baseurl=http://192.168.2.254/RHEL5/ClusterStorage/
gpgcheck=0
其中,[XX]就是yum認定的repo category名稱;利用enable變數可以開關一個category。習慣上相同來源不同的category會放在同一個.repo便於維護,當然你也可以將所有來源寫成同一個檔案,或是每個category都獨立成一個.repo,yum都能夠正確解讀。
想知道有哪些categories是enable/disable,或是全部列出,可以使用repolist:
yum repolist all
repo id             repo name                                    status
Cluster             Cluster catagory                             enabled:     32
ClusterStorage      ClusterStorage catagory                      enabled:     30
RHEL5               RHEL5                                        disabled
Server              Server catagory                              enabled:  2,797
VT                  Virtualization catagory                      enabled:     34
rhel-debuginfo      Red Hat Enterprise Linux 5Server - i386 - De disabled
rhel-debuginfo-beta Red Hat Enterprise Linux 5Server Beta - i386 disabled
rpmforge            Red Hat Enterprise 5Server - RPMforge.net -  enabled: 10,305
rpmforge-testing    Red Hat Enterprise 5Server - RPMforge.net -  disabled
repolist: 13,198

安裝(install)

yum有著非常直觀的命令列:install用來安裝數個套件:

yum install foo1 foo2 foo3
如果你的機器是x86_64,你還可以選擇安裝x86版本的套件,此時只要在多指定名稱即可:
yum install f001.x86_64 f002.x86 f003
對於沒有指定平台的套件,如果套件庫兩者都存在,則兩種平台都會安裝;因此還是強烈建議把平台名稱也寫上去。yum的運行機制會先更新yumdb,然後從dbcache裡得知所有套件資訊,因此當你執行yum install foo時,yum已經更新了他的yumdb,並且列出滿足安裝該套件所需要額外安裝的套件,並等待徵求你的同意。有時候你想自動回答yes,那麼就加個-y:
yum install foo3 -y
不過如果你沒有匯入gpg公開金鑰,yum下載完rpm會拒絕你繼續安裝。解決的方法是在.repo檔裡設定gpgcheck=0,或是直接使用nogpgcheck:
yum install foo3 --nogpgcheck -y
如果想忽略訊息,就加個-q吧。當然,你可以用yum安裝一個rpm,讓yum幫你解決惱人的相依性問題(如果yum可以解決的話):
yum localinstall foo3-1.2.3-5.el5-x86_64.rpm
or
yum localupdate foo3-1.2.3-9.el5-x86_64.rpm
yum也支援安裝一個群組套件,這比較少用到,除非你知道有哪些群組套件可用:
yum groupinstall "GNOME Desktop Environment"
當然,yum也可以讓你很容易的重新安裝:
yum reinstall foo

更新(update/upgrade)

更新是很重要的事情。除非一個系統只專門為了某項服務而設立(例如網格計算之類的高速電腦),或是在一個非常封閉的環境裡(例如無法連入的私有網路),否則更新套件以及安全性更新是很重要的。update就是最常用的更新指令:

yum update foo2 foo2
這樣一來便能夠更新這兩個套件。如果不加任何套件名稱,則系統內所有套件都會被更新。yum也可以讓你只看看有哪些東西需要更新,而不會真的更新:
yum check-update
另一個類似的用法:upgrade
yum upgrade
其實等同於
yum update --obsoletes
讓套件的更新會刪除已淘汰(repo不再被維護)的舊套件。通常這個指令只建議做同版本的升級(例如CentOS 4.3->4.4),如果想要從CentOS4.4升級到目前的5.4,恐怕還是建議拿光碟升級或重灌系統。
或是讓你降級安裝:
yum downgrade foo1

許多關鍵的server並不希望更新kernel或是gcc版本,我們可以從yum的設定檔下手:在/etc/yum.conf多加一行
exclude=kernel gcc
就可以防止被yum升級。

移除(remove/erase)

利用remove或是erase:

yum remove foo1 -y
利用yum remove比rpm -e來得方便多了,因為yum能自動幫我們解決相依性的問題。

查詢(list/search/info)

list可使用的對象分成七大類:installed(已安裝套件), available(所有repos裡的套件), updates(可供更新套件), extras(已安裝但不在repos裡), obsoletes(系統內已被repos廢棄的套件), recent(新被加入到repos的套件)以及all(所有安裝到系統的套件)。list可提供套件名稱的模糊搜尋。要查看有沒有可以更新的套件:

yum list updates
查看有沒有安裝http:
yum list installed http*
查看整個套件庫有多少套件:
yum list avaliable | wc -l
search則是比list提供更廣義的搜尋。利用search可以提供套件名稱、描述、摘要以及與該套件相關的模糊搜尋。
yum search python
便會發現所有欄位包含python都會被納入搜尋範圍。
info會列出套件的詳細資訊。如果只下yum info,則會列出所有套件庫內的套件資訊,那是非常龐大且沒有幫助的訊息。一樣可以用list的規範:
yum info installed | grep nfs
當然,info也可以直接指定套件名稱,但也僅限於套件名稱的模糊搜尋:
yum info nfs*
其他的類別就各憑需求去執行囉。

進階查詢(provides/whatprovides)

provides與whatprovides是相同的意義,通常用在尋找某個檔案是由哪個套件所帶來的

yum provides /etc/passwd
setup-2.5.58-1.el5.noarch : A set of system configuration and setup files.
Repo        : Server
Matched from:
Filename    : /etc/passwd

setup-2.5.58-7.el5.noarch : A set of system configuration and setup files.
Repo        : installed
Matched from:
Other       : Provides-match: /etc/passwd
如果有多個repos,就會有多比資料。provides也可提供套件的模糊搜尋。

清除(clean)

cache指的是rpm本身。yum從站台下載下來的rpm都會存在暫存資料夾下安裝,但是安裝成功後並不會幫你清除。

yum clean packages
可以清除的對象還有headers/metadata/dbcache等。你可以直接用一個all代表清除全部:
yum clean all
刪除某套件的cache

建立一個自己的repo

建立一個yum repo比想像中更容易,你只要把rpm放在一個指定的目錄下,就可以建立一個repo:

createrepo -v /path/to/rpmrepo
這個指令在於產生一個repodata的目錄,內含filelists.xml.gz這類重要的檔案。產生一個新的.repo把這個位置加進來,可以是local硬碟file://,也可以是ftp://,也可以是http://。

參考文章:
1. Redhat Enterprise Linux Administration Unleashed, Chapter 3.
2. YUM的使用-PHP5網管實驗室
3. 使用 yum 來做套件管理並建置 yum Server

沒有留言: