展源配置實(shí)戰(zhàn)指南)
很多人第一次接觸 CentOS 7 時(shí)最先面對(duì)的問(wèn)題往往不是系統(tǒng)本身而是yum裝包時(shí)的那個(gè)“轉(zhuǎn)圈”。明明軟件源已經(jīng)默認(rèn)配置好了裝個(gè)小工具卻慢到懷疑人生甚至?xí)苯訄?bào)錯(cuò)Could not resolve host、404、Public key not installed一個(gè)個(gè)看著就頭疼。其實(shí)這類(lèi)問(wèn)題十有八九出在倉(cāng)庫(kù)repo源上。CentOS 7 默認(rèn)的軟件源指向國(guó)外網(wǎng)絡(luò)狀況稍差一點(diǎn)下載元數(shù)據(jù)和 RPM 包就會(huì)變得又慢又不穩(wěn)定。更麻煩的是 CentOS 7 的生命周期已經(jīng)走完官方源整體遷移到了歸檔目錄老機(jī)器如果不去調(diào)整源地址連yum update都可能直接失敗。這篇文章就來(lái)完整梳理一下CentOS 7 下yum的正確用法以及如何把默認(rèn)源換成國(guó)內(nèi)鏡像再把 EPEL 擴(kuò)展源裝好。里面會(huì)穿插一些我實(shí)際踩過(guò)的坑、繞過(guò)的彎子也有可以直接抄走的命令和倉(cāng)庫(kù)配置適合剛?cè)腴T(mén)的運(yùn)維新手也適合經(jīng)常被“基礎(chǔ)環(huán)境”拖后腿的老手。1. 為什么先要理解 yum 和倉(cāng)庫(kù)的工作方式1.1 yum 不只是“裝軟件”的命令很多教程喜歡把yum install講成一個(gè)簡(jiǎn)單的動(dòng)作但它的背后其實(shí)是一套“元數(shù)據(jù)解析 依賴(lài)解決 事務(wù)處理”的流程。指令里的install只是入口真正干活的是倉(cāng)庫(kù)里一堆.xml元數(shù)據(jù)文件它們記錄了軟件包的名稱(chēng)、版本、依賴(lài)關(guān)系、校驗(yàn)信息以及 RPM 包的下載地址。搞懂這一點(diǎn)特別重要因?yàn)槟愫罄m(xù)遇到的大部分故障本質(zhì)上都是在“元數(shù)據(jù)獲取”或“依賴(lài)解析”環(huán)節(jié)掛掉的。比如yum update時(shí)報(bào)404往往不是你的命令有問(wèn)題而是倉(cāng)庫(kù)的baseurl地址已經(jīng)失效再比如yum install時(shí)提示依賴(lài)沖突可能是因?yàn)橥瑫r(shí)啟用了多個(gè)倉(cāng)庫(kù)而不同的倉(cāng)庫(kù)對(duì)同一個(gè)軟件包提供了不同版本。倉(cāng)庫(kù)文件通常放在/etc/yum.repos.d/目錄下擴(kuò)展名必須是.repo例如常見(jiàn)的CentOS-Base.repoCentOS 基礎(chǔ)軟件源默認(rèn)自帶。epel.repoEPEL 擴(kuò)展源通常需要額外安裝或手動(dòng)創(chuàng)建。CentOS-SCLo-scl.repo軟件集合源用于安裝比較新版本的開(kāi)發(fā)工具。全局配置在/etc/yum.conf里包含keepcache、gpgcheck、cachedir這些參數(shù)。如果你想調(diào)整默認(rèn)的緩存保留策略、簽名校驗(yàn)行為就直接改這個(gè)文件。我建議剛接觸的人把/etc/yum.repos.d/和/etc/yum.conf的關(guān)系理解成“菜單”和“用餐規(guī)則”的關(guān)系菜單決定你能點(diǎn)什么用餐規(guī)則決定怎么上菜、要不要驗(yàn)菜。1.2 一個(gè)軟件包從配置到落地的完整流程當(dāng)我們執(zhí)行yum install nginx時(shí)正常情況下會(huì)經(jīng)歷這樣幾步讀取/etc/yum.repos.d/下所有倉(cāng)庫(kù)配置。開(kāi)啟makecache或使用已經(jīng)緩存的元數(shù)據(jù)確定nginx在哪個(gè)倉(cāng)庫(kù)存在。解析依賴(lài)樹(shù)把nginx依賴(lài)的所有.so庫(kù)或子包找齊。下載 RPM 包到緩存目錄默認(rèn)是/var/cache/yum/。根據(jù)gpgcheck1校驗(yàn)包簽名。進(jìn)入事務(wù)處理先安裝依賴(lài)包再安裝主包整個(gè)過(guò)程記錄在 yum history 里。過(guò)程中任何一個(gè)環(huán)節(jié)出問(wèn)題都會(huì)被 yum 中止。這也是 yum 相比直接rpm -ivh的最大優(yōu)勢(shì)它的依賴(lài)解決能力能把一長(zhǎng)串軟件包按順序裝好并確保不沖突。不過(guò)依賴(lài)解決同樣會(huì)帶來(lái)問(wèn)題比如某個(gè)倉(cāng)庫(kù)的元數(shù)據(jù)已經(jīng)過(guò)時(shí)yum 就會(huì)基于錯(cuò)誤的依賴(lài)關(guān)系去做判斷進(jìn)而報(bào)出“找不到包”或“依賴(lài)缺失”。所以在換完源之后第一時(shí)間執(zhí)行yum clean all和yum makecache是必須的這相當(dāng)于更新菜單讓 yum 從頭開(kāi)始認(rèn)識(shí)倉(cāng)庫(kù)里的東西。1.3 倉(cāng)庫(kù)優(yōu)先級(jí)、啟停和過(guò)濾機(jī)制CentOS 7 默認(rèn)沒(méi)有安裝 priority 插件多個(gè)倉(cāng)庫(kù)同時(shí)啟用時(shí)yum 按照倉(cāng)庫(kù) ID 的字母順序和cost參數(shù)來(lái)決定優(yōu)先級(jí)。如果你同時(shí)啟用了 base 和 epel而兩個(gè)倉(cāng)庫(kù)都提供了同一個(gè)軟件包yum 的行為可能和你想的不太一樣。這個(gè)時(shí)候不要慌有兩種處理思路安裝yum-plugin-priority然后給不同倉(cāng)庫(kù)配置priority1、priority2讓 base 優(yōu)先。不啟用修改優(yōu)先級(jí)而是用--disablerepoepel、--enablerepoepel這類(lèi)參數(shù)臨時(shí)控制倉(cāng)庫(kù)啟停。倉(cāng)庫(kù)配置里還有兩個(gè)很實(shí)用的過(guò)濾項(xiàng)exclude排除某些包。比如excludekernel*可以避免誤更新內(nèi)核。includepkgs白名單只允許安裝指定的包。日常使用中我很少在/etc/yum.conf里改太多東西更多是臨時(shí)用命令參數(shù)控制倉(cāng)庫(kù)畢竟全局配置一旦寫(xiě)錯(cuò)影響面是整個(gè)系統(tǒng)的裝包流程。2. 把默認(rèn) yum 源換成阿里云鏡像這一步怎么操作2.1 這一步到底解決了什么問(wèn)題CentOS 7 默認(rèn)的 base 倉(cāng)庫(kù)地址是mirrorlist.centos.org系統(tǒng)啟動(dòng)后會(huì)從 mirrorlist 跳轉(zhuǎn)到某個(gè)實(shí)際服務(wù)器。對(duì)于海外業(yè)務(wù)這樣做沒(méi)問(wèn)題但在國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境下下載元數(shù)據(jù)的速度經(jīng)常只有幾十 KB/s執(zhí)行一次makecache能等上好幾分鐘。更有意思的是CentOS 7 進(jìn)入 EOL 狀態(tài)后官方倉(cāng)庫(kù)內(nèi)容被轉(zhuǎn)移到vault.centos.org這類(lèi)歸檔目錄舊的鏡像地址會(huì)逐漸失效。即使你的網(wǎng)絡(luò)能正常連接境外服務(wù)器也可能拿到一個(gè)已經(jīng)“停止更新”的倉(cāng)庫(kù)地址。把源換成國(guó)內(nèi)鏡像不只是為了快更是為了保證倉(cāng)庫(kù)路徑仍然有效。這里我說(shuō)一句換源最核心的改動(dòng)就是把.repo文件里的baseurl或mirrorlist指向國(guó)內(nèi)鏡像比如阿里云的鏡像源地址。因?yàn)榘⒗镌歧R像會(huì)在其服務(wù)器上同步 CentOS 7 的倉(cāng)庫(kù)結(jié)構(gòu)并在原官方退役后繼續(xù)維護(hù)歸檔路徑所以用起來(lái)更省心。2.2 先備份再動(dòng)手換源操作雖然不復(fù)雜但建議先備份原來(lái)的倉(cāng)庫(kù)文件。我見(jiàn)過(guò)不少人在改配置時(shí)刪掉了默認(rèn)源又沒(méi)留備份最后遇到問(wèn)題想回退卻找不到原始文件只能去網(wǎng)上重新找一份。比較穩(wěn)妥的做法是mkdir -p /root/repo_backup cp -a /etc/yum.repos.d/*.repo /root/repo_backup/然后用一條命令清空默認(rèn)倉(cāng)庫(kù)文件避免新舊配置混雜。我不建議用rm -rf /etc/yum.repos.d/把所有文件都刪光因?yàn)橛行C(jī)器上可能預(yù)置了其他必須的倉(cāng)庫(kù)比如云廠商自帶的內(nèi)部倉(cāng)庫(kù)刪掉會(huì)影響后續(xù)系統(tǒng)初始化。你可以這樣處理rm -f /etc/yum.repos.d/CentOS-*這條命令只刪除 CentOS 開(kāi)頭的倉(cāng)庫(kù)配置其他自定義倉(cāng)庫(kù)會(huì)保留下來(lái)。2.3 手工寫(xiě) repo 文件而不是盲目下載腳本很多教程喜歡用一條命令直接拉取網(wǎng)上現(xiàn)成的.repo文件例如curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.example.com/repo/CentOS-7.repo這個(gè)方法能用但我不建議新手直接復(fù)制。因?yàn)椴煌R像站對(duì)倉(cāng)庫(kù)路徑的組織方式可能不同而且網(wǎng)上流傳的 repo 文件經(jīng)常出現(xiàn)參數(shù)遺漏比如沒(méi)有g(shù)pgkey或者把enabled0誤寫(xiě)成enabled1。更穩(wěn)妥的方式是自己手工創(chuàng)建一個(gè)標(biāo)準(zhǔn) repo 文件理解每一行是什么意思。創(chuàng)建一個(gè)/etc/yum.repos.d/CentOS-Base.repo內(nèi)容可以這樣寫(xiě)[base] nameCentOS-7 - Base baseurlhttp://mirrors.aliyun.com/centos/7/os/x86_64/ gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [updates] nameCentOS-7 - Updates baseurlhttp://mirrors.aliyun.com/centos/7/updates/x86_64/ gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [extras] nameCentOS-7 - Extras baseurlhttp://mirrors.aliyun.com/centos/7/extras/x86_64/ gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7這里有幾個(gè)細(xì)節(jié)要注意baseurl是實(shí)際使用的下載地址mirrorlist是動(dòng)態(tài)獲取鏡像列表的服務(wù)地址。換國(guó)內(nèi)鏡像時(shí)應(yīng)該把原來(lái)的mirrorlist注釋掉只保留baseurl否則 yum 依然會(huì)先去請(qǐng)求 mirrorlist 服務(wù)速度并沒(méi)有得到優(yōu)化。gpgcheck1表示開(kāi)啟 GPG 簽名校驗(yàn)。對(duì)應(yīng)的gpgkey一定不能填錯(cuò)否則裝包時(shí)會(huì)報(bào) “Public key ... is not installed”。如果機(jī)器只有 Intel/AMD 架構(gòu)x86_64可以保留如果是 ARM 或其他架構(gòu)需要改成對(duì)應(yīng)的架構(gòu)目錄例如aarch64。2.4 配置完成后驗(yàn)證倉(cāng)庫(kù)狀態(tài)寫(xiě)完 repo 文件后先不要急著安裝軟件先做一次完整的緩存更新和倉(cāng)庫(kù)列表檢查yum clean all yum makecache yum repolistyum clean all會(huì)清理舊的元數(shù)據(jù)緩存yum makecache會(huì)重新下載 base、updates、extras 三個(gè)倉(cāng)庫(kù)的元數(shù)據(jù)yum repolist會(huì)列出當(dāng)前所有啟用的倉(cāng)庫(kù)以及軟件包數(shù)量。正常情況下你會(huì)在輸出里看到類(lèi)似這樣的內(nèi)容repo id repo name status base/7/x86_64 CentOS-7 - Base 10072 extras/7/x86_64 CentOS-7 - Extras 526 updates/7/x86_64 CentOS-7 - Updates 1980status 的數(shù)字表示該倉(cāng)庫(kù)可用的軟件包數(shù)量。如果某個(gè)倉(cāng)庫(kù)顯示 0或者執(zhí)行過(guò)程中報(bào)404說(shuō)明baseurl路徑寫(xiě)錯(cuò)了回頭檢查一下鏡像站上對(duì)應(yīng)目錄是否存在。這時(shí)候測(cè)試安裝一個(gè)小工具會(huì)更直觀yum install -y tree如果你發(fā)現(xiàn)下載速度明顯變快說(shuō)明源已經(jīng)切換成功。3. EPEL 擴(kuò)展源的安裝與使用3.1 EPEL 是什么為什么 CentOS 自帶源里沒(méi)有EPEL 的全稱(chēng)是 Extra Packages for Enterprise Linux由 Fedora 社區(qū)維護(hù)可以理解成一個(gè)“企業(yè)級(jí) Linux 的第三方軟件包倉(cāng)庫(kù)”。它的目標(biāo)不是把 CentOS 官方倉(cāng)庫(kù)替換掉而是作為補(bǔ)充提供大量官方源里沒(méi)有的軟件包比如htop、jq、iftop、python36、nginx等。為什么 CentOS 7 默認(rèn)不帶這些包因?yàn)?CentOS 的定位是穩(wěn)定優(yōu)先版本迭代非常保守官方源只收錄與系統(tǒng)本身強(qiáng)相關(guān)的基礎(chǔ)組件。而 EPEL 收錄范圍更廣更新也更激進(jìn)但依然會(huì)保持與企業(yè)級(jí) Linux 的兼容性。所以常規(guī)做法是base EPEL 搭配使用基礎(chǔ)環(huán)境走官方源其他擴(kuò)展工具走 EPEL 源。3.2 方法一直接用 yum 安裝 epel-release推薦最簡(jiǎn)單的方式是直接安裝epel-release這個(gè)軟件包因?yàn)樗旧砭妥詭?EPEL 倉(cāng)庫(kù)配置和 GPG 公鑰文件。你需要先保證 base 源是可用的然后執(zhí)行yum install -y epel-release安裝完成后/etc/yum.repos.d/下會(huì)多出一個(gè)epel.repo文件。此時(shí)你可以檢查一下它的內(nèi)容cat /etc/yum.repos.d/epel.repo默認(rèn)的epel.repo很可能指向download.fedoraproject.org這個(gè)地址在部分地區(qū)訪問(wèn)速度不穩(wěn)定。所以我通常會(huì)在裝完epel-release之后順手把epel.repo里的地址替換成國(guó)內(nèi)鏡像。替換方法也不難sed -i s#^metalink#metalink#; s#^baseurl.*#baseurlhttp://mirrors.aliyun.com/epel/7/x86_64/# /etc/yum.repos.d/epel.repo不過(guò)我建議不要用 sed 一把梭因?yàn)椴煌姹镜膃pel.repo文件結(jié)構(gòu)不完全一樣還是打開(kāi)文件手動(dòng)修改更可靠。核心是把mirrorlist或metalink注釋掉然后把baseurl改成國(guó)內(nèi)鏡像路徑。3.3 方法二手工創(chuàng)建 epel.repo 文件如果你不想裝epel-release或者安裝時(shí)總被系統(tǒng)源問(wèn)題卡住可以直接手工創(chuàng)建/etc/yum.repos.d/epel.repo內(nèi)容如下[epel] nameEPEL for CentOS 7 - $basearch baseurlhttp://mirrors.aliyun.com/epel/7/x86_64/ enabled1 gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7然后導(dǎo)入 GPG 公鑰rpm --import http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7最后同樣執(zhí)行一次yum clean all yum makecache讓 yum 識(shí)別新的倉(cāng)庫(kù)。手工創(chuàng)建的好處是完全可控不會(huì)出現(xiàn)epel-release自帶的倉(cāng)庫(kù)地址和你的預(yù)期不一致的問(wèn)題缺點(diǎn)是你需要自己維護(hù)gpgkey一旦公鑰路徑寫(xiě)錯(cuò)安裝軟件時(shí)會(huì)報(bào)簽名校驗(yàn)失敗。3.4 同時(shí)啟用 base 和 EPEL 時(shí)該注意什么EPEL 倉(cāng)庫(kù)與官方倉(cāng)庫(kù)的軟件包存在重疊情況比如某些客戶(hù)端工具、開(kāi)發(fā)庫(kù)。如果你在執(zhí)行yum update時(shí)同時(shí)升級(jí)了兩個(gè)倉(cāng)庫(kù)里的同名軟件有可能把系統(tǒng)里某個(gè)包的版本“帶偏”。注意這里不是說(shuō) EPEL 會(huì)自動(dòng)覆蓋官方包而是在依賴(lài)解析時(shí)如果兩個(gè)倉(cāng)庫(kù)都滿(mǎn)足條件yum 會(huì)自行選擇一個(gè)來(lái)源。我個(gè)人有兩個(gè)習(xí)慣安裝第三方軟件時(shí)先用yum info看一下它來(lái)自哪個(gè)倉(cāng)庫(kù)。如果只想從官方倉(cāng)庫(kù)裝包用yum install --disablerepoepel 包名強(qiáng)制禁用 EPEL。需要長(zhǎng)期鎖定版本的時(shí)候可以安裝yum-plugin-versionlock插件yum install -y yum-plugin-versionlock yum versionlock add nginx這樣即使后續(xù)執(zhí)行yum update已鎖定的軟件也不會(huì)被隨意升級(jí)。4. yum 日常操作把這些命令吃透就夠了4.1 最常用的安裝、卸載、升級(jí)命令軟件包操作是 yum 中最常用的功能這里把命令按場(chǎng)景列一下方便對(duì)照使用。安裝一個(gè)包yum install -y 包名同時(shí)安裝多個(gè)包yum install -y 包1 包2本地 RPM 文件安裝yum localinstall -y ./xxx.rpm卸載一個(gè)包yum remove -y 包名升級(jí)所有可升級(jí)包yum update -y只升級(jí)特定包yum update -y 包名查看包信息yum info 包名搜索包yum search 關(guān)鍵詞查找某個(gè)文件或庫(kù)屬于哪個(gè)包yum provides */libxxx.so其中yum provides是非常容易被忽略的高頻命令。比如編譯程序時(shí)提示缺少某個(gè).so文件你又不知道它屬于什么包直接執(zhí)行yum provides */libssl.so.10yum 會(huì)告訴你是openssl-libs這個(gè)包提供的省得你去網(wǎng)上瞎猜。4.2 緩存清理的時(shí)機(jī)別一上來(lái)就 clean all網(wǎng)上很多建議一遇到 yum 卡頓就無(wú)腦執(zhí)行yum clean all這其實(shí)是把雙刃劍。清理緩存雖然能解決元數(shù)據(jù)“過(guò)期”的問(wèn)題但清理后首次yum install需要重新下載所有倉(cāng)庫(kù)的元數(shù)據(jù)反而更慢。正確的使用時(shí)機(jī)是更換軟件源之后。發(fā)現(xiàn)倉(cāng)庫(kù)元數(shù)據(jù)持續(xù)報(bào) 404 或大小對(duì)不上。國(guó)內(nèi)鏡像同步過(guò)程中出現(xiàn)緩存不一致。手動(dòng)編輯了 repo 文件或者添加了新倉(cāng)庫(kù)。日常系統(tǒng)的元數(shù)據(jù)其實(shí)可以保留緩存提高后續(xù)查詢(xún)速度。如果你想關(guān)掉緩存可以修改/etc/yum.conf里的keepcache0。注意keepcache0只是不保留已下載的 RPM 包元數(shù)據(jù)緩存仍然存在。有時(shí)候系統(tǒng)時(shí)間不準(zhǔn)確會(huì)導(dǎo)致 yum 緩存驗(yàn)證失敗。這屬于比較容易忽略的坑遇到Error: Cannot retrieve metalink for repository時(shí)可以先檢查一下date是不是差了好幾個(gè)小時(shí)再用ntpdate或chrony同步時(shí)間。4.3 用事務(wù)歷史回滾別慌yum 有一個(gè)很多人不知道的“后悔藥”功能那就是yum history。每次yum install、yum update、yum remove的操作都會(huì)記錄成一條事務(wù)歷史。通過(guò)下面的命令可以查看歷史yum history輸出結(jié)果里會(huì)有序號(hào)、操作時(shí)間、執(zhí)行動(dòng)作、涉及的軟件包數(shù)量。如果某次升級(jí)把系統(tǒng)搞掛了可以用yum history undo 7這里的7是歷史記錄的事務(wù) ID。undo會(huì)嘗試把這次事務(wù)做反向操作比如你之前升級(jí)了 A 包撤銷(xiāo)時(shí)會(huì)嘗試把 A 包降級(jí)回原來(lái)版本。它不是永遠(yuǎn)都能成功但大多數(shù)場(chǎng)景下比手工手動(dòng)降級(jí)靠譜得多。4.4 倉(cāng)庫(kù)啟停和組件安裝EPEL 源啟用后如果某次安裝只想臨時(shí)使用它可以這樣yum install --enablerepoepel -y htop如果想永久關(guān)閉某個(gè)倉(cāng)庫(kù)不建議直接刪文件用yum-config-manager更合適yum install -y yum-utils yum-config-manager --disable epel yum-config-manager --enable epel另外 CentOS 7 的 yum 還支持“按組安裝”的概念。查看可用的軟件組yum grouplist安裝某個(gè)組yum groupinstall Development Tools這個(gè)對(duì)于要搭開(kāi)發(fā)環(huán)境的機(jī)器非常省事一條命令能把編譯工具鏈、常用開(kāi)發(fā)庫(kù)全部裝好不需要手動(dòng)一個(gè)個(gè)去搜包名。5. 踩坑實(shí)錄換源和裝包最容易翻車(chē)的幾個(gè)地方5.1 CentOS 7 源失效后的結(jié)構(gòu)調(diào)整這是近幾年最典型的坑。CentOS 7 的生命周期結(jié)束后官方把軟件包挪到了vault.centos.org很多舊鏡像站的路徑結(jié)構(gòu)依然保留著7/os/x86_64/但內(nèi)容可能已經(jīng)不再更新甚至部分鏡像已經(jīng)只保留歸檔路徑。如果你在換源后執(zhí)行yum update得到大量404不妨先到鏡像站上看一下目錄結(jié)構(gòu)。有些國(guó)內(nèi)鏡像為了兼容舊系統(tǒng)會(huì)額外提供一個(gè)類(lèi)似/centos-vault/的目錄地址長(zhǎng)這樣http://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/如果你的系統(tǒng)已經(jīng)無(wú)法正常拿到 CentOS 7 基礎(chǔ)源可以考慮把baseurl指向centos-vault下的具體小版本路徑。不過(guò)這屬于應(yīng)急手段盡量保證你用的系統(tǒng)版本和目錄里的版本一致否則不同小版本間的軟件包可能不完全匹配。5.2 最常見(jiàn)的報(bào)錯(cuò)信息排障表碰上 yum 報(bào)錯(cuò)第一件事不是重裝系統(tǒng)而是分清楚錯(cuò)誤出現(xiàn)在哪一層。我把常見(jiàn)錯(cuò)誤和對(duì)應(yīng)的排查方向整理成了表格方便對(duì)照。報(bào)錯(cuò)信息類(lèi)型可能原因排查動(dòng)作Could not resolve host: mirrors.xxx.comDNS 解析失敗檢查/etc/resolv.conf試一下ping mirrors.aliyun.com[Errno 14] HTTP Error 404倉(cāng)庫(kù)路徑不存在或鏡像結(jié)構(gòu)變了打開(kāi)瀏覽器訪問(wèn)baseurl確認(rèn)目錄結(jié)構(gòu)[Errno 14] curl#7 - Failed to connect到鏡像站的網(wǎng)絡(luò)不通檢查防火墻、代理、出口網(wǎng)絡(luò)Public key for xxx.rpm is not installedGPG 公鑰缺失執(zhí)行rpm --import gpgkey地址或檢查gpgcheckCannot retrieve metalink for repositorymetalink地址不可達(dá)把metalink注釋掉啟用baseurlAnother app is currently holding the yum lock有其他 yum 進(jìn)程在運(yùn)行等一會(huì)再試不要隨意kill -9其中“Another app is currently holding the yum lock”是新手最常嚇一跳的提示它其實(shí)不是系統(tǒng)損壞只是 yum 用鎖文件防止多個(gè)進(jìn)程同時(shí)操作 RPM 數(shù)據(jù)庫(kù)。你可以用ps aux | grep yum檢查也可以看/var/run/yum.pid。如果確認(rèn)沒(méi)有其他進(jìn)程只是殘留的鎖文件導(dǎo)致的問(wèn)題刪掉對(duì)應(yīng) pid 文件再重試即可。5.3 保持系統(tǒng)健康的一些習(xí)慣我要特別強(qiáng)調(diào)下面的幾個(gè)習(xí)慣它們是長(zhǎng)期實(shí)踐中相對(duì)穩(wěn)妥的做法不要把gpgcheck1隨手改成gpgcheck0尤其在系統(tǒng)無(wú)法導(dǎo)入公鑰時(shí)很多人的第一反應(yīng)是去掉校驗(yàn)。這樣做雖然能裝進(jìn)去但沒(méi)有了簽名校驗(yàn)等于放棄了 RPM 包的完整性驗(yàn)證。寧可花 10 分鐘把公鑰導(dǎo)入流程走完也不要省這個(gè)步驟。還有一點(diǎn)不要把/etc/yum.repos.d/下所有文件都刪除。有些安全軟件源、云廠商內(nèi)部源被刪掉后后續(xù)系統(tǒng)初始化會(huì)直接失敗。正確做法是保留其他倉(cāng)庫(kù)只用修改默認(rèn)源的方式調(diào)整優(yōu)先級(jí)。另外yum clean all和yum makecache不要每次執(zhí)行升級(jí)前都跑一遍除非你真的切換了鏡像源。否則頻繁清理緩存只會(huì)讓每次安裝變得額外漫長(zhǎng)。真正值得定期做的是yum update之前先看一下yum repolist是否正常以及磁盤(pán)空間是否足夠。畢竟/var/cache/yum占滿(mǎn)磁盤(pán)的情況也偶有發(fā)生。6. 最后的實(shí)操心得我自己處理過(guò)不少 CentOS 7 的環(huán)境有剛裝完的新機(jī)器也有跑了幾年沒(méi)動(dòng)過(guò)的老系統(tǒng)。這類(lèi)機(jī)器最常見(jiàn)的故障基本都和軟件源有關(guān)不是源失效就是倉(cāng)庫(kù)沖突。所以我的習(xí)慣是拿到一臺(tái) CentOS 7 機(jī)器第一件事不是急著裝軟件而是先清理倉(cāng)庫(kù)配置確認(rèn)官方三個(gè)基礎(chǔ)源和一個(gè) EPEL 源的狀態(tài)再執(zhí)行一次完整的makecache。換源這件事雖然看起來(lái)只是改幾個(gè) URL但真正影響體驗(yàn)的是細(xì)節(jié)是否注釋了mirrorlistgpgkey的路徑是否正確baseurl末尾的架構(gòu)目錄是否和系統(tǒng)架構(gòu)匹配。哪怕是少一個(gè)/yum 都會(huì)給你一記響亮的404。另外建議你把換源的流程封裝成一個(gè)冪等腳本放到自己的工具庫(kù)里面。腳本里先檢查/etc/os-release再備份舊配置然后寫(xiě)入鏡像源和 EPEL 源最后統(tǒng)一清理緩存并更新。這樣不管你以后遇到多少臺(tái)機(jī)器都能在 1 分鐘內(nèi)把源和環(huán)境理順。CentOS 7 已經(jīng)進(jìn)入維護(hù)晚期但這套思路放到其他使用 yum 的發(fā)行版上依然成立。只要理解了倉(cāng)庫(kù)和元數(shù)據(jù)的邏輯換什么源都不會(huì)再讓你頭疼。