跳转至

使用方法

如果您觉得这个项目不错对您有所帮助的话,请点击仓库右上角的 Star 并分享给更多的朋友

一键执行命令#

bash <(curl -sSL https://linuxmirrors.cn/main.sh)
bash <(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/ChangeMirrors.sh)
bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh)
bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrors@main/ChangeMirrors.sh)
bash <(curl -sSL https://linuxmirrors.cn/main.sh) --abroad # (1)!
  1. 通过 --abroad 命令选项来使用海外软件源
bash <(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/ChangeMirrors.sh) --abroad # (1)!
  1. 通过 --abroad 命令选项来使用海外软件源
bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh) --abroad # (1)!
  1. 通过 --abroad 命令选项来使用海外软件源
bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrors@main/ChangeMirrors.sh) --abroad # (1)!
  1. 通过 --abroad 命令选项来使用海外软件源
bash <(curl -sSL https://linuxmirrors.cn/main.sh) --edu # (1)!
  1. 通过 --edu 命令选项来使用中国大陆教育单位软件源
bash <(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/ChangeMirrors.sh) --edu # (1)!
  1. 通过 --edu 命令选项来使用中国大陆教育单位软件源
bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh) --edu # (1)!
  1. 通过 --edu 命令选项来使用中国大陆教育单位软件源
bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrors@main/ChangeMirrors.sh) --edu # (1)!
  1. 通过 --edu 命令选项来使用中国大陆教育单位软件源

