优化 & bug fix & 更新文档

This commit is contained in:
Super Manito
2025-01-04 19:20:15 +08:00
parent 9cb5eef276
commit 678f3049aa
10 changed files with 424 additions and 223 deletions

View File

@@ -1,6 +1,6 @@
#!/bin/bash
## Author: SuperManito
## Modified: 2024-12-28
## Modified: 2025-01-04
## License: MIT
## GitHub: https://github.com/SuperManito/LinuxMirrors
## Website: https://linuxmirrors.cn
@@ -473,7 +473,7 @@ function handle_command_options() {
if [ "$2" ]; then
case "$2" in
http | https | HTTP | HTTPS)
WEB_PROTOCOL="$2"
WEB_PROTOCOL="${2,,}"
shift
;;
*)
@@ -2319,6 +2319,7 @@ function change_mirrors_or_install_EPEL() {
esac
## 跳过较旧的 EOF 版本epel 7 已被官方移动至 archive 仓库,目前没有多少镜像站同步,暂无适配的必要)
if [[ "${target_version}" == "7" ]]; then
[ -z "${SOURCE_EPEL_BRANCH}" ] && SOURCE_EPEL_BRANCH="epel-archive"
return
fi
## 安装 EPEL 软件包
@@ -2487,6 +2488,16 @@ function interactive_select_boolean() {
echo -e "╰─ \033[2m○ 是 / \033[0m\033[32m●\033[0m 否"
fi
}
function draw_menu_confirmed() {
tput rc
echo -e "╭─ ${message}"
echo -e "│"
if [ "$selected" -eq 0 ]; then
echo -e "╰─ \033[32m●\033[0m \033[1m是\033[0m\033[2m / ○ 否\033[0m"
else
echo -e "╰─ \033[2m○ 是 / \033[0m\033[32m●\033[0m \033[1m否\033[0m"
fi
}
function read_key() {
IFS= read -rsn1 key
if [[ $key == $'\x1b' ]]; then
@@ -2517,6 +2528,7 @@ function interactive_select_boolean() {
;;
"")
# Enter 键
draw_menu_confirmed
break
;;
*) ;;

View File

@@ -1,6 +1,6 @@
#!/bin/bash
## Author: SuperManito
## Modified: 2024-12-13
## Modified: 2025-01-04
## License: MIT
## GitHub: https://github.com/SuperManito/LinuxMirrors
## Website: https://linuxmirrors.cn
@@ -125,6 +125,7 @@ function main() {
collect_system_info
run_start
choose_mirrors
choose_protocol
close_firewall_service
install_dependency_packages
configure_docker_ce_mirror
@@ -140,9 +141,12 @@ function handle_command_options() {
echo -e "
命令选项(名称/含义/值)
--source 指定 Docker CE 源地址 地址
--source-registry 指定 Docker Registry 源地址 地址
--source 指定 Docker CE 源地址(域名或IP) 地址
--source-registry 指定镜像仓库地址(域名或IP) 地址
--branch 指定 Docker CE 源仓库(路径) 仓库名
--codename 指定 Debian 系操作系统的版本代号 代号名称
--designated-version 指定 Docker CE 安装版本 版本号
--protocol 指定 Docker CE 源的 WEB 协议 http 或 https
--install-latest 是否安装最新版本的 Docker Engine true 或 false
--close-firewall 是否关闭防火墙 true 或 false
--clean-screen 是否在运行前清除屏幕上的所有内容 true 或 false
@@ -183,6 +187,15 @@ function handle_command_options() {
output_error "命令选项 ${BLUE}$1${PLAIN} 无效,请在该选项后指定镜像仓库地址!"
fi
;;
## 指定 Docker CE 软件源仓库
--branch)
if [ "$2" ]; then
SOURCE_BRANCH="$2"
shift
else
output_error "命令选项 ${BLUE}$1${PLAIN} 无效,请在该选项后指定软件源仓库!"
fi
;;
## 指定 Debian 版本代号
--codename)
if [ "$2" ]; then
@@ -192,6 +205,36 @@ function handle_command_options() {
output_error "命令选项 ${BLUE}$1${PLAIN} 无效,请在该选项后指定版本代号!"
fi
;;
## 指定 Docker Engine 安装版本
--designated-version)
if [ "$2" ]; then
echo "$2" | grep -Eq "^[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}$"
if [ $? -eq 0 ]; then
DESIGNATED_DOCKER_VERSION="$2"
shift
else
output_error "命令选项 ${BLUE}$2${PLAIN} 无效,请在该选项后指定有效的版本号!"
fi
else
output_error "命令选项 ${BLUE}$1${PLAIN} 无效,请在该选项后指定版本号!"
fi
;;
## WEB 协议HTTP/HTTPS
--protocol)
if [ "$2" ]; then
case "$2" in
http | https | HTTP | HTTPS)
WEB_PROTOCOL="${2,,}"
shift
;;
*)
output_error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该选项后指定 http 或 https "
;;
esac
else
output_error "命令选项 ${BLUE}$1${PLAIN} 无效,请在该选项后指定 WEB 协议http/https"
fi
;;
## 安装最新版本
--install-latest | --install-latested)
if [ "$2" ]; then
@@ -257,6 +300,9 @@ function handle_command_options() {
done
## 给部分命令选项赋予默认值
IGNORE_BACKUP_TIPS="${IGNORE_BACKUP_TIPS:-"false"}"
if [[ "${DESIGNATED_DOCKER_VERSION}" ]]; then
INSTALL_LATESTED_DOCKER="false"
fi
}
function run_start() {
@@ -317,13 +363,13 @@ function collect_system_info() {
elif [ -s $File_openEulerRelease ]; then
SYSTEM_FACTIONS="${SYSTEM_OPENEULER}"
elif [ -s $File_OpenCloudOSRelease ]; then
# 拦截 OpenCloudOS 9 及以上版本,非红帽版本不支持从 Docker 官方仓库安装
# 拦截 OpenCloudOS 9 及以上版本,不支持从 Docker 官方仓库安装
if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" -ge 9 ]]; then
output_error "不支持当前操作系统,请参考如下命令自行安装:\n\ndnf install -y docker\nsystemctl enable --now docker"
fi
SYSTEM_FACTIONS="${SYSTEM_OPENCLOUDOS}" # 自 9.0 版本起不再基于红帽
elif [ -s $File_AnolisOSRelease ]; then
# 拦截 Anolis OS 8 版本,不支持从 Docker 官方仓库安装
# 拦截 Anolis OS 8.8 及以上版本,不支持从 Docker 官方仓库安装23 版本支持
if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" == 8 ]]; then
output_error "不支持当前操作系统,请参考如下命令自行安装:\n\ndnf install -y docker\nsystemctl enable --now docker"
fi
@@ -345,6 +391,10 @@ function collect_system_info() {
;;
"${SYSTEM_REDHAT}")
SYSTEM_JUDGMENT="$(awk '{printf $1}' $File_RedHatRelease)"
# 拦截 Anolis OS 8.8 以下版本,不支持从 Docker 官方仓库安装
if [[ "${SYSTEM_JUDGMENT}" == "${SYSTEM_ANOLISOS}" ]]; then
output_error "不支持当前操作系统,请参考如下命令自行安装:\n\ndnf install -y docker\nsystemctl enable --now docker"
fi
## 特殊系统判断
# Red Hat Enterprise Linux
grep -q "${SYSTEM_RHEL}" $File_RedHatRelease && SYSTEM_JUDGMENT="${SYSTEM_RHEL}"
@@ -389,46 +439,44 @@ function collect_system_info() {
;;
esac
## 定义软件源仓库名称
case "${SYSTEM_FACTIONS}" in
"${SYSTEM_DEBIAN}")
case "${SYSTEM_JUDGMENT}" in
if [[ -z "${SOURCE_BRANCH}" ]]; then
case "${SYSTEM_FACTIONS}" in
"${SYSTEM_DEBIAN}")
SOURCE_BRANCH="debian"
case "${SYSTEM_JUDGMENT}" in
"${SYSTEM_DEBIAN}")
SOURCE_BRANCH="debian"
;;
"${SYSTEM_UBUNTU}" | "${SYSTEM_ZORIN}")
SOURCE_BRANCH="ubuntu"
;;
"${SYSTEM_RHEL}")
SOURCE_BRANCH="rhel"
;;
*)
# 部分 Debian 系衍生操作系统使用 Debian 12 的 docker ce 源
SOURCE_BRANCH="debian"
SYSTEM_VERSION_CODENAME="bookworm"
;;
esac
;;
"${SYSTEM_UBUNTU}" | "${SYSTEM_ZORIN}")
SOURCE_BRANCH="ubuntu"
"${SYSTEM_REDHAT}")
case "${SYSTEM_JUDGMENT}" in
"${SYSTEM_FEDORA}")
SOURCE_BRANCH="fedora"
;;
"${SYSTEM_RHEL}")
SOURCE_BRANCH="rhel"
;;
*)
SOURCE_BRANCH="centos"
;;
esac
;;
"${SYSTEM_RHEL}")
SOURCE_BRANCH="rhel"
;;
*)
# 部分 Debian 系衍生操作系统使用 Debian 12 的 docker ce 源
SOURCE_BRANCH="debian"
SYSTEM_VERSION_CODENAME="bookworm"
;;
esac
;;
"${SYSTEM_REDHAT}")
case "${SYSTEM_JUDGMENT}" in
"${SYSTEM_FEDORA}")
SOURCE_BRANCH="fedora"
;;
"${SYSTEM_RHEL}")
SOURCE_BRANCH="rhel"
;;
"${SYSTEM_ANOLISOS}")
# 拦截 Anolis OS 8 版本,不支持从 Docker 官方仓库安装
output_error "不支持当前操作系统,请参考如下命令自行安装:\n\ndnf install -y docker\nsystemctl enable --now docker"
;;
*)
"${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
SOURCE_BRANCH="centos"
;;
esac
;;
"${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
SOURCE_BRANCH="centos"
;;
esac
fi
## 定义软件源更新文字
case "${SYSTEM_FACTIONS}" in
"${SYSTEM_DEBIAN}")
@@ -504,48 +552,15 @@ function choose_mirrors() {
}
print_title
if [[ -z "${INSTALL_LATESTED_DOCKER}" ]]; then
## 是否手动选择安装版本
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
echo ''
interactive_select_boolean "${BOLD}是否安装最新版本的 Docker Engine?${PLAIN}"
if [[ "${_SELECT_RESULT}" == "true" ]]; then
INSTALL_LATESTED_DOCKER="true"
else
## 安装旧版本只有官方仓库有
INSTALL_LATESTED_DOCKER="false"
SOURCE="download.docker.com"
fi
else
local CHOICE_A=$(echo -e "\n${BOLD}└─ 是否安装最新版本的 Docker Engine? [Y/n] ${PLAIN}")
read -p "${CHOICE_A}" INPUT
[[ -z "${INPUT}" ]] && INPUT=Y
case $INPUT in
[Yy] | [Yy][Ee][Ss])
INSTALL_LATESTED_DOCKER="true"
;;
[Nn] | [Nn][Oo])
## 安装旧版本只有官方仓库有
INSTALL_LATESTED_DOCKER="false"
SOURCE="download.docker.com"
;;
*)
INSTALL_LATESTED_DOCKER="true"
echo -e "\n$WARN 输入错误,默认安装最新版本!"
;;
esac
fi
fi
local mirror_list_name
if [[ -z "${SOURCE}" ]]; then
mirror_list_name="mirror_list_docker_ce"
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
sleep 1 >/dev/null 2>&1
eval "interactive_select_mirror \"\${${mirror_list_name}[@]}\" \"\\n \${BOLD}请选择你想使用的 Docker CE 源:\${PLAIN}\\n\""
SOURCE="${_SELECT_RESULT#*@}"
echo -e "\n${GREEN}${PLAIN} ${BOLD}${_SELECT_RESULT%@*}${PLAIN}"
echo -e "\n${GREEN}${PLAIN} ${BOLD}Docker CE: ${_SELECT_RESULT%@*}${PLAIN}"
else
print_mirrors_list "${mirror_list_name}" 38
local CHOICE_B=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker CE 源 [ 1-$(eval echo \${#$mirror_list_name[@]}) ]${PLAIN}")
@@ -575,7 +590,7 @@ function choose_mirrors() {
sleep 1 >/dev/null 2>&1
eval "interactive_select_mirror \"\${${mirror_list_name}[@]}\" \"\\n \${BOLD}请选择你想使用的 Docker Registry 源:\${PLAIN}\\n\""
SOURCE_REGISTRY="${_SELECT_RESULT#*@}"
echo -e "\n${GREEN}${PLAIN} Docker Registry${BOLD}${_SELECT_RESULT%@*}${PLAIN}"
echo -e "\n${GREEN}${PLAIN} ${BOLD}Docker Registry: ${_SELECT_RESULT%@*}${PLAIN}"
else
print_mirrors_list "${mirror_list_name}" 44
local CHOICE_C=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker Registry 源 [ 1-$(eval echo \${#$mirror_list_name[@]}) ]${PLAIN}")
@@ -600,6 +615,42 @@ function choose_mirrors() {
fi
}
## 选择同步或更新软件源所使用的 WEB 协议( HTTP/HTTPS
function choose_protocol() {
if [[ -z "${WEB_PROTOCOL}" ]]; then
if [[ "${ONLY_HTTP}" == "true" ]]; then
WEB_PROTOCOL="http"
else
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
echo ''
interactive_select_boolean "${BOLD}软件源是否使用 HTTP 协议?${PLAIN}"
if [[ "${_SELECT_RESULT}" == "true" ]]; then
WEB_PROTOCOL="http"
else
WEB_PROTOCOL="https"
fi
else
local CHOICE=$(echo -e "\n${BOLD}└─ 软件源是否使用 HTTP 协议? [Y/n] ${PLAIN}")
read -rp "${CHOICE}" INPUT
[[ -z "${INPUT}" ]] && INPUT=Y
case "${INPUT}" in
[Yy] | [Yy][Ee][Ss])
WEB_PROTOCOL="http"
;;
[Nn] | [Nn][Oo])
WEB_PROTOCOL="https"
;;
*)
echo -e "\n$WARN 输入错误,默认使用 HTTPS 协议!"
WEB_PROTOCOL="https"
;;
esac
fi
fi
fi
WEB_PROTOCOL="${WEB_PROTOCOL,,}"
}
## 关闭防火墙和SELinux
function close_firewall_service() {
if [ ! -x /usr/bin/systemctl ]; then
@@ -681,6 +732,7 @@ function install_dependency_packages() {
esac
;;
esac
echo ''
}
## 选择系统包管理器
@@ -703,31 +755,19 @@ function get_package_manager() {
## 卸载 Docker Engine 原有版本软件包
function uninstall_original_version() {
# 先停止并禁用 Docker 服务
systemctl disable --now docker >/dev/null 2>&1
sleep 2s
if [ -x /usr/bin/docker ]; then
# 先停止并禁用 Docker 服务
systemctl disable --now docker >/dev/null 2>&1
sleep 2s
fi
# 确定需要卸载的软件包
local package_list
case "${SYSTEM_FACTIONS}" in
"${SYSTEM_DEBIAN}")
case "${SYSTEM_JUDGMENT}" in
"${SYSTEM_UBUNTU}" | "${SYSTEM_ZORIN}")
package_list="docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc"
;;
*)
package_list="docker.io docker-doc docker-compose podman-docker containerd runc"
;;
esac
package_list='docker* podman podman-docker containerd runc'
;;
"${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
case "${SYSTEM_JUDGMENT}" in
"${SYSTEM_FEDORA}" | "${SYSTEM_RHEL}")
package_list="docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc"
;;
*)
package_list="docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine"
;;
esac
package_list='docker* podman podman-docker runc'
;;
esac
# 卸载软件包并清理残留
@@ -759,12 +799,12 @@ function configure_docker_ce_mirror() {
fi
chmod a+r $file_keyring
## 添加源
echo "deb [arch=${SOURCE_ARCH} signed-by=${file_keyring}] https://${SOURCE}/linux/${SOURCE_BRANCH} ${SYSTEM_VERSION_CODENAME} stable" | tee $Dir_DebianExtendSource/docker.list >/dev/null 2>&1
echo "deb [arch=${SOURCE_ARCH} signed-by=${file_keyring}] ${WEB_PROTOCOL}://${SOURCE}/linux/${SOURCE_BRANCH} ${SYSTEM_VERSION_CODENAME} stable" | tee $Dir_DebianExtendSource/docker.list >/dev/null 2>&1
apt-get update
;;
"${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
yum-config-manager -y --add-repo https://${SOURCE}/linux/${SOURCE_BRANCH}/docker-ce.repo
sed -i "s|download.docker.com|${SOURCE}|g" $Dir_YumRepos/docker-ce.repo
sed -i "s|https://download.docker.com|${WEB_PROTOCOL}://${SOURCE}|g" $Dir_YumRepos/docker-ce.repo
## 兼容处理版本号
if [[ "${SYSTEM_JUDGMENT}" != "${SYSTEM_FEDORA}" ]]; then
local target_version
@@ -795,8 +835,9 @@ function install_docker_engine() {
grep -wf $DockerCEVersionFile $DockerCECLIVersionFile >$DockerVersionFile
;;
"${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
yum list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCEVersionFile
yum list docker-ce-cli --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCECLIVersionFile
local package_manager="$(get_package_manager)"
$package_manager list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCEVersionFile
$package_manager list docker-ce-cli --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCECLIVersionFile
grep -wf $DockerCEVersionFile $DockerCECLIVersionFile >$DockerVersionFile
;;
esac
@@ -805,6 +846,7 @@ function install_docker_engine() {
## 安装
function install_main() {
local target_docker_version
if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
case "${SYSTEM_FACTIONS}" in
"${SYSTEM_DEBIAN}")
@@ -817,31 +859,53 @@ function install_docker_engine() {
esac
else
export_version_list
echo -e "\n${GREEN} --------- 请选择你要安装的版本27.1.0 ---------- ${PLAIN}\n"
cat $DockerVersionFile
echo -e '\n注以上可供选择的安装版本由官方源提供此列表以外的版本则无法安装在当前操作系统上'
while true; do
local CHOICE=$(echo -e "\n${BOLD}└─ 请根据上面的列表,选择并输入你想要安装的具体版本号:${PLAIN}\n")
read -p "${CHOICE}" DOCKER_VERSION
echo ''
cat $DockerVersionFile | grep -Eqw "${DOCKER_VERSION}"
if [ $? -eq 0 ]; then
echo "${DOCKER_VERSION}" | grep -Eqw '[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}'
if [ $? -eq 0 ]; then
rm -rf $DockerVersionFile
break
else
echo -e "$ERROR 请输入正确的版本号!"
fi
else
echo -e "$ERROR 输入错误请重新输入!"
if [ ! -s $DockerVersionFile ]; then
rm -rf $DockerVersionFile
output_error "查询 Docker Engine 版本列表失败!"
fi
if [[ "${DESIGNATED_DOCKER_VERSION}" ]]; then
cat $DockerVersionFile | grep -Eq "^${DESIGNATED_DOCKER_VERSION}$"
if [ $? -ne 0 ]; then
rm -rf $DockerVersionFile
output_error "指定的 Docker Engine 版本不存在或不支持安装!"
fi
done
target_docker_version="${DESIGNATED_DOCKER_VERSION}"
else
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
local version_list=(
$(cat $DockerVersionFile | sort -t '.' -k1,1nr -k2,2nr -k3,3nr | tr '\n' ' ' | sed 's/ $//')
)
local mirror_list_name="version_list"
eval "interactive_select_mirror \"\${${mirror_list_name}[@]}\" \"\\n \${BOLD}请选择你想安装的版本:\${PLAIN}\\n\""
target_docker_version="${_SELECT_RESULT}"
echo -e "\n${GREEN}${PLAIN} ${BOLD}指定安装版本:${target_docker_version}${PLAIN}\n"
else
echo -e "\n${GREEN} --------- 请选择你要安装的版本27.4.0 ---------- ${PLAIN}\n"
cat $DockerVersionFile
while true; do
local CHOICE=$(echo -e "\n${BOLD}└─ 请根据上面的列表,选择并输入你想要安装的具体版本号:${PLAIN}\n")
read -p "${CHOICE}" target_docker_version
echo ''
cat $DockerVersionFile | grep -Eqw "${target_docker_version}"
if [ $? -eq 0 ]; then
echo "${target_docker_version}" | grep -Eqw '[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}'
if [ $? -eq 0 ]; then
break
else
echo -e "$ERROR 请输入正确的版本号!"
fi
else
echo -e "$ERROR 输入错误请重新输入!"
fi
done
fi
fi
rm -rf $DockerVersionFile
case "${SYSTEM_FACTIONS}" in
"${SYSTEM_DEBIAN}")
check_version="$(echo ${DOCKER_VERSION} | cut -c1-2)"
CheckSubversion="$(echo ${DOCKER_VERSION} | cut -c4-5)"
case ${check_version} in
check_version="$(echo ${target_docker_version} | cut -c1-2)"
CheckSubversion="$(echo ${target_docker_version} | cut -c4-5)"
case "${check_version}" in
18)
if [ ${CheckSubversion} == "09" ]; then
INSTALL_JUDGMENT="5:"
@@ -853,11 +917,11 @@ function install_docker_engine() {
INSTALL_JUDGMENT="5:"
;;
esac
apt-get install -y docker-ce=${INSTALL_JUDGMENT}${DOCKER_VERSION}* docker-ce-cli=5:${DOCKER_VERSION}* containerd.io docker-buildx-plugin docker-compose-plugin
apt-get install -y docker-ce=${INSTALL_JUDGMENT}${target_docker_version}* docker-ce-cli=5:${target_docker_version}* containerd.io docker-buildx-plugin docker-compose-plugin
;;
"${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
local package_manager="$(get_package_manager)"
$package_manager install -y docker-ce-${DOCKER_VERSION} docker-ce-cli-${DOCKER_VERSION} containerd.io docker-buildx-plugin docker-compose-plugin
$package_manager install -y docker-ce-${target_docker_version} docker-ce-cli-${target_docker_version} containerd.io docker-buildx-plugin docker-compose-plugin
;;
esac
fi
@@ -912,6 +976,36 @@ function install_docker_engine() {
fi
}
## 判断是否手动选择安装版本
if [[ -z "${INSTALL_LATESTED_DOCKER}" ]]; then
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
echo ''
interactive_select_boolean "${BOLD}是否安装最新版本的 Docker Engine ?${PLAIN}"
if [[ "${_SELECT_RESULT}" == "true" ]]; then
INSTALL_LATESTED_DOCKER="true"
else
INSTALL_LATESTED_DOCKER="false"
fi
else
local CHOICE_A=$(echo -e "\n${BOLD}└─ 是否安装最新版本的 Docker Engine ? [Y/n] ${PLAIN}")
read -p "${CHOICE_A}" INPUT
[[ -z "${INPUT}" ]] && INPUT=Y
case $INPUT in
[Yy] | [Yy][Ee][Ss])
INSTALL_LATESTED_DOCKER="true"
;;
[Nn] | [Nn][Oo])
INSTALL_LATESTED_DOCKER="false"
;;
*)
INSTALL_LATESTED_DOCKER="true"
echo -e "\n$WARN 输入错误,默认安装最新版本!"
;;
esac
fi
echo ''
fi
## 判定是否已安装
case "${SYSTEM_FACTIONS}" in
"${SYSTEM_DEBIAN}")
@@ -923,87 +1017,29 @@ function install_docker_engine() {
esac
if [ $? -eq 0 ]; then
export_version_list
DOCKER_INSTALLED_VERSION="$(docker -v | grep -Eo "[0-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}")"
DOCKER_VERSION_LATEST="$(cat $DockerVersionFile | head -n 1)"
if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
if [[ "${DOCKER_INSTALLED_VERSION}" == "${DOCKER_VERSION_LATEST}" ]]; then
if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
echo -e "\n$COMPLETE 检测到已安装 Docker Engine 最新版本,跳过安装"
rm -rf $DockerVersionFile
change_docker_registry_mirror
systemctl enable --now docker >/dev/null 2>&1
check_version
run_end
exit
else
echo ''
interactive_select_boolean "${BOLD}检测到已安装 Docker Engine 最新版本,是否继续安装其它版本?${PLAIN}"
fi
else
echo ''
if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
interactive_select_boolean "${BOLD}检测到已安装 Docker Engine 旧版本,是否覆盖安装为最新版本?${PLAIN}"
else
interactive_select_boolean "${BOLD}检测到已安装 Docker Engine 旧版本,是否继续安装其它版本?${PLAIN}"
fi
fi
if [[ "${_SELECT_RESULT}" == "true" ]]; then
uninstall_original_version
install_main
[ $? -ne 0 ] && output_error "安装 Docker Engine 失败"
fi
else
if [[ "${DOCKER_INSTALLED_VERSION}" == "${DOCKER_VERSION_LATEST}" ]]; then
if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
echo -e "\n$COMPLETE 检测到已安装 Docker Engine 最新版本,跳过安装"
rm -rf $DockerVersionFile
change_docker_registry_mirror
systemctl enable --now docker >/dev/null 2>&1
check_version
run_end
exit
else
local CHOICE=$(echo -e "\n${BOLD}└─ 检测到已安装 Docker Engine 最新版本,是否继续安装其它版本? [Y/n] ${PLAIN}")
fi
else
if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
local CHOICE=$(echo -e "\n${BOLD}└─ 检测到已安装 Docker Engine 旧版本,是否覆盖安装为最新版本? [Y/n] ${PLAIN}")
else
local CHOICE=$(echo -e "\n${BOLD}└─ 检测到已安装 Docker Engine 旧版本,是否继续安装其它版本? [Y/n] ${PLAIN}")
fi
fi
read -p "${CHOICE}" INPUT
[[ -z "${INPUT}" ]] && INPUT=Y
case $INPUT in
[Yy] | [Yy][Ee][Ss])
uninstall_original_version
install_main
[ $? -ne 0 ] && output_error "安装 Docker Engine 失败"
;;
[Nn] | [Nn][Oo]) ;;
*)
echo -e "\n$WARN 输入错误,默认不覆盖安装!\n"
;;
esac
fi
local current_docker_version="$(docker -v | grep -Eo "[0-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}")"
local latest_docker_version="$(cat $DockerVersionFile | head -n 1)"
rm -rf $DockerVersionFile
else
uninstall_original_version
install_main
[ $? -ne 0 ] && output_error "安装 Docker Engine 失败"
if [[ "${current_docker_version}" == "${latest_docker_version}" ]] && [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
echo -e "\n$TIP 检测到系统中的 Docker Engine 已经是最新的版本,跳过安装"
change_docker_registry_mirror
return
fi
fi
uninstall_original_version
install_main
[ $? -ne 0 ] && output_error "安装 Docker Engine 失败!"
change_docker_registry_mirror
systemctl enable --now docker >/dev/null 2>&1
}
## 查看版本并验证安装结果
function check_version() {
if [ -x /usr/bin/docker ]; then
systemctl enable --now docker >/dev/null 2>&1
echo -en "\n当前安装版本:"
docker -v
if [ $? -eq 0 ]; then
echo -e "Compose 版本:$(docker compose version 2>&1)"
echo -e " $(docker compose version 2>&1)"
echo -e "\n$COMPLETE 安装完成"
else
echo -e "\n$ERROR 安装失败"
@@ -1154,6 +1190,16 @@ function interactive_select_boolean() {
echo -e "╰─ \033[2m○ 是 / \033[0m\033[32m●\033[0m 否"
fi
}
function draw_menu_confirmed() {
tput rc
echo -e "╭─ ${message}"
echo -e ""
if [ "$selected" -eq 0 ]; then
echo -e "╰─ \033[32m●\033[0m \033[1m是\033[0m\033[2m / ○ 否\033[0m"
else
echo -e "╰─ \033[2m○ 是 / \033[0m\033[32m●\033[0m \033[1m否\033[0m"
fi
}
function read_key() {
IFS= read -rsn1 key
if [[ $key == $'\x1b' ]]; then
@@ -1184,6 +1230,7 @@ function interactive_select_boolean() {
;;
"")
# Enter 键
draw_menu_confirmed
break
;;
*) ;;

View File

@@ -1,5 +1,5 @@
---
title: 脚本使换源更简单
title: 一键脚本使换源更简单
description: GNU/Linux 更换系统软件源脚本及 Docker 安装脚本
comments: true
glightbox: false
@@ -16,9 +16,9 @@ hide:
![](assets/images/brand/light/2.png#only-light){ width="300" }
![](assets/images/brand/dark/2.png#only-dark){ width="300" }
<figcaption>GNU/Linux 更换系统软件源脚本及 Docker 安装脚本</figcaption>
<figcaption>脚本使换源更简单</figcaption>
<figcaption>一键脚本使换源更简单</figcaption>
</figure>
<figure style="margin: 0; width: 500px; display: flex; flex-direction: column; justify-content: center" markdown>
<figure class="home-cmd" style="margin: 0; display: flex; flex-direction: column; justify-content: center" markdown>
=== "GNU/Linux"
``` { .bash title="一键命令" }
@@ -30,7 +30,6 @@ hide:
``` { .bash title="一键命令" }
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
```
</figure>
</div>
@@ -38,6 +37,13 @@ hide:
<div class="grid cards" style="height: fit-content" markdown>
- :material-thumb-up-outline:{ .lg .middle } __轻松使用__
---
只需要一行命令就能直接运行,无需安装任何依赖
文档提供了各种场景的解决方案Linux 初学者也能轻松上手
- :material-source-branch:{ .lg .middle } __多元软件源适配__
---
@@ -49,7 +55,7 @@ hide:
---
无需了解相关技术,文档提供了全面的知识储备和操作指引,轻松上手
无需了解相关技术,文档提供了全面的知识储备和操作指引
文档还提供了一些常见问题的解决方法以及一些高级用法的示例
- :material-vector-polyline:{ .lg .middle } __广泛的系统支持__
@@ -64,7 +70,7 @@ hide:
---
脚本使换源变得更简单,默认交互运行,逐步引导用户选择软件源配置
同时提供了强大的命令选项,可实现各种定制需求和无交互操作
同时提供了强大的命令选项,可实现各种高级定制需求
- :material-pencil-ruler-outline:{ .lg .middle } __高度可定制__
@@ -116,3 +122,19 @@ hide:
</div>
[开 始 使 用](use/index.md){ .md-button .md-button--primary } &nbsp; [查看软件源列表](mirrors/index.md){ .md-button }
<div class="md-nav__sponsor-bottom" style="border-top: none; margin-top: 0">
<div class="sponsor-label">
<strong>赞助商</strong>
</div>
<div class="sponsor-wrapper sponsor-flex-wrapper">
<a class="sponsor-item sponsor-flex-item" target="_blank" href="https://www.dkdun.cn/aff/VAWGETUL" title="林枫云">
<img src="/assets/images/sponsor/linfengyun-light.png#only-light" alt="林枫云" style="width: 60%" />
<img src="/assets/images/sponsor/linfengyun-dark.png#only-dark" alt="林枫云" style="width: 60%" />
</a>
<a class="sponsor-item sponsor-flex-item" target="_blank" href="https://arcadia.cool" title="Arcadia 一站式代码运维平台">
<img src="/assets/images/sponsor/arcadia-light.png#only-light" alt="Arcadia 一站式代码运维平台" style="width: 60%" />
<img src="/assets/images/sponsor/arcadia-dark.png#only-dark" alt="Arcadia 一站式代码运维平台" style="width: 60%" />
</a>
</div>
</div>

View File

@@ -33,7 +33,7 @@ hide:
如果这里没有想使用的镜像站那可以看看其它运行模式和命令选项。软件源的速度区分刷新速度和下行速率,后者才是关键,具体请结合实际地理位置选择尝试,还可以通过[辅助工具网站](#工具网站)进行一些测试
:material-thumb-up-outline: 使用建议:速度上推荐 `中科大``字节跳动(火山引擎)`,地域兼容性上推荐 `阿里云``腾讯云`,境外、海外或复杂网络环境下不建议使用 `清华(TUNA)` 等容易阻断的镜像站
:material-thumb-up-outline: 使用建议:速度上推荐 `中科大``字节跳动(火山引擎)`,地域兼容性上推荐 `阿里云``腾讯云`软件源种类上推荐 `南京大学`境外、海外或复杂网络环境下不建议使用 `清华(TUNA)` 等容易阻断的镜像站
??? note "中国大陆教育网(点击展开查看)"

View File

@@ -9,6 +9,10 @@ hide:
## :fontawesome-brands-docker:{style="color: #086dd7"} Docker 安装脚本
???+ tip inline end "友情提示"
该脚本近期进行了大量优化,代码逻辑变动较大,如有问题请及时反馈
<table>
<tr>
<td><a href="https://www.debian.org" target="_blank"><img src="/assets/images/icon/debian.svg" width="16" height="16" style="vertical-align: -0.35em"></a> Debian</td>
@@ -68,9 +72,7 @@ hide:
bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrors@main/DockerInstallation.sh)
```
支持 `选择或更换软件源以及镜像仓库`、`安装指定版本`、`重装` 等功能,支持 ARM 架构处理器
脚本参考 [官方文档](https://docs.docker.com/engine/install) 使用系统包管理工具安装,集成安装 [`Docker Engine`](https://docs.docker.com/engine) 和 [`Docker Compose (插件)`](https://docs.docker.com/compose/install/linux)
脚本参考 [官方文档](https://docs.docker.com/engine/install) 使用系统包管理工具安装,集成安装 [`Docker Engine`](https://docs.docker.com/engine) 和 [`Docker Compose (插件)`](https://docs.docker.com/compose/install/linux)支持选择或更换软件源以及镜像仓库安装指定版本、重装等功能,支持 ARM 架构处理器
> 注Docker Compose 自 V2 版本起开始作为 Docker CLI 的一部分,不再需要单独安装,请使用 `docker compose` 命令替代 `docker-compose`
@@ -81,19 +83,90 @@ hide:
由于一些不可抗力的因素,目前国内网络环境一般无法正常访问 Docker Hub 因此无法拉取镜像,使用推荐的镜像源勉强能够使用不过速度可能会很慢
- ### 命令选项
- ### 命令选项(高级用法)
| 名称 | 含义 | 选项值 |
| :-: | :-: | :-: |
| `--source` | 指定 `Docker CE` 源地址(域名或IP) | 地址 |
| `--source-registry` | 指定镜像仓库地址(域名或IP) | 地址 |
| `--codename` | 指定 Debian 系操作系统的版本代号 | 代号名称 |
| `--source` | 指定 `Docker CE` 源地址(域名或IP) | `地址` |
| `--source-registry` | 指定镜像仓库地址(域名或IP) | `地址` |
| `--branch` | 指定 Docker CE 源仓库 | `仓库名(详见下方文档)` |
| `--codename` | 指定 Debian 系操作系统的版本代号 | `代号名称` |
| `--designated-version` | 指定 `Docker CE` 安装版本 | `版本号(详见下方文档)` |
| `--protocol` | 指定 `Docker CE` 源的 WEB 协议 | `http` 或 `https` |
| `--install-latest` | 是否安装最新版本的 Docker Engine | `true` 或 `false` |
| `--close-firewall` | 是否关闭防火墙 | `true` 或 `false` |
| `--clean-screen` | 是否在运行前清除屏幕上的所有内容 | `true` 或 `false` |
| `--ignore-backup-tips` | 忽略覆盖备份提示(即不覆盖备份) | 无 |
> 软件源完整格式 `<WEB协议>://<软件源地址域名或IP>/<软件源仓库路径>`
> 软件源完整格式 `<WEB协议>://<软件源地址(域名或IP)>/<软件源仓库(路径)>`
- #### 指定 Docker CE 软件源地址
``` { .bash .no-copy }
bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --source mirror.example.com/docker-ce
```
> 注意该地址路径需要包含镜像站的 Docker CE 软件源仓库路径即 `docker-ce`
- #### 指定镜像仓库地址
``` { .bash .no-copy }
bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --source-registry registry.example.com
```
- #### 指定 Docker CE 软件源仓库
一般无需指定,脚本默认会自动判断
``` { .bash .no-copy }
bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --branch centos
```
> 仓库名是固定的,目前只有 `centos` `debian` `fedora` `raspbian` `rhel` `sles` `static` `ubuntu` 这几个
> 具体详见 [官方安装文档](https://docs.docker.com/engine/install) 和 [Docker CE 官方仓库](https://download.docker.com/linux)
- #### 指定 Docker CE 安装版本
指定安装版本时会忽略 `是否安装最新版本` 的命令选项,格式为 `主版本.次版本.补丁版本`,例如 `27.4.1`。
``` { .bash .no-copy }
bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --designated-version 27.0.0
```
> 如果指定的版本不存在或者不支持当前系统,届时脚本会报错跳出
??? tip "如何查看版本列表?"
=== "Debian 系"
``` bash
apt-cache madison docker-ce | awk '{print $3}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" | sort -t '.' -k1,1nr -k2,2nr -k3,3nr
```
> `Debian` &nbsp; `Ubuntu` &nbsp; `Kali` &nbsp; `Linux Mint` &nbsp; `Deepin` &nbsp; `Zorin OS` &nbsp; `Armbian` &nbsp; `Proxmox`
=== "RedHat 系 / openEuler / OpenCloudOS / Anolis OS"
``` bash
yum list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" | sort -t '.' -k1,1nr -k2,2nr -k3,3nr
```
> `Red Hat Enterprise Linux` &nbsp; `CentOS` &nbsp; `Rocky Linux` &nbsp; `AlmaLinux` &nbsp; `Fedora` &nbsp; `openEuler` &nbsp; `OpenCloudOS` &nbsp; `Anolis OS`
未出现在该列表中的版本则不支持通过本脚本安装,如果获取不到版本列表说明你当前的系统环境还没有正确配置 Docker CE 软件源(运行脚本时不存在该问题)
- #### 无人值守(自动化)
不通过交互完成安装操作,至少需要使用如下命令选项来实现,建议熟悉后再使用
``` { .bash .no-copy title="参考命令" }
bash <(curl -sSL https://linuxmirrors.cn/docker.sh) \
--source mirror.example.com \
--source-registry registry.hub.docker.com \
--protocol http \
--use-intranet-source false \
--install-latest true \
--close-firewall true \
--ignore-backup-tips
```
- ### 关于服务报错无法启动

View File

@@ -6,6 +6,22 @@ hide:
- footer
---
<div class="md-nav__sponsor-bottom" style="border-top: none; margin-top: 0">
<div class="sponsor-label">
<strong>赞助商</strong>
</div>
<div class="sponsor-wrapper sponsor-flex-wrapper">
<a class="sponsor-item sponsor-flex-item" target="_blank" href="https://www.dkdun.cn/aff/VAWGETUL" title="林枫云">
<img src="/assets/images/sponsor/linfengyun-light.png#only-light" alt="林枫云" style="width: 60%" />
<img src="/assets/images/sponsor/linfengyun-dark.png#only-dark" alt="林枫云" style="width: 60%" />
</a>
<a class="sponsor-item sponsor-flex-item" target="_blank" href="https://arcadia.cool" title="Arcadia 一站式代码运维平台">
<img src="/assets/images/sponsor/arcadia-light.png#only-light" alt="Arcadia 一站式代码运维平台" style="width: 60%" />
<img src="/assets/images/sponsor/arcadia-dark.png#only-dark" alt="Arcadia 一站式代码运维平台" style="width: 60%" />
</a>
</div>
</div>
# 成为赞助商
<button class="md-button md-button--primary" style="padding: 6px 20px 0 20px" title="https://afdian.com/a/SuperManito" onclick="window.open('https://afdian.com/a/SuperManito')">

View File

@@ -43,6 +43,10 @@
}
}
.home-cmd pre>code {
padding-right: 3em;
}
.heart {
animation: heart 1000ms infinite;
}
@@ -108,8 +112,27 @@
vertical-align: middle;
}
.sponsor-flex-wrapper {
display: flex;
flex-wrap: wrap;
gap: 1rem;
justify-content: center;
}
.sponsor-flex-item {
flex: 0 1 calc(33.33% - 1rem);
min-width: 200px;
max-width: 300px;
}
@media screen and (max-width: 960px) {
.sponsor-flex-item {
flex: 0 1 calc(50% - 1rem);
}
}
@media screen and (max-width: 768px) {
.md-nav__sponsor-bottom {
display: none;
}
}
}

View File

@@ -13,15 +13,15 @@
<strong>赞助商</strong>
</div>
<div class="sponsor-wrapper">
<a href="https://www.dkdun.cn/aff/VAWGETUL" target="_blank" class="sponsor-item">
<a class="sponsor-item" target="_blank" href="https://www.dkdun.cn/aff/VAWGETUL" title="林枫云">
<img src="/assets/images/sponsor/linfengyun-light.png#only-light" alt="林枫云" style="width: 60%" />
<img src="/assets/images/sponsor/linfengyun-dark.png#only-dark" alt="林枫云" style="width: 60%" />
</a>
<a href="https://arcadia.cool" target="_blank" class="sponsor-item">
<a class="sponsor-item" target="_blank" href="https://arcadia.cool" title="Arcadia 一站式代码运维平台">
<img src="/assets/images/sponsor/arcadia-light.png#only-light" alt="Arcadia 一站式代码运维平台" style="width: 60%" />
<img src="/assets/images/sponsor/arcadia-dark.png#only-dark" alt="Arcadia 一站式代码运维平台" style="width: 60%" />
</a>
<a href="/sponsor/" target="_blank" class="sponsor-item">
<a class="sponsor-item" target="_blank" href="/sponsor/">
<span style="font-size: 0.6rem">
<strong>成为赞助商</strong>
</span>

View File

@@ -118,25 +118,25 @@ hide:
---
切换命令为 `sudo -i` 或 `su root`。不同系统使用的命令不同,因为有些系统没有在初始安装时为 ROOT 账户设置密码(例如 Ubuntu,故需要使用 `sudo -i` 命令来切换至 ROOT
切换命令为 `sudo -i` 或 `su root`。不同系统使用的命令不同,因为部分系统没有在初始安装时为 ROOT 账户设置密码(例如 Ubuntu或系统默认禁止 ROOT 用户登录
- :material-numeric-2:{style="color: #3CA7E5" .lg} __建议使用 `SSH` 远程工具__
- :material-numeric-2:{style="color: #3CA7E5" .lg} __建议使用支持 `SSH` 的现代化终端应用__
---
如果你使用的系统终端界面无法正常显示中文内容那么将导致无法查看交互内容部分系统会自动开启 SSH 服务,否则请参考 [_关于开启 SSH 远程登录的方法_](#关于开启-ssh-远程登录的方法)。
如果你系统命令行界面的中文显示乱码那么将导致无法查看交互内容,此外部分系统 GUI 图形界面的终端应用可能存在一些无法预料的显示问题。关于 SSH 服务部分系统会自动开启,否则请参考[开启方法](#关于开启-ssh-远程登录的方法)。
- :material-numeric-3:{style="color: #3CA7E5" .lg} __如果是在新系统上首次执行脚本__
- :material-numeric-3:{style="color: #3CA7E5" .lg} __如果是在新系统上首次执行脚本__
---
当前执行方式依赖 `curl` 指令获取脚本内容并执行,但部分操作系统没有预装此软件包,届时则会报错 `Command not found`,安装方法详见下方 [_关于报错 Command not found_](#关于报错-command-not-found)。
- :material-numeric-4:{style="color: #3CA7E5" .lg} __脚本需要通过交互进行配置__
- :material-numeric-4:{style="color: #3CA7E5" .lg} __脚本运行期间需要交互选择配置__
---
交互主要有两种呈现方式,一种是铺满全屏竖向选择软件源地址的列表,另一种是横向选择 “是/否” 的选项。请通过键盘方向键或 `WASD` 控制选项、回车键确认
请通过方向键 ++arrow-up++++arrow-down++++arrow-left++++arrow-right++ 或 ++w++++a++++s++++d++ 控制选项并按 ++enter++ 回车键确认。如果发现交互异常那么请改变终端软件的窗口大小后重试,窗口尽量不要太小
</div>
@@ -324,13 +324,21 @@ hide:
- ### 关于调用脚本的互联网位置
项目利用 [GitHub Action](https://github.com/SuperManito/LinuxMirrors/blob/main/.github/workflows/build-docs.yml#L24) 在每次提交后自动拷贝源码到文档目录作为网站资源发布,网站托管于知名 CDN 云服务商几乎没有被劫持的风险放心使用
项目利用 [GitHub Action](https://github.com/SuperManito/LinuxMirrors/blob/main/.github/workflows/build-docs.yml#L24) 在每次提交后自动拷贝源码到文档目录作为网站资源发布,网站托管于知名 CDN 云服务商几乎没有被劫持的风险放心使用
当然你也可以使用代码托管仓库的原始地址来调用,这里只是想告诉你为什么会有几个不同的地址,默认的官网地址更易于访问和记忆
当然你也可以使用代码托管仓库的原始地址来调用,这里只是想告诉你为什么会有几个不同的地址,默认的官网地址更易于记忆和访问。
- ### 关于软件源下载速度相关问题
首先在[软件源列表](../mirrors/index.md)页面的使用帮助有使用推荐,这是根据以往经验总结出来的,但总有用户在纠结软件源速度的问题。
软件源(镜像站)的网络延迟即 `Ping` 与下载速度没有太大的关联,双方地理位置间隔的远近不代表实际体验,有些镜像站下行带宽很高但实际测速却并不理想,因为这与镜像站的并发性能和负载策略有关。
网上也有很多基于 C、Python 编写的镜像站测速开源脚本,而本项目脚本基于 Bash Shell 编写且不依赖任何第三方库Bash 是 Linux 运维中最常用的脚本语言并且绝大部分发行版都会预装,这意味着用户不需要安装任何环境就能直接运行,这种便利性是其它高级语言无法替代的,不过目前来看 Bash 脚本可能无法实现精准测速的功能。
- ### 关于未启用的软件源
脚本遵循系统默认设置即没有启用的软件源(仓库)不会在运行完本脚本后被启用,但是它们也随脚本更换了目标软件源地址,如果你有使用需求请阅读下面的启用方法
脚本遵循系统默认设置即没有启用的软件源(仓库)不会在运行完本脚本后被启用,但是它们也随脚本更换了目标软件源地址,具体启用方法如下:
=== "Debian 系 / openKylin"
@@ -383,7 +391,7 @@ hide:
| `--ignore-backup-tips` | 忽略覆盖备份提示(即不覆盖备份) | 无 |
| `--help` | 查看帮助菜单 | 无 |
> 软件源完整格式 `<WEB协议>://<软件源地址域名或IP>/<软件源仓库路径>`
> 软件源完整格式 `<WEB协议>://<软件源地址(域名或IP)>/<软件源仓库(路径)>`
接下来是一些高级用法的举例

View File

@@ -1,3 +1,3 @@
mkdocs-material==9.5.48
mkdocs-material==9.5.49
mkdocs-glightbox==0.4.0
mkdocs-exclude-search==0.6.6