[CentOS 7] 手機能用 App Store、Google Play 裝 App 不稀奇,我們也有 YUM 來裝套件

by 10月 03, 2016 0 意見        

在 Windows 要安裝一個軟體,有時沒辦法一次搞定,一下子要 .Net Framework,一下子又是 Direct-X,搞不好還有 Flash Player、Java Runtime、Visual C Runtime、Visual C++ Runtime 在等著我們。

明明都是要安裝,為什麼在 iOS 跟 Android 上安裝 App 那麼簡單?!

等一下!這件事跟 CentOS 什麼關係?
不要以為扯上它們兩個就可以衝高瀏覽率哦~~~ (華生,你突破盲腸了 XD)

它們的關係可大著呢!
因為 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 來處理就對了。

那麼,YUM 在我們下指令的時候,到底做了哪些事情呢?
  1. 從本機的套件庫設定檔裡讀取連結位址,開始連線到套件庫去。
  2. 連上之後,取得 標頭檔 (Headers),進行比對並取得最新的資訊。
  3. 分析使用者的指令,像是安裝、更新、移除、查詢 ... 等動作。
  4. 從套件庫下載所有必要的檔案,再依指令、參數、選項的要求開始執行。

套件庫


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

顯示最近一週內安裝的套件 (絕對不是晚七天回家的意思 ... XD)。
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 的教學,或許就有機會可以進行還原了。


參考資料

圖片來源
  • https://visualhunt.com/
  • http://thomas-kurniawan.blogspot.tw/2012/04/disney-princess-celebrity-mulan.html

更新紀錄
  • 2016/09/26 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言