选项卡分别代表脚本内置软件源类型和获取脚本途径,请在使用前检查目标镜像站是否支持您所使用的操作系统,可以在软件源列表中查看具体有哪些软件源。

  • 注意事项#

    • 需使用 ROOT 用户执行脚本


      切换命令为 sudo -isu root。不同系统使用的命令不同,因为部分系统没有在初始安装时为 ROOT 账户设置密码(例如 Ubuntu)或系统默认禁止 ROOT 用户登录。

    • 建议使用支持 SSH 的现代化终端应用


      如果你系统命令行界面的中文显示乱码那么将导致无法查看交互内容,此外部分系统 GUI 图形界面的终端应用可能存在一些无法预料的显示问题。关于 SSH 服务部分系统会自动开启,否则请参考开启方法

    • 如果是在新装系统上首次执行脚本


      当前执行方式依赖 curl 指令获取脚本内容并执行,但部分操作系统没有预装此软件包,届时则会报错 Command not found,安装方法详见下方 关于报错 Command not found

    • 脚本运行期间需要交互选择配置


      请通过方向键 UpDownLeftRightWASD 控制选项并按 Enter 回车键确认。如果发现交互异常那么请改变终端软件的窗口大小后重试,窗口尽量不要太小。

  • 常见问题#

    • 关于报错 Command not found#

      此报错是因为系统没有预装 curl 软件包,下面是安装命令

      apt-get install -y curl
      

      Debian   Ubuntu   Kali   Linux Mint   Deepin   Zorin OS   Armbian   Proxmox   openKylin

      新装系统需要先执行一遍更新 apt-get update

      dnf install -y curl || yum install -y curl
      

      Red Hat Enterprise Linux   CentOS   Rocky Linux   AlmaLinux   Fedora   openEuler   OpenCloudOS   Anolis OS

      zypper install curl
      
      pacman -S curl
      
      apk --no-cache add -f curl bash ncurses
      
      emerge --ask curl
      
      安装不上?(点击展开查看其它解决方法)

      假如系统原有软件源是无效的导致安装不上 curl 软件包,那么对于 Linux 初学者来说可能会比较麻烦,这里提供几个在线获取脚本的应急方法

      适用于大部分操作系统(Alpine Linux 除外),python3 要是不存在那就再试试 python 指令

      python3 -c "import urllib.request; urllib.request.urlretrieve('https://linuxmirrors.cn/main.sh', 'main.sh')"
      

      一般没有预装 curl 软件包的系统也不会预装 wget 软件包,所以大概率这个方法应该是不行的

      wget https://linuxmirrors.cn/main.sh
      

      如果可以访问系统 GUI 图像界面和桌面的话那可以直接在浏览器中打开链接下载脚本,很多系统都会预装 Firefox 火狐浏览器

      之后再执行脚本即可

      bash main.sh
      
      bash main.sh --abroad
      
      bash main.sh --edu
      

      如果以上方法试了都不行,那就复制源码至本地新建任意名称的 .sh 脚本,粘贴源码内容后通过 bash 指令手动执行。

    • 关于开启 SSH 远程登录的方法#

      • 验证是否已安装 SSH 服务

        ls /etc | grep ssh
        

        如果没有这个文件夹说明系统未安装 SSH 服务,你需要通过包管理工具安装 openssh 软件包

      • 设置允许 Root 用户登录

        cat /etc/ssh/sshd_config | grep -Eq "^[# ]?PermitRootLogin " ; [ $? -eq 0 ] && sed -i 's/^[# ]\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config || echo -e "\nPermitRootLogin yes" >> /etc/ssh/sshd_config
        
      • 设置密码认证

        cat /etc/ssh/sshd_config | grep -Eq "^[# ]?PasswordAuthentication " ; [ $? -eq 0 ] && sed -i 's/^[# ]\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config || echo -e "\nPasswordAuthentication yes" >> /etc/ssh/sshd_config
        
      • 启动/重启 SSH 服务

        ps -ef | grep -q ssh ; [ $? -eq 0 ] && systemctl restart sshd || systemctl enable --now sshd
        

      命令以及配置步骤仅供参考,只适配了部分常见发行版

    • 还原已备份的软件源#

      cp -rf /etc/apt/sources.list.bak /etc/apt/sources.list
      apt-get update
      

      Debian   Ubuntu   Kali   Linux Mint   Deepin   Zorin OS   Armbian   Proxmox   openKylin

      cp -rf /etc/yum.repos.d.bak /etc/yum.repos.d
      yum makecache
      

      Red Hat Enterprise Linux   CentOS   Rocky Linux   AlmaLinux   Fedora   openEuler   OpenCloudOS   Anolis OS

      cp -rf /etc/zypp/repos.d.bak /etc/zypp/repos.d
      zypper ref
      
      cp -rf /etc/pacman.d/mirrorlist.bak /etc/pacman.d/mirrorlist
      pacman -Sy
      
      cp -rf /etc/apk/repositories.bak /etc/apk/repositories
      apk update -f
      
      cp -rf /etc/portage/make.conf.bak /etc/portage/make.conf
      [ -d /etc/portage/repos.conf ] && cp -rf /etc/portage/repos.conf/gentoo.conf.bak /etc/portage/repos.conf/gentoo.conf
      emerge --sync --quiet
      
    • 其它#

      • 如果提示 bash: /proc/self/fd/11: No such file or directory,请切换至 Root 用户执行,切换命令为 sudo -isu root
  • 关于调用脚本的互联网位置#

    项目利用 GitHub Action 在每次提交后自动拷贝源码到文档目录作为网站资源发布,网站托管于知名 CDN 云服务商几乎没有被劫持的风险请放心使用。

    当然你也可以使用代码托管仓库的原始地址来调用,这里只是想告诉你为什么会有几个不同的地址,默认的官网地址更易于记忆和访问。

  • 关于软件源下载速度相关问题#

    首先在软件源列表页面的使用帮助有使用推荐,这是根据以往经验总结出来的,但总有用户在纠结软件源速度的问题。

    软件源(镜像站)的网络延迟即 Ping 与下载速度没有太大的关联,双方地理位置间隔的远近不代表实际体验,有些镜像站下行带宽很高但实际测速却并不理想,因为这与镜像站的并发性能和负载策略有关。

    网上也有很多基于 C、Python 编写的镜像站测速开源脚本,而本项目脚本基于 Bash Shell 编写且不依赖任何第三方库,Bash 是 Linux 运维中最常用的脚本语言并且绝大部分发行版都会预装,这意味着用户不需要安装任何环境就能直接运行,这种便利性是其它高级语言无法替代的,不过目前来看 Bash 脚本可能无法实现精准测速的功能。

  • 关于未启用的软件源#

    脚本遵循系统默认设置即没有启用的软件源(仓库)不会在运行完本脚本后被启用,但是它们也随脚本更换了目标软件源地址,具体启用方法如下:

    默认禁用了deb-src源码仓库和proposed预发布软件源,若需启用请将 /etc/apt/sources.list 文件中相关内容的所在行取消注释

    Debian   Ubuntu   Kali   Linux Mint   Deepin   Zorin OS   Armbian   Proxmox   openKylin

    部分仓库默认没有启用,若需启用请将 /etc/yum.repos.d 目录下相关 repo 文件中的 enabled 值修改为 1

    Red Hat Enterprise Linux   CentOS   Rocky Linux   AlmaLinux   Fedora   openEuler   OpenCloudOS   Anolis OS

    部分仓库默认没有启用,若需启用请将 /etc/zypp/repos.d 目录下相关 repo 文件中的 enabled 值修改为 1


