使用方法
一鍵執行命令#
使用幫助
選項卡分別代表腳本內建軟體源(鏡像站)類型和獲取腳本途徑,請在使用前檢查目標鏡像站是否支援你所使用的作業系統,可以在軟體源列表中查看。
預設自動備份原有軟體源內容,如需了解更多請翻閱下方文件。若使用過程中的某些選項令你疑惑不解,那麼在選擇軟體源後一路回車即是最佳實踐。
支援在系統原有軟體源損壞、缺失、無效等異常環境下使用,無需額外安裝任何依賴。
關於軟體源的選擇(新用戶必讀)
如果你不了解這些鏡像站,那麼建議使用 阿里雲 (相容性高、可用性強) 或 中國科學技術大學 (速度快),請不要陷入測速焦慮,內建的軟體源一般不會有太大的差異。
本專案腳本是一個自動化維運工具,不會對鏡像站進行主觀的優劣排序和客製化適配,使用者的選擇應該是自由的,這也是為了開源軟體精神能夠得到更好的延續。
-
需要
ROOT權限
請使用
root帳戶執行本腳本,切換指令為sudo -i或su root,不同系統使用的指令不同。另外注意不要透過sudo直接執行一鍵指令例如sudo bash <(xxx)。 -
建議使用現代化的
SSH用戶端應用
如果系統命令列介面的中文顯示亂碼,將導致無法查看互動內容,此外部分系統 GUI 圖形介面的終端應用可能存在一些無法預料的顯示問題。部分系統會自動開啟 SSH 服務,否則請參考開啟方法。
-
如果是在新裝系統上首次執行腳本
目前依賴
curl指令取得腳本內容,但部分作業系統未預先安裝此軟體包,將會報錯Command not found,安裝方法詳見下方 關於報錯 Command not found。腳本本身與curlwget指令無關,不會下載任何內容。 -
腳本運行期間需要互動選擇配置
請透過方向鍵 UpDownLeftRight 或 WASD 控制選項並按 Enter 回車鍵確認。如果發現互動異常請改變終端軟體的視窗大小後重試,避免視窗鋪滿全螢幕。
常見問題#
-
關於報錯 Command not found#
此報錯是由於系統沒有安裝
curl軟體包導致,安裝命令如下DebianUbuntuKaliLinux MintDeepinZorin OSArmbianProxmox VERaspberry Pi OSopenKylin新裝系統需要先執行一遍更新
apt-get updateRed Hat Enterprise LinuxCentOSRocky LinuxAlmaLinuxFedoraopenEulerOpenCloudOSAnolis OS安裝不上? (點擊展開查看其它解決方法)
假如系統原有軟體源是無效的導致安裝不上
curl軟體包,那麼對於 Linux 初學者來說可能會比較麻煩,這裡提供幾個在線獲取腳本的應急方法適用於大部分作業系統(
Alpine Linux除外),python3要是不存在那就再試試python指令如果可以訪問系統 GUI 映像介面和桌面的話那可以直接在瀏覽器中開啟連結下載腳本,許多系統都會預先安裝 Firefox 火狐瀏覽器
之後再執行腳本即可
如果以上方法試了都不行,那就複製原始碼至本地新建任意名稱的
.sh腳本,貼上原始碼內容後透過bash指令手動執行。 -
備份原有軟體源#
腳本會自動備份原有軟體源內容,備份路徑為原始文件或目錄的絕對路徑加上
.bak後綴,例如/etc/apt/sources.list => /etc/apt/sources.list.bak,檢查已存在備份內容時會詢問是否覆蓋備份。 -
還原已備份的軟體源#
點擊展開查看
DebianUbuntuKaliLinux MintDeepinZorin OSArmbianProxmox VERaspberry Pi OSopenKylinRed Hat Enterprise LinuxCentOSRocky LinuxAlmaLinuxFedoraopenEulerOpenCloudOSAnolis OS -
關於開啟 SSH 遠端登入的方法#
點擊展開查看
指令以及設定步驟僅供參考,注意靈活變通
-
驗證是否已安裝
SSH服務如果沒有這個資料夾說明系統未安裝
SSH服務,你需要透過套件管理工具安裝openssh-server軟體包,安裝指令如下:DebianUbuntuKaliLinux MintDeepinZorin OSArmbianProxmox VERaspberry Pi OSopenKylin新裝系統需要先執行一遍更新
apt-get updateRed Hat Enterprise LinuxCentOSRocky LinuxAlmaLinuxFedoraopenEulerOpenCloudOSAnolis OS不同系統上的軟體包名稱有所差異,如果提示找不到該軟體包可嘗試使用通配符
openssh*進行安裝 -
設定
SSH服務 -
啟動/重啟
SSH服務
友情提示:如果你正在使用公網伺服器,建議關閉 SSH 密碼認證方式並設定金鑰登入。
-
-
關於未顯示方向鍵交互控制介面#
如果發現互動介面是輸入而非新式的方向鍵控制,那麼請自行安裝
ncurses或nano軟體包,新式的按鍵互動依賴tput指令實作。 -
關於未啟用的軟體源倉庫#
許多系統的軟體源會啟用多個倉庫,腳本遵循系統預設設置,預設不啟用的軟體源(倉庫)不會在運行完本腳本後被啟用,但是它們也隨腳本更換了目標軟體源位址,具體啟用方法如下:
預設禁用了
deb-src原始碼倉庫和proposed預發佈軟體源,若需啟用請將/etc/apt/sources.list文件中相關內容的所在行取消註釋DebianUbuntuKaliLinux MintDeepinZorin OSArmbianProxmox VERaspberry Pi OSopenKylin部分倉庫預設沒有啟用,若需啟用請將
/etc/yum.repos.d目錄下相關 repo 文件中的enabled值修改為1Red Hat Enterprise LinuxCentOSRocky LinuxAlmaLinuxFedoraopenEulerOpenCloudOSAnolis OS部分倉庫預設沒有啟用,若需啟用請將
/etc/zypp/repos.d目錄下相關 repo 文件中的enabled值修改為1 -
其它#
關於呼叫腳本的互聯網位置
專案利用 GitHub Action 在每次提交後自動拷貝原始碼到文件目錄作為網站資源發佈,網站託管於 Netlify,幾乎沒有使用風險。
當然你也可以使用程式碼託管倉庫的原始位址來調用,這裡只是想告訴你為什麼會有幾個不同的位址,預設的官網位址更容易記憶和訪問。
關於軟體源下載速度問題
首先,在軟體源列表的使用幫助處有寫使用推薦,這是根據以往經驗總結出來的,但總有用戶在糾結軟體源速度的問題。
軟體源(鏡像站)的網路延遲即
Ping與下載速度沒有太大的關聯,雙方地理位置間隔的遠近不代表實際體驗,有些鏡像站下行總頻寬很高但實際測速卻並不理想,因為這與鏡像站的負載策略有關。網路上也有很多基於 C、Python 編寫的鏡像站測速開源腳本,而本專案腳本基於 Bash Shell 編寫且不依賴任何第三方庫,Bash 是 Linux 運維中最常用的腳本語言並且絕大部分發行版都會預裝,這意味著用戶不需要安裝任何環境就能直接運行,這種便利性是其他高級語言無法替代的,不過目前 Bash 腳本可能不太容易實現精準測速的功能,使用其它高級語言編寫測速功能無疑是造輪子的行為。
關於軟體源選優
很多朋友可能都會有一個疑問:“既然腳本已經如此便捷且實現了高度自動化,為什麼不能實現軟體源自動選優呢?”,不是做不到而是不能。
「軟體源選優」 在這裡指的是腳本根據客戶端的網路環境、地理位置自動選擇一個體驗最佳的軟體源,這個問題要從多個角度來論證:
-
速度方面
其實上面已經解釋過了,總結來說就是追求速度不是普遍需求,對大多數人來說是無感的、能用即可,況且現在很多 Linux 發行版不需要換源就有不錯的速度。
-
對於鏡像站本身
舉個最簡單的例子,以前阿里雲鏡像站因為速度快、可用性高幾乎被當成首選,但是隨著用戶越來越多導致速度變的原來越慢甚至可能不足 10 Mbps。
長此以往,那些用戶多的鏡像站可能無法承受過高的流量而導致體驗下降,用戶少的鏡像站可能會最終走向關閉,這不利於整個生態的發展。 -
開發者角度
本專案站在維運工具的角度致力於開發一個通用的換源腳本,而不是一個解決軟體源需求的具體化工具,要使腳本的預設行為適用於大多數使用者群體。作為維運工具要有明確的功能定位,作為腳本要從擴展性、實用性等多個方面去衡量利弊,軟體源的選擇權應該完全交給使用者。
-
命令選項(進階用法)#
命令選項(名稱/含義/值):
--abroad 使用境外以及海外軟體源 無
--edu 使用中國大陸教育網軟體源 無
--source 指定軟體源地址(網域名稱或IP) 位址
--source-epel 指定 EPEL 附加軟體包倉庫的軟體源地址(網域名稱或IP) 位址
--source-security 指定 Debian / Ubuntu 系統 security 倉庫的軟體源地址(網域名稱或IP) 位址
--source-vault 指定 CentOS / AlmaLinux 系統 vault 倉庫的軟體源地址(網域名稱或IP) 位址
--source-portage 指定 Gentoo 系統 portage 倉庫的軟體源地址(網域名稱或IP) 位址
--source-base-system 指定 Linux Mint / Raspberry Pi OS 底層系統的軟體源地址(網域名稱或IP) 位址
--branch 指定軟體源倉庫(路徑) 倉庫名稱
--branch-epel 指定 EPEL 附加軟體包倉庫的軟體源倉庫(路徑) 倉庫名稱
--branch-security 指定 Debian 系統 security 倉庫的軟體源倉庫(路徑) 倉庫名稱
--branch-vault 指定 CentOS / AlmaLinux 系統 vault 倉庫的軟體源倉庫(路徑) 倉庫名稱
--branch-portage 指定 Gentoo 系統 portage 倉庫的軟體源倉庫(路徑) 倉庫名稱
--branch-base-system 指定 Linux Mint / Raspberry Pi OS 底層系統的軟體源倉庫(路徑) 倉庫名稱
--codename 指定 Debian 系 / openKylin 系統的版本代號 代號名稱
--protocol 指定 Web 協定 http 或 https
--use-intranet-source 是否優先使用內部網路軟體源位址 true 或 false
--use-official-source 是否使用目標系統的官方軟體源 true 或 false
--use-official-source-epel 是否使用 EPEL 附加軟體包的官方軟體源 true 或 false
--install-epel 是否安裝 EPEL 附加軟體包 true 或 false
--backup 是否備份原有軟體源 true 或 false
--upgrade-software 是否更新軟體包 true 或 false
--clean-cache 是否在更新軟體包後清理下載快取 true 或 false
--clean-screen 是否在運行前清除螢幕上的所有內容 true 或 false
--lang 指定腳本輸出的語言 语言
--only-epel 僅更換 EPEL 軟體源模式 無
--ignore-backup-tips 忽略覆蓋備份提示 無
--print-diff 是否列印原始文件修改前後差異 無
--pure-mode 純淨模式,精簡列印內容 無
--help 查看幫助選單 無
| 名稱 | 含義 | 選項值 |
|---|---|---|
--abroad |
使用境外以及海外軟體源 | 無 |
--edu |
使用中國大陸教育網軟體源 | 無 |
--source |
指定軟體源位址(網域名稱或IP) | 位址 |
--source-epel |
指定 EPEL 附加軟體包倉庫的軟體源位址(網域名稱或IP) | 位址 |
--source-security |
指定 Debian / Ubuntu 系統 security 倉庫的軟體源位址(網域名稱或IP) | 位址 |
--source-vault |
指定 CentOS / AlmaLinux 系統 vault 倉庫的軟體源位址(網域名稱或IP) | 位址 |
--source-portage |
指定 Gentoo 系統 portage 倉庫的軟體源位址(網域名稱或IP) | 位址 |
--source-base-system |
指定 Linux Mint / Raspberry Pi OS 底層系統的軟體源位址(網域名稱或IP) | 位址 |
--branch |
指定軟體源倉庫(路徑) | 倉庫名稱 |
--branch-epel |
指定 EPEL 附加軟體包倉庫的軟體源倉庫(路徑) | 倉庫名稱 |
--branch-security |
指定 Debian 係統 security 倉庫的軟體源倉庫(路徑) | 倉庫名稱 |
--branch-vault |
指定 CentOS / AlmaLinux 系統 vault 倉庫的軟體源倉庫(路徑) | 倉庫名稱 |
--branch-portage |
指定 Gentoo 系統 portage 倉庫的軟體源倉庫(路徑) | 倉庫名稱 |
--branch-base-system |
指定 Linux Mint / Raspberry Pi OS 底層系統的軟體源倉庫(路徑) | 倉庫名稱 |
--codename |
指定 Debian 系 / openKylin 作業系統的版本代號 | 代號名稱 |
--protocol |
指定 Web 協定 | http 或 https |
--use-intranet-source |
是否優先使用內部網路軟體源位址 | true 或 false |
--use-official-source |
是否使用目標作業系統的官方軟體源 | true 或 false |
--use-official-source-epel |
是否使用 EPEL 附加軟體包的官方軟體源 | true 或 false |
--install-epel |
是否安裝 EPEL 附加軟體包 | true 或 false |
--backup |
是否備份原有軟體源 | true 或 false |
--upgrade-software |
是否更新軟體套件 | true 或 false |
--clean-cache |
是否在更新軟體包後清理下載快取 | true 或 false |
--clean-screen |
是否在運行前清除螢幕上的所有內容 | true 或 false |
--lang |
指定腳本輸出的語言 | 語言ID(詳見下方文件) |
--only-epel |
僅更換 EPEL 軟體源模式 | 無 |
--ignore-backup-tips |
忽略覆蓋備份提示(即不覆蓋備份) | 無 |
--print-diff |
是否列印原始文件修改前後差異 | 無 |
--pure-mode |
純淨模式,精簡列印內容 | 無 |
--help |
查看幫助選單 | 無 |
軟體源完整格式
<WEB協定>://<軟體源位址(網域名稱或IP)>/<軟體源倉庫(路徑)>
以下是一些進階用法的舉例
-
指定軟體源位址#
-
指定軟體源倉庫目錄#
這裡描述的軟體源倉庫與系統軟體倉庫不同,指的是軟體源(鏡像站)位址後面的路徑即鏡像站的倉庫目錄,雖然名義上都是倉庫但是非常容易混淆
主要使用情境:目標鏡像站有對應的系統鏡像倉庫但是不符合本專案腳本關於軟體源倉庫設定的預設規則
專案對於各作業系統所使用的預設倉庫名稱(點選展開檢視)
專案腳本為了適配大的環境不會針對某一鏡像站獨特的倉庫名稱而單獨適配
請看下面的例子
使用阿里雲鏡像站的 Rocky Linux 軟體源bash <(curl -sSL https://linuxmirrors.cn/main.sh) --zh-hant \ --source mirrors.aliyun.com \ --branch rockylinux阿里雲鏡像站的 Rocky Linux 倉庫目錄名稱為
rockylinux,不符合預設規則rocky,但是可以透過命令選項繞過腳本預設規則來實現。部分系統會同時配置多個倉庫的軟體源,具體詳見命令選項
由於軟體源倉庫作用在軟體源位址上因此也可以使用多層路徑,例如
--branch "linux/debian"->https://mirrors.example.com/linux/debian -
單獨更換 EPEL 源#
EPEL (Extra Packages for Enterprise Linux) 是由 Fedora 組織維護的一個附加軟體包倉庫,它主要適用於除 Fedora 作業系統以外的紅帽系 Linux 發行版,配置 EPEL 倉庫已成為廣大用戶的普遍需求,建議預設安裝它
有些時候你會發現想使用的鏡像站沒有 EPEL 倉庫,那麼你可以在第一次運行腳本時不安裝或更換 EPEL 軟體源,然後再單獨執行下面的命令
對於已經 EOL 的 EPEL 7,注意需要使用
archive倉庫,境外以及海外網絡環境建議通過命令選項--use-official-source-epel true使用官方源 -
恢復使用官方源#
當你不小心刪除了官方軟體源的備份時可以使用此命令來恢復,使用此命令選項後將跳過選擇軟體源步驟
部分系統不存在官方軟體源例如
Arch Linux,屆時會自動更換成相容性較高的阿里雲鏡像站 -
特定係統的使用範例#
-
關於 CentOS 停服問題#
腳本對於已經 EOL 的 CentOS 7/8、CentOS Stream 8 進行了適配
-
中國大陸
正常使用腳本,沒有額外操作,因為大部分中國大陸鏡像站都已同步
CentOS Vault倉庫 -
國際地區
建議使用
騰訊雲或阿里雲鏡像站,或透過--use-official-source true命令選項使用官方軟體源
另外 EPEL 7 也進入了 EOL,腳本同樣對其進行了適配
-
-
指定 GNU/Linux Debian 作業系統的 Security 軟體源#
如果你想盡可能提高伺服器的安全性建議使用官方軟體源,因為鏡像同步存在延遲
-
指定 Debian 系 Linux 作業系統的版本代號#
大多數情況下自訂版本代號用於更換系統版本,請看下面的例子
-
更換版本代號
-
停用 backports 倉庫
-
升級系統
-
升級完成並重新引導系統後執行下列步驟
-
-
更換 Ubuntu EOL版本軟體源#
EOL 為生命週期結束的縮寫(End Of Life),Ubuntu 迭代速度較快一般非LTS(長期支持)版本的生命週期只有9個月。官方會定期從主倉庫移除不在生命週期內的版本倉庫目錄,屆時可能就需要使用鏡像站的
Ubuntu Old Releases倉庫具體版本支援情況詳見官方 Wiki,關於
Ubuntu Old Releases倉庫的支援情況詳見各鏡像站 -
Arch Linux 使用中文社群倉庫#
本專案腳本目前不支援此額外倉庫,因使用人數較少等原因暫不考慮適配,若想使用請參考下方的一鍵設定命令
-
-
國際化(I18n)#
腳本提供多語言支持,目前內建
简体中文、繁體中文、English共三種顯示語言,預設為简体中文 -
無人值守(自動化)#
不透過交互完成換源操作,至少需要使用以下命令選項來實現,建議熟悉後再使用
参考命令bash <(curl -sSL https://linuxmirrors.cn/main.sh) --zh-hant \ --source mirror.example.com \ --protocol http \ --use-intranet-source false \ --install-epel true \ --backup true \ --upgrade-software false \ --clean-cache false \ --ignore-backup-tips如果報錯
命令選項無效那麼請檢查選項合法性以及空格字元編碼,在範例中一行寫一個選項是為了提高命令的可讀性 -
純淨模式#
推出此功能是為了方便開發以及运維人員使用,啟用後會精簡腳本內容輸出,建議搭配其它指令選項無互動使用
滾動輸出的命令日誌可能有無法預料的顯示問題,不過目前暫未發現異常
客製化腳本#
如果你是其它專案的開發者希望透過本專案來製作專屬腳本,那麼請參考下面提到的內容,目前已經有中國大陸教育單位鏡像站的維護者這樣做了。
- 首先不建議修改程式碼的底層邏輯,應盡量與本專案原始碼保持同步,腳本內容執行順序由
main函數控制,程式碼邏輯清晰 - 你可以簡單去除一些無關內容,例如將軟體源列表(陣列)
mirror_list_(default|edu|abroad|extranet|intranet)中的內容刪除,例如:mirror_list_default=() - 如果你想要自定義腳本列印內容可直接修改
run_startrun_endprint_title這三個函數中的內容 - 如果你想加入自定義 Shell 內容請參見
main函數中腳本執行順序,可以在對應位置直接插入內容也可以封裝函數後調用 - 如果你想要縮減腳本體積那麼可以刪除一些不必要的內容,除了上面提到的軟體源列表還有一些涉及腳本工作的部分模組內容,具體如下:
- 首先在刪除內容時應盡可能保留腳本原始結構,直接把涉及函數中的內容刪除即可,使其保留為空函數
- 可以刪除一些不使用(作業系統)的軟體源原始內容
gen_repo_files_xxx,這些內容佔據了腳本60%以上的體積 - 如果你不使用某些功能,那麼可以刪除對應功能模組函數中的內容,
命令選項 handle_command_options、備份原有軟體源 backup_original_mirrors、更新軟體包 upgrade_software - 移除不需要的語言包,例:
function msg_pack_en() {}
- 腳本主要功能配置是由統一的變量控制的,命令選項亦是如此,這些全局變量由全大寫字母構成並遵循下劃線命名法,具體變量詳見如下表格,你只需要將這些變量聲明在腳本頭部(預留註釋區域)即可快速完成定制
變數列表(點擊展開查看)
| 名稱 | 含義 | 值型別 |
|---|---|---|
SOURCE |
指定軟體源位址(網域名稱或IP) | 位址 |
SOURCE_EPEL |
指定 EPEL 附加軟體包倉庫的軟體源位址(網域名稱或IP) | 位址 |
SOURCE_SECURITY |
指定 Debian / Ubuntu 系統 security 倉庫的軟體源位址(網域名稱或IP) | 位址 |
SOURCE_VAULT |
指定 CentOS / AlmaLinux 系統 vault 倉庫的軟體源位址(網域名稱或IP) | 位址 |
SOURCE_PORTAGE |
指定 Gentoo 系統 portage 倉庫的軟體源位址(網域名稱或IP) | 位址 |
SOURCE_BASE_SYSTEM |
指定 Linux Mint / Raspberry Pi OS 底層系統的軟體源位址(網域名稱或IP) | 位址 |
SOURCE_BRANCH |
指定軟體源倉庫(路徑) | 倉庫名稱 |
SOURCE_EPEL_BRANCH |
指定 EPEL 附加軟體套件倉庫的軟體源倉庫(路徑) | 倉庫名稱 |
SOURCE_SECURITY_BRANCH |
指定 Debian 系統 security 倉庫的軟體源倉庫(路徑) | 倉庫名稱 |
SOURCE_VAULT_BRANCH |
指定 CentOS / AlmaLinux 系統 vault 倉庫的軟體源倉庫(路徑) | 倉庫名稱 |
SOURCE_PORTAGE_BRANCH |
指定 Gentoo 系統 portage 倉庫的軟體源倉庫(路徑) | 倉庫名稱 |
SOURCE_BASE_SYSTEM_BRANCH |
指定 Linux Mint / Raspberry Pi OS 底層系統的軟體源倉庫(路徑) | 倉庫名稱 |
DEBIAN_CODENAME |
指定 Debian 系 / openKylin 作業系統的版本代號 | 代號名稱 |
USE_INTRANET_SOURCE |
是否優先使用內網軟體源位址 | true 或 false |
USE_OFFICIAL_SOURCE |
是否使用目標作業系統的官方軟體源 | true 或 false |
USE_OFFICIAL_SOURCE_EPEL |
是否使用 EPEL 附加軟體包的官方軟體源 | true 或 false |
WEB_PROTOCOL |
指定 Web 協定 | http 或 https |
INSTALL_EPEL |
是否安裝 EPEL 附加軟體包 | true 或 false |
ONLY_EPEL |
僅更換 EPEL 軟體源模式 | true 或 false |
BACKUP |
是否備份原有軟體源 | true 或 false |
IGNORE_BACKUP_TIPS |
忽略覆蓋備份提示(即不覆蓋備份) | true 或 false |
UPGRADE_SOFTWARE |
是否更新軟體包 | true 或 false |
CLEAN_CACHE |
是否在更新軟體包後清理下載快取 | true 或 false |
CLEAN_SCREEN |
是否在運行前清除螢幕上的所有內容 | true 或 false |
PRINT_DIFF |
是否列印原始檔案修改前後差異 | true 或 false |
PURE_MODE |
純淨模式,精簡列印內容 | true 或 false |
部分變數存在預設值,未涉及的變數無需宣告為空值(空字串),另外如果對應功能配置不存在那麼就可能會出現交互