在 Windows 要安裝一個軟體,有時沒辦法一次搞定,一下子要 .Net Framework,一下子又是 Direct-X,搞不好還有 Flash Player、Java Runtime、Visual C Runtime、Visual C++ Runtime 在等著我們。
明明都是要安裝,為什麼在 iOS 跟 Android 上安裝 App 那麼簡單?!
等一下!這件事跟 CentOS 什麼關係?
不要以為扯上它們兩個就可以衝高瀏覽率哦~~~ (
它們的關係可大著呢!
因為 iOS、Android 跟 Linux 同樣都是屬於 類 Unix 系統 (Unix-Like) 的一員,所以背後運作的機制當然都是類似的方式。
所謂的 App Store 跟 Google Play,就是一個專門提供 iOS App 和 Android App 的超大型軟體倉庫,我們要安裝 App 的步驟,就只是連線上去,選擇需要的 App,點選安裝,剩下的事情都輪不到我們煩惱。
而 CentOS 也是一樣,透過 YUM (Yellowdog Updater Modified) 這個套件管理機制,我們只要連上官方或第三方的套件庫 (Repo,Repository),也就是 Linux 的軟體倉庫,「東市買駿馬,西市買鞍韉,南市買轡頭,北市買長鞭」,應有盡有,任君選擇。
而不必像以前一樣,要不就像是 套件升級不求人,手動編譯自己來 - 以 OpenSSH 為例,100% 完全 DIY 搞定所有動作,或是像 RPM / SRPM 安裝、移除和相關指令操作,所有範例一次全部秀給你,省去一些編譯、打包的步驟,卻依然逃不出處理相依套件們的無間地獄。
因為這些套件庫的維護者,幫我們從原始碼的取得、修改、更新,到 RPM 的組態、編譯、打包,相依套件的選擇、關聯、維護,全部在背後默默的完成了。
所以,只要網路是暢通的,我們可以只輸入一行簡單的指令,接下來,不管是套件的下載、相依套件的關聯性、版本版號的選擇 .... 等等的千絲萬縷,所有的麻煩全部交給 YUM 來處理就對了。
- 從本機的套件庫設定檔裡讀取連結位址,開始連線到套件庫去。
- 連上之後,取得 標頭檔 (Headers),進行比對並取得最新的資訊。
- 分析使用者的指令,像是安裝、更新、移除、查詢 ... 等動作。
- 從套件庫下載所有必要的檔案,再依指令、參數、選項的要求開始執行。
套件庫
YUM 的主設定檔在 /etc/yum.conf,裡面的設定值會套用到所有套件庫,沒有必要的話,並不需要去修改。
sudo vi /etc/yum.conf
更詳細的說明可以參閱 RHEL Deployment Guide - Configuring Yum and Yum Repositories。
而所有套件庫的設定檔則是在 /etc/yum.repo.d/ 目錄裡,可以看到這些 *.repo 套件庫設定檔,預設會有這四個官方套件庫設定檔。
我們先來看一下最重要的 CentOS-Base.repo。
sudo vi /etc/yum.repo.d/CentOS-Base.repo
一組完整的套件庫資訊會有這些設定值:
# 辨識用的自訂名稱
[base]
# 詳細描述說明
name=CentOS-$releasever - Base
# 鏡像站台的分流位址
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
# 主要站台的位址
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
# 是否檢查數位簽章
gpgcheck=1
# 數位簽章在本機裡的儲存位置
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 是否要啟用這組設定值
enable=1
就像我們在 找不到可靠的套件來源嗎?幫 CentOS 加入可靠的第三方的套件庫 裡加入 EPEL、ELRepo、IUS Community Project ...... 等等第三方套件庫。
sudo yum -y install epel-release
其實也就是把套件庫設定檔跟數位簽章存到本機裡。
有問題該問誰?
Linux 人最熟悉的老伙伴 - Manual Page 隨時都在你身邊,或是看 線上版。
man yum
也可以看一下簡要的 Help 說明。
yum --help
當然,需要最正確的權威資料時,官方網站 永遠在等著我們。
一般套件
如果需要速查表的話,請參閱 Redhat - Yum Command Cheat Sheet for Red Hat Enterprise Linux。
查詢
顯示所有已安裝及未安裝的套件,list 和 list all 有同樣的功能。yum list
這邊有幾個重點,最左邊顯示的是套件名稱跟適用平台,中間是版號,最右邊代表來自哪個套件庫。
- 套件庫名稱開頭有「@」符號代表已經安裝過了。
- anaconda 代表是作業系統重灌時自動安裝的,base、update 來自官方套件庫。
- 如果來自其他套件庫,則會顯示那個套件庫的自訂名稱,也就是 *.repo 套件庫設定檔裡,中括弧 [ ] 裡輸入的文字。
顯示未安裝的套件。
yum list available
顯示已安裝的套件。
yum list installed
顯示已安裝,而且有新版本可以升級的套件。
yum list updates
顯示最近一週內安裝的套件 (
yum list recent
顯示已安裝,但是找不到套件庫提供支援的套件,如:不提供新版本、廢棄不用、來源套件庫已停用 ... 等。
yum list extras
顯示已沒有任何相依關係、廢棄不用的套件。
yum list obsoletes
yum list PACKAGES_NAME
顯示目前所有啟用中的套件庫,若要包含未啟用的套件庫,請用「repolist all」。
yum repolist
顯示套件庫的詳細相關資訊。
yum repoinfo
以關鍵字交叉配對,搜尋名稱、描述 ... 等條件相符的套件,如果不加上「all」的話,系統會自動篩選,去掉較不符合的套件再顯示。
yum search all KEYWORDS
顯示套件的詳細相關資訊。
yum info PACKAGES_NAME
顯示這個套件、指令或檔案由哪個套件所提供,參數 provides 跟 whatprovides 的功能相同。
yum provides PACKAGES_NAME
這個參數非常好用,尤其是像我是用最小化 (Minimal) 的版本,就只有最精簡的環境,常常都要靠它才知道,什麼指令到底該裝上什麼套件才行。
顯示這個套件的相依套件清單。
yum deplist PACKAGE_NAME
安裝
安裝套件及它的相依套件。sudo yum install PACKAGES_NAME
把這個套件重新安裝一次。
sudo yum reinstall PACKAGES_NAME
更新
檢查所有可以升級的套件清單,類似 Debian 系列的 apt-get update 指令。yum check-update
將所有套件升級,類似 Debian 系列的 apt-get upgrade 指令。
sudo yum update
將所有套件升級,通常用在大版本更新或全新安裝時,類似 Debian 系列的 apt-get dist-upgrade 指令。
sudo yum upgrade
跟 update 參數的差別在,update 是單純的把所有套件跟相依套件用新版號來升級,不做任何的刪除或替代。
而 upgrade 會除了檢查新版號之外,若是相依套件需要更換的話,會把原有的相依套件刪除,再換上新的相依套件。
只將指定的套件升級。
sudo yum update PACKAGES_NAME
只將指定的套件升級,並更換必要的相依套件。
sudo yum upgrade PACKAGES_NAME
將指定的套件降級。
sudo yum downgrade PACKAGES_NAME
不過降級不一定能成功,因為這個套件及相依套件有可能正在被使用中,因而移除不了;若我們強制的移除它,又有可能影響到其他套件與功能,甚至是整個系統的穩定性。
移除
移除套件,參數用 remove 跟 erase 都一樣。sudo yum remove PACKAGES_NAME
清理現在已經不需要的相依套件。
sudo yum autoremove
清理所有暫存資料,預設的儲存目錄在 /var/cache/yum。
yum clean all
可以清理的暫存資料有:
- all:全部的暫存資料
- headers:標頭檔。
- packages:曾經下載過的 RPM 檔案。
- metadata:套件的描述資料。
- expire-cache:過期的快取。
- rpmdb:RPM 資料庫。
- plugins
其他
檢查套件的異常狀況,不加參數的話會用預設值 all 來檢查,這個動作要花上不少時間,如果不幸檢查出來的話,可以用 package-cleanup 之類的指令來修復。sudo yum check
有這些選項可以使用。
- all:預設值,全部檢查。
- dependencies:套件的相依性。
- duplicates:重覆的套件。
- obsoletes:廢棄不用的套件。
- provides
重新下載套件庫的快取資料,這個動作也要花上不少時間。
yum makecache
查詢所有的執行歷程,不管是安裝、移除、更新、重新安裝 ...,任何動作都會記錄下來。
sudo yum history
套件群組
什麼是「套件群組 (Package Groups)」?
引用 Redhat 的官方定義:
「將提供同一目標的許多套件集合起來,安裝這個套件群組就等於把這堆不一定有相依關係的套件安裝起來,讓我們可以節省很多時間。」
就拿一個完整的 X-Window 來說,我們要安裝 X11 Server、X11 Client、桌面環境、字型、輸入法、函數庫 ...... 等等一大堆的套件,而它們之間除了相依性的問題,還可能會有相衝突、可替代、可更換、不相容、指定版本版號之類的問題。
102
就算我們非常了解這些套件之間的關係,如果我們真的得手動一個一個的決定這些數量不明的套件們,相信也得花上不少的時間來 try and error 了。
而套件群組的操作也很簡單,大多也就只是多加上個「group」的參數而已。
查詢
顯示目前所有可用的套件群組數量,分為環境群組 (Environment Groups) 和一般群組 (Groups)。yum groups summary
顯示所有套件群組的名稱。
yum group list
顯示套件群組的詳細相關資訊。
yum group info GROUP_NAME
安裝
安裝群組套件。sudo yum group install GROUP_NAME
我們可以看到「含有 GUI 的伺服器」這個群組,簡單的 11 個字,居然就代表了 270 個套件、2 個必須升級的套件及 693 個相依套件,共 965 個套件。
更新
更新群組套件。sudo yum group update GROUP_NAME
108
移除
移除群組套件。sudo yum group remove GROUP_NAME
109
無法輸入中文字的處理方式
在輸入套件群組的名稱時,必須「100% 相同」,連空格都不能錯,還必須用雙引號 " " 包起來。可是在 Shell 下面根本沒辦法輸入中文,該怎麼辦?
其實答案也很簡單,中文不行,那就改用英文囉,直接使用群組套件的英文名稱 (Group Name) 或群組編號 (Group ID)。
就可以直接用英文來操作了。
小技巧
這也算不上奇技淫巧,也就是久病成良醫而已。
自動回答 YES
覺得還要手動輸入 y 太麻煩?加上「-y 」選項就行了。
不要自動升級核心 (Kernel)
在想排除的每一個套件庫設定檔裡面,加上「exclude=kernel kernel-source」就可以了。當然也可以把其他想排除的套件名稱加上去。
怎麼樣從套件庫下載 RPM 檔
安裝 YUM 的工具。sudo yum -y install yum-utils
就可以從套件庫下載 RPM 檔案而不須安裝或更新了。
yumdownloader PACKAGES_NAME
暫時啟用或停用指定的套件庫
加上「--enablerepo=REPO_NAME」選項,指定要暫時啟用的套件庫名稱即可。暫時停用就請比照辦理,加上「--disablerepo=REPO_NAME」。
連線錯誤怎麼辦
偶爾我們會看到套件庫連線失敗 (Failed) 的訊息,只要不是我們網路連線的問題,YUM 會自動尋找其他可用的鏡像分流站台去下載。如果沒有其他鏡像站的話,那就只好乖乖的等主站台回復了 ... (默)
請給我 Doraemon 的時光機,回到過去
配合 history 指令,再參考 RHEL 7 System Administrator's Guide - WORKING WITH TRANSACTION HISTORY 的教學,或許就有機會可以進行還原了。參考資料
- YUM FAQ
- RHEL 7 System Administrator's Guide - CHAPTER 7. YUM
- 鳥哥的 Linux 私房菜 - 第二十二章、軟體安裝 RPM, SRPM 與 YUM
圖片來源
- https://visualhunt.com/
- http://thomas-kurniawan.blogspot.tw/2012/04/disney-princess-celebrity-mulan.html
更新紀錄
- 2016/09/26 撰文。
0 意見 :
張貼留言