使用方法
一键执行命令#
使用帮助
选项卡分别代表脚本内置软件源(镜像站)类型和获取脚本途径,请在使用前检查目标镜像站是否支持你所使用的操作系统,可以在软件源列表中查看。
默认自动备份原有软件源内容,如需了解更多请翻阅下方文档。若使用过程中的某些选项令你疑惑不解,那么在选择软件源后一路回车即是最佳实践。
支持在系统原有软件源损坏、缺失、无效等异常环境下使用,无需额外安装任何依赖。
关于软件源的选择(新用户必读)
如果你不了解这些镜像站那么建议使用 阿里云 (兼容性高、可用性强) 或 中国科学技术大学 (速度快),请不要陷入测速焦虑,内置的软件源一般不会有太大的差异。
本项目脚本是一个自动化运维工具,不会对镜像站进行主观的优劣排序和定制适配,用户的选择应该是自由的,这也是为了开源软件精神能够得到更好的延续。
-
需要
ROOT权限
请使用
root账户运行本脚本,切换命令为sudo -i或su root。不同系统使用的命令不同,因为部分系统没有在初始安装时为 root 账户设置密码(例如 Ubuntu)或系统默认禁止root账户登录。 -
建议使用现代化的
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 |
指定脚本输出的语言 | 语言ID(详见下方文档) |
--only-epel |
仅更换 EPEL 软件源模式 | 无 |
--ignore-backup-tips |
忽略覆盖备份提示(即不覆盖备份) | 无 |
--print-diff |
是否打印源文件修改前后差异 | 无 |
--pure-mode |
纯净模式,精简打印内容 | 无 |
--help |
查看帮助菜单 | 无 |
软件源完整格式
<WEB协议>://<软件源地址(域名或IP)>/<软件源仓库(路径)>
下面是一些高级用法的举例
-
指定软件源地址#
-
指定软件源仓库目录#
这里描述的软件源仓库与系统软件仓库不同,指的是软件源(镜像站)地址后面的路径即镜像站的仓库目录,虽然名义上都是仓库但是非常容易混淆
主要使用场景:目标镜像站有对应的系统镜像仓库但是不符合本项目脚本关于软件源仓库设置的默认规则
项目对于各操作系统所使用的默认仓库名称(点击展开查看)
项目脚本为了适配大的环境不会针对某一镜像站独特的仓库名称而单独适配
请看下面的例子
使用阿里云镜像站的 Rocky Linux 软件源bash <(curl -sSL https://linuxmirrors.cn/main.sh) \ --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) \ --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 |
部分变量存在默认值,未涉及的变量无需声明为空值(空字符串),另外如果对应功能配置不存在那么就可能会出现交互