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