一、背景介紹
2024 年 7 月 1 日,在編譯基於 CentOS 7.6.1810 映象的 Dockerfile 過程中,執行 yum install 指令時,遇到了錯誤:Could not resolve host: mirrorlist.centos.org; Unknown error
。
特別指出: 編譯 Dockerfile 並執行其中的 yum install 指令時,所使用的是正在編譯的映象中的 yum 倉庫,非編譯機上的。
二、原因分析
2024 年 7 月 1 日 官方停止維護 CentOS 7。該系統內建的 yum.repo 所使用的域名 mirrorlist.centos.org 已不再提供 A 記錄。如下所示:
root@93b1bbdc2e60:/home/# dig mirrorlist.centos.org +trace
; <<>> DiG 9.16.1-Ubuntu <<>> mirrorlist.centos.org +trace
;; global options: +cmd
. 0 IN NS c.root-servers.net.
. 0 IN NS i.root-servers.net.
## 省略:根和頂級域名伺服器的相關解析
centos.org. 3600 IN NS ns1.centos.org.
centos.org. 3600 IN NS ns2.centos.org.
gdtpongmpok61u9lvnipqor8lra9l4t0.org. 3600 IN NSEC3 1 1 0 332539EE7F95C32A GDTREA8KMJ2RNEQEN4M2OGJ26KFSUKJ7 NS SOA RRSIG DNSKEY NSEC3PARAM
qeunu2n7u9cespp9113b9aougs8bsje9.org. 3600 IN NSEC3 1 1 0 332539EE7F95C32A QEUO6270NIE81LB4QN59HMMDKF8L01MV NS DS RRSIG
gdtpongmpok61u9lvnipqor8lra9l4t0.org. 3600 IN RRSIG NSEC3 8 2 3600 20240730022208 20240709012208 36783 org. SJRvhqxd780LYLBKJvh+HK1XHVN4Jm3FReq030r3Aewe0Sus1xpbl7L9 xOJOudja1lZoBdgfVXFBQT4Ev9M6XSG6c9qYJvDT9Q9U8PQyG+KDGGTy zTNgK1QFgFM7Sq1DPiqeUc5Jc/mmD7H26TV2qrCem4Fz8/TYYlK9CirT VKU=
qeunu2n7u9cespp9113b9aougs8bsje9.org. 3600 IN RRSIG NSEC3 8 2 3600 20240722152150 20240701142150 36783 org. wq21TFtc5dCtXghEDYN+dJLnZUiJzzcoVLIWQ2aA5FCIV/pHKfUPg7Mn jXjOGMK5Xx8lu7gBjdKvu7yQaVrlEJXC0wo8QqzlrB/yL6EcBhypBfNk b+vH7RCfrfOsIqwMKCv82wF91/S4/3uVijxeD2F+nEjvPLJheRQcxQR1 r/g=
;; Received 619 bytes from 199.249.120.1#53(b2.org.afilias-nst.org) in 179 ms
centos.org. 3600 IN SOA ns1.centos.org. hostmaster.centos.org. 2024070401 28800 7200 2400000 3600
;; Received 129 bytes from 38.145.60.38#53(ns2.centos.org) in 269 ms
dig 命令詳解,可參閱我的文章:DNS 簡介及 dig 命令詳解 。
三、解決方案
1. 最佳方案 - 更新及啟用 CentOS-Vault.repo 存檔倉庫
(1)背景介紹
CentOS-Vault.repo 是 CentOS 發行版中自帶的一個 YUM 軟體倉庫。它定義了一系列舊版本的軟體包和更新,這些軟體包和更新不再由 CentOS 專案的主要倉庫維護。當 CentOS 釋出新的版本(例如,從 CentOS 7.4 升級到 CentOS 7.5)時,舊版本的軟體包通常會被移動到 Vault 倉庫中。vault.centos.org 是 CentOS-Vault.repo 關聯的倉庫站點,主要功能包括:
-
儲存舊版本的 CentOS 系統包:當 CentOS 釋出新的主版本或更新時,舊版本的 ISO 映像檔案、軟體包和原始碼會被移動到這個存檔站點。
-
儲存歷史軟體包:使用者可以瀏覽和下載舊版本 CentOS 中的軟體包,這對於執行舊軟體或維護遺留系統可能非常有用。
因此,啟用 CentOS-Vault.repo 並將倉庫站點配置為 vault.centos.org 是 CentOS 內建的處理預案及最佳方案。
(2)配置操作
在 CentOS-Vault.repo 新增如下配置,以啟用 CentOS 7 的存檔倉庫,新增配置如下:
# 檔案路徑 /etc/yum.repos.d/CentOS-Vault.repo
# Vault
[Vault-base]
name=Vault - CentOS-$releasever - Base
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
[Vault-updates]
name=Vault - CentOS-$releasever - Updates
baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
[Vault-extras]
name=Vault - CentOS-$releasever - Extras
baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
使用 enabled=0
禁用 CentOS-Base.repo 中的所有倉庫,修改後配置如下:
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 下同
特別說明: CentOS 7 各子版本中,$releasever 值都為 7。具體原因請看:releaseve 變數詳解。
清除 YUM 快取,如有需要可再生成新的快取
yum clean all ; yum makecache
(3)驗證方法
首先,使用 yum repolist
驗證可用倉庫,結果如下:
[root@93b1bbdc2e60 /]# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
repo id repo name status
!Vault-base/7/x86_64 Vault - CentOS-7 - Base 10,072
!Vault-extras/7/x86_64 Vault - CentOS-7 - Extras 526
!Vault-updates/7/x86_64 Vault - CentOS-7 - Updates 6,173
repolist: 16,771
驗證結果說明:
(1)repolist: 16,771 表示當前所有已啟用的倉庫中,總共有 16,771 個可用的軟體包,各倉庫的 status 表示其倉庫可用包的數量。
(2)repo id 新增 !字首表示該倉庫的後設資料已經被成功下載並快取到本地(執行了yum makecache)。這個標記意味著 YUM 已經有了這個倉庫的所有必要資訊,可以進行包的安裝、更新和依賴性解析等操作。
其次,要求安裝包正常,如執行 yum install lrzsz -y
正常。
2. 臨時方案一 - 更新 CentOS 倉庫配置
(1)配置操作
啟用 *.repo 中的 baseurl,註釋 mirrorlist,將 baseurl 倉庫地址替換為 vault.centos.org 存檔站點。具體操作如下:
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo
sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo
清除 YUM 快取,如有需要可再生成新的快取
yum clean all ; yum makecache
(2)驗證方法
同 最佳方案-更新及啟用 CentOS-Vault.repo 存檔倉庫 ->(3) 驗證方法 。
3. 臨時方案二 - 基礎倉庫替換為阿里雲倉庫
將 CentOS 7 基礎倉庫修改為阿里雲倉庫,具體操作如下:
(1)首先,備份 CentOS 7 基礎倉庫配置檔案
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
(2)然後,下載阿里雲倉庫配置檔案,並替換系統內建基礎倉庫(CentOS-Base.repo)配置檔案
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/CentOS-7.repo
(3)清除 YUM 快取,如有需要可再生成新的快取
yum clean all ; yum makecache
(4)驗證方法
同 最佳方案-更新及啟用 CentOS-Vault.repo 存檔倉庫 ->(3) 驗證方法 。
四、背景知識
1. 簡介 CentOS 7 內建的各類倉庫
CentOS-Base.repo:這是 CentOS 的基礎倉庫,包含了大部分使用者安裝軟體時需要的包。
CentOS-CR.repo:CR 倉庫包含了新的 CentOS 點版本釋出後,下一個版本在釋出前的一些新的更新和改進。
CentOS-Debuginfo.repo:這個倉庫包含了用於除錯的包,一般使用者不會使用到。
CentOS-fasttrack.repo:FastTrack 倉庫包含了一些新的,可能不完全穩定的包。這些包是為了提供一些新功能而提前釋出的。
CentOS-Media.repo:這個倉庫是用於從 CD 或者 DVD 安裝包的。
CentOS-Sources.repo:這個倉庫包含了一些軟體的原始碼包。
CentOS-Vault.repo:Vault 倉庫包含了舊的,不再被維護的版本的包。
預設情況下,僅啟用 CentOS-Base.repo 中的 base、updates 和 extras 倉庫,可以透過 yum repolist
檢視
2. *.repo 檔案中各變數說明
在 repo 檔案中,$releasever
,$basearch
,$infra
是預定義的變數,在解析 repo 檔案時被替換為具體的值。
(1)$releasever:代表你的系統版本。
[root@774ea9a9b006 yum.repos.d]# rpm -q --qf "%{VERSION}" $(rpm -q --whatprovides redhat-release)
7
(2)$basearch:代表你的系統架構。
[root@774ea9a9b006 yum.repos.d]# arch
x86_64
# 或
[root@774ea9a9b006 yum.repos.d]# uname -i
x86_64
(3)$infra
:代表你的系統基礎架構,如虛擬機器或物理機。這個變數通常在 /etc/yum/vars/infra
檔案中定義,但並非所有系統都有這個檔案。你可以透過檢視這個檔案獲取,如果檔案不存在,那麼 $infra
可能會被替換為預設值或空字串。
[root@774ea9a9b006 yum.repos.d]# cat /etc/yum/vars/infra
container
3. $releaseve 變數詳解
$releasever
是 CentOS 中的一個變數,它的值來自 /etc/yum.conf
檔案中的 distroverpkg
引數。預設情況下,distroverpkg
的值是 centos-release
,這是一個包含有關 CentOS 發行版的資訊的包。
當你執行 yum
命令時,yum
會查詢 distroverpkg
包並從中提取發行版號。在 CentOS 7 中,centos-release
包的版本號是 7.x.y
,但 yum
只提取主版本號,也就是 7
,因此 $releasever
的值是 7
。
這是因為 CentOS 的軟體源是按主版本號組織的,所有 7.x.y 的版本都使用相同的軟體源,所以 $releasever
只需要主版本號。
4. *.repo 配置檔案中的引數 mirrorlist 與 baseurl 的區別
在 CentOS 的 YUM 倉庫配置檔案中,mirrorlist
和 baseurl
是兩個常見的引數,它們用於指定軟體包倉庫的位置。以下是它們的區別:
(1)mirrorlist
定義:mirrorlist
引數指定了一個 URL,該 URL 返回一個包含多個倉庫站點的列表。
用途:YUM 客戶端會從這個列表中選擇一個可用、合適的倉庫站點進行連線和下載軟體包。
優點:提供了更高的可用性、高速度和負載均衡的倉庫站點,如果一個倉庫站點不可用,YUM 可以自動切換到另一個倉庫站點。
示例:
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
(2)baseurl
定義:baseurl
引數直接指定了一個單一的倉庫站點。
用途:YUM 客戶端會直接連線到這個指定的 URL 進行軟體包的下載。
優點:配置簡單,適用於有特定需求的場景,比如內部私有倉庫。
示例:
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
(3)總結
mirrorlist
提供了一個映象列表,YUM 會自動選擇一個可用的倉庫站點進行包的下載,適用於希望自動負載均衡、高效能和高可用性的場景。
baseurl
直接指定了一個固定的倉庫站點,適用於需要特定倉庫的場景。
五、引文
(1)mirrorlist.centos.org no longer resolve?