命令选项(高级用法)#

名称 含义 选项值
--abroad 使用境外以及海外软件源
--edu 使用中国大陆教育网软件源
--source 指定软件源地址(域名或IP) 地址
--source-epel 指定 EPEL 附加软件包仓库的软件源地址(域名或IP) 地址
--source-security 指定 Debian 系统 security 仓库的软件源地址(域名或IP) 地址
--source-vault 指定 CentOS/AlmaLinux 系统 vault 仓库的软件源地址(域名或IP) 地址
--source-portage 指定 Gentoo 系统 portage 仓库的软件源地址(域名或IP) 地址
--source-base-system 指定 Linux Mint 系统底层系统的软件源地址(域名或IP) 地址
--branch 指定软件源仓库(路径) 仓库名
--branch-epel 指定 EPEL 附加软件包仓库的软件源仓库(路径) 仓库名
--branch-security 指定 Debian 系统 security 仓库的软件源仓库(路径) 仓库名
--branch-vault 指定 CentOS/AlmaLinux 系统 vault 仓库的软件源仓库(路径) 仓库名
--branch-portage 指定 Gentoo 系统 portage 仓库的软件源仓库(路径) 仓库名
--branch-base-system 指定 Linux Mint 系统底层系统的软件源仓库(路径) 仓库名
--codename 指定 Debian 系 / openKylin 操作系统的版本代号 代号名称
--protocol 指定 WEB 协议 httphttps
--use-intranet-source 是否优先使用内网软件源地址 truefalse
--use-official-source 是否使用目标操作系统的官方软件源 truefalse
--install-epel 是否安装 EPEL 附加软件包 truefalse
--backup 是否备份原有软件源 truefalse
--upgrade-software 是否更新软件包 truefalse
--clean-cache 是否清理下载缓存 truefalse
--clean-screen 是否在运行前清除屏幕上的所有内容 truefalse
--print-diff 是否打印源文件修改前后差异 truefalse
--only-epel 仅更换 EPEL 软件源模式
--ignore-backup-tips 忽略覆盖备份提示(即不覆盖备份)
--help 查看帮助菜单

软件源完整格式 <WEB协议>://<软件源地址(域名或IP)>/<软件源仓库(路径)>

接下来是一些高级用法的举例

  • 指定软件源地址#

    bash <(curl -sSL https://linuxmirrors.cn/main.sh) --source mirror.example.com
    
  • 指定软件源仓库#

    主要使用场景:目标镜像站有对应的系统镜像仓库但是不符合本项目脚本关于软件源仓库设置的默认规则

    由于仓库软件源仓库作用在软件源地址上,因此也可以使用多级路径,例如 <WEB协议>://<软件源地址>/linux/debian > https://mirrors.example.com/linux/debian

    项目对于各操作系统所使用的默认仓库名称(点击展开查看)

    项目脚本为了适配大的环境不会针对某一镜像站独特的仓库名称而单独适配

    系统名称 涉及的名称
    Debian debian debian-archive
    Ubuntu ubuntu ubuntu-ports
    Kali Linux kali
    Linux Mint linuxmint ubuntu ubuntu-ports debian
    Deepin(深度) deepin
    Zorin OS ubuntu ubuntu-ports
    Armbian armbian
    Proxmox proxmox
    Red Hat Enterprise Linux centos centos-stream centos-altarch centos-vault
    Fedora fedora fedora-archive
    CentOS centos centos-stream centos-altarch centos-vault
    Rocky Linux rocky
    AlmaLinux almalinux almalinux-vault
    openEuler(开源欧拉) openeuler
    OpenCloudOS(鸥栖) opencloudos
    openKylin(开放麒麟) openkylin
    Anolis OS(龙蜥) anolis
    openSUSE opensuse
    Arch Linux archlinux archlinuxarm
    Alpine Linux alpine
    Gentoo gentoo gentoo-portage

    请看下面的例子

    使用阿里云镜像站的 Rocky Linux 软件源
    bash <(curl -sSL https://linuxmirrors.cn/main.sh) \
      --source mirrors.aliyun.com \
      --branch rockylinux
    

    阿里云镜像站的 Rocky Linux 仓库名称为 rockylinux,不符合默认规则,但是可以通过命令选项绕过脚本默认规则来实现。

    部分系统会同时配置多个仓库的软件源,具体详见命令选项

  • 单独更换 EPEL 源#

    EPEL (Extra Packages for Enterprise Linux) 是由 Fedora 组织维护的一个附加软件包仓库,它主要适用于除 Fedora 操作系统以外的红帽系 Linux 发行版,配置 EPEL 仓库已成为广大用户的普遍需求,建议默认安装它

    有些时候你会发现想使用的镜像站没有 epel 镜像仓库,那么你可以在第一次运行脚本时不安装或更换 epel 源然后再单独执行下面的命令

    bash <(curl -sSL https://linuxmirrors.cn/main.sh) --only-epel
    
  • 恢复使用官方源#

    当你不小心删除了官方源的备份时可以使用此命令来恢复,使用此命令选项后将跳过选择软件源步骤

    bash <(curl -sSL https://linuxmirrors.cn/main.sh) --use-official-source true
    

    部分系统不存在官方源例如 Arch Linux,届时会自动更换成兼容性较高的阿里云镜像站

  • 自定义 Debian Security 源#

    如果你想尽可能提高服务器的安全性则建议使用官方源,因为镜像同步存在延迟

    bash <(curl -sSL https://linuxmirrors.cn/main.sh) \
      --source-security security.debian.org \
      --branch-security debian-security
    
  • 指定 Debian 系 Linux 操作系统的版本代号#

    大多数情况下自定义版本代号用于更换系统版本,请看下面的例子

    bash <(curl -sSL https://linuxmirrors.cn/main.sh) --codename bookworm
    
    bash <(curl -sSL https://linuxmirrors.cn/main.sh) --codename testing
    

    更换软件源后还需要执行系统更新命令 apt-get dist-upgrade,并且建议在更新完成并重启系统后重新执行本换源脚本,因为仅更换软件源配置中的系统版本代号可能会在后期使用时产生一些兼容性问题

    若脚本无法实现指定版本代号,你也可以在执行脚本后手动替换
    sed -i "s/$(lsb_release -cs)/指定版本代号/g" /etc/apt/sources.list
    
  • 更换 Ubuntu EOF版本软件源#

    EOF 为生命周期结束的缩写(End Of Life),Ubuntu 迭代速度较快一般非长期支持(LTS)版本的生命周期只有9个月。官方会定期从主仓库移除不在生命周期内的版本仓库目录,届时可能就需要使用镜像站的 Ubuntu Old Releases 仓库

    具体版本支持情况详见官方 Wiki,关于 Ubuntu Old Releases 仓库的支持情况详见各镜像站

    bash <(curl -sSL https://linuxmirrors.cn/main.sh) \
      --source mirrors.ustc.edu.cn \
      --branch ubuntu-old-releases
    
  • 无人值守(自动化)#

    不通过交互完成换源操作,至少需要使用如下命令选项来实现,建议熟悉后再使用

    参考命令
    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
    

定制脚本#

如果你是其它项目的开发者希望通过本项目来制作专属脚本那么请参考下面提到的内容,目前已经有国内教育单位镜像站的维护者这样做了。

  1. 首先不建议修改代码的底层逻辑,应尽量与本项目源码保持同步,脚本内容执行顺序由 main 函数控制,代码逻辑清晰
  2. 你可以简单去除一些无关内容,例如将软件源列表(数组)mirror_list_(default|edu|abroad|extranet|intranet) 中的内容删除,例:mirror_list_default=()
  3. 如果你想定制脚本打印内容可直接修改 run_start run_end print_title 这三个函数中的内容
  4. 如果你想添加自定义 Shell 内容详见 main 函数中脚本执行顺序,可以在对应位置直接插入内容也可以封装函数后调用
  5. 如果你想要缩减脚本体积那么可以删除一些不必要的内容,除了上面提到的软件源列表还有一些涉及脚本工作的部分模块内容,具体如下:
    1. 首先在删除内容时应尽可能保留脚本原始结构,直接把涉及函数中的内容删除即可,使其保留为空函数
    2. 可以删除一些不使用(操作系统)的软件源原始内容 gen_repo_files_xxx,这些内容占据了脚本 60% 以上的体积
    3. 如果你不使用某些功能那么可以删除对应功能模块函数中的内容,命令选项 handle_command_options备份原有软件源 backup_original_mirrors更新软件包 upgrade_software
  6. 脚本主要功能配置是由统一的变量控制的,命令选项亦是如此,这些全局变量由全大写字母构成并遵循下划线命名法,具体变量详见如下表格,你只需要将这些变量声明在脚本头部(预留注释区域)即可快速完成定制
变量名 含义 值类型
SOURCE 指定软件源地址(域名或IP) 地址
SOURCE_EPEL 指定 EPEL 附加软件包仓库的软件源地址(域名或IP) 地址
SOURCE_SECURITY 指定 Debian 系统 security 仓库的软件源地址(域名或IP) 地址
SOURCE_VAULT 指定 CentOS/AlmaLinux 系统 vault 仓库的软件源地址(域名或IP) 地址
SOURCE_PORTAGE 指定 Gentoo 系统 portage 仓库的软件源地址(域名或IP) 地址
SOURCE_BASE_SYSTEM 指定 Linux Mint 系统底层系统的软件源地址(域名或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 系统底层系统的软件源仓库(路径) 仓库名
DEBIAN_CODENAME 指定 Debian 系 / openKylin 操作系统的版本代号 代号名称
USE_OFFICIAL_SOURCE 是否使用目标操作系统的官方软件源 truefalse
USE_INTRANET_SOURCE 是否优先使用内网软件源地址 truefalse
WEB_PROTOCOL 指定 WEB 协议 httphttps
INSTALL_EPEL 是否安装 EPEL 附加软件包 truefalse
ONLY_EPEL 仅更换 EPEL 软件源模式 truefalse
BACKUP 是否备份原有软件源 truefalse
IGNORE_BACKUP_TIPS 忽略覆盖备份提示(即不覆盖备份) truefalse
UPGRADE_SOFTWARE 是否更新软件包 truefalse
CLEAN_CACHE 是否清理下载缓存 truefalse
CLEAN_SCREEN 是否在运行前清除屏幕上的所有内容 truefalse
PRINT_DIFF 是否打印源文件修改前后差异 truefalse

部分变量存在默认值,未涉及的变量无需声明为空值(空字符串),另外如果对应功能配置不存在那么就可能会出现交互