源检测自动换源

This commit is contained in:
2025-12-03 17:26:52 +08:00
parent 85047df147
commit 72bbddd0aa

View File

@@ -74,6 +74,290 @@ detect_system() {
echo -e "${BLUE}检测到系统: $OS $OS_VERSION ($ARCH)${NC}" echo -e "${BLUE}检测到系统: $OS $OS_VERSION ($ARCH)${NC}"
} }
# 检测并选择最快的镜像源
detect_fastest_mirror() {
echo -e "${BLUE}检测最快的镜像源...${NC}"
# Ubuntu/Debian 镜像源列表
UBUNTU_MIRRORS=(
"mirrors.aliyun.com"
"mirrors.tuna.tsinghua.edu.cn"
"mirrors.ustc.edu.cn"
"mirrors.huaweicloud.com"
"mirrors.163.com"
"archive.ubuntu.com"
)
# CentOS/RHEL 镜像源列表
CENTOS_MIRRORS=(
"mirrors.aliyun.com"
"mirrors.tuna.tsinghua.edu.cn"
"mirrors.ustc.edu.cn"
"mirrors.huaweicloud.com"
"mirrorlist.centos.org"
)
FASTEST_MIRROR=""
FASTEST_TIME=999999
# 根据系统类型选择镜像源列表
if [ "$OS" = "ubuntu" ] || [ "$OS" = "debian" ]; then
MIRRORS=("${UBUNTU_MIRRORS[@]}")
MIRROR_TYPE="ubuntu"
elif [ "$OS" = "centos" ] || [ "$OS" = "rhel" ] || [ "$OS" = "rocky" ] || [ "$OS" = "almalinux" ]; then
MIRRORS=("${CENTOS_MIRRORS[@]}")
MIRROR_TYPE="centos"
else
echo -e "${YELLOW}⚠ 未知系统类型,跳过镜像源检测${NC}"
return
fi
# 检查是否有测试工具
if ! command -v ping > /dev/null 2>&1 && ! command -v curl > /dev/null 2>&1; then
echo -e "${YELLOW}⚠ 未找到 ping 或 curl 命令,跳过镜像源检测,使用默认源${NC}"
return
fi
# 测试每个镜像源的速度
echo -e "${BLUE}正在测试镜像源速度...${NC}"
for mirror in "${MIRRORS[@]}"; do
echo -n " 测试 ${mirror}... "
# 优先使用 ping 测试延迟(取平均值)
if command -v ping > /dev/null 2>&1; then
# ping 3次取平均时间macOS 使用 -WLinux 使用 -w
if [[ "$OSTYPE" == "darwin"* ]]; then
PING_RESULT=$(ping -c 3 -W 2000 "$mirror" 2>/dev/null | grep "avg" | awk -F'/' '{print $5}')
else
PING_RESULT=$(ping -c 3 -w 2 "$mirror" 2>/dev/null | grep "avg" | awk -F'/' '{print $5}')
fi
if [ -n "$PING_RESULT" ] && [ "$PING_RESULT" != "0" ]; then
TIME=$(echo "$PING_RESULT" | awk '{print int($1)}')
echo -e "${GREEN}${TIME}ms${NC}"
if [ "$TIME" -lt "$FASTEST_TIME" ] 2>/dev/null; then
FASTEST_TIME=$TIME
FASTEST_MIRROR=$mirror
fi
else
echo -e "${RED}超时${NC}"
fi
elif command -v curl > /dev/null 2>&1; then
# 如果没有 ping 命令,使用 curl 测试连接时间
TIME=$(curl -o /dev/null -s -w "%{time_total}" --connect-timeout 3 "http://${mirror}" 2>/dev/null | awk '{print int($1*1000)}')
if [ -n "$TIME" ] && [ "$TIME" -gt 0 ] && [ "$TIME" -lt 10000 ]; then
echo -e "${GREEN}${TIME}ms${NC}"
if [ "$TIME" -lt "$FASTEST_TIME" ]; then
FASTEST_TIME=$TIME
FASTEST_MIRROR=$mirror
fi
else
echo -e "${RED}超时${NC}"
fi
fi
done
if [ -z "$FASTEST_MIRROR" ]; then
echo -e "${YELLOW}⚠ 无法检测到可用镜像源,使用默认源${NC}"
return
fi
echo -e "${GREEN}✓ 最快镜像源: ${FASTEST_MIRROR} (${FASTEST_TIME}ms)${NC}"
# 配置镜像源
if [ "$MIRROR_TYPE" = "ubuntu" ]; then
configure_ubuntu_mirror "$FASTEST_MIRROR"
elif [ "$MIRROR_TYPE" = "centos" ]; then
configure_centos_mirror "$FASTEST_MIRROR"
fi
}
# 配置 Ubuntu/Debian 镜像源
configure_ubuntu_mirror() {
local mirror="$1"
local sources_file="/etc/apt/sources.list"
local sources_backup="/etc/apt/sources.list.backup.$(date +%Y%m%d_%H%M%S)"
# 备份原始源配置
if [ -f "$sources_file" ] && [ ! -f "$sources_backup" ]; then
echo -e "${BLUE}备份原始源配置...${NC}"
sudo cp "$sources_file" "$sources_backup"
fi
# 检测 Ubuntu 版本代号
if [ -f /etc/os-release ]; then
. /etc/os-release
CODENAME=$(echo "$VERSION_CODENAME" | tr '[:upper:]' '[:lower:]')
if [ -z "$CODENAME" ]; then
# 尝试从版本号推断
case "$VERSION_ID" in
"22.04") CODENAME="jammy" ;;
"20.04") CODENAME="focal" ;;
"18.04") CODENAME="bionic" ;;
*) CODENAME="jammy" ;; # 默认使用 jammy
esac
fi
else
CODENAME="jammy" # 默认
fi
# 检测是 Ubuntu 还是 Debian
if [ "$OS" = "ubuntu" ]; then
echo -e "${BLUE}配置 Ubuntu 镜像源: ${mirror}${NC}"
sudo tee "$sources_file" > /dev/null <<EOF
# LinkMaster Node 自动配置的镜像源
deb https://${mirror}/ubuntu/ ${CODENAME} main restricted universe multiverse
deb https://${mirror}/ubuntu/ ${CODENAME}-updates main restricted universe multiverse
deb https://${mirror}/ubuntu/ ${CODENAME}-backports main restricted universe multiverse
deb https://${mirror}/ubuntu/ ${CODENAME}-security main restricted universe multiverse
EOF
elif [ "$OS" = "debian" ]; then
# Debian 版本检测
if [ -f /etc/debian_version ]; then
DEBIAN_VERSION=$(cat /etc/debian_version | cut -d'.' -f1)
case "$DEBIAN_VERSION" in
"12") CODENAME="bookworm" ;;
"11") CODENAME="bullseye" ;;
"10") CODENAME="buster" ;;
*) CODENAME="bookworm" ;;
esac
else
CODENAME="bookworm"
fi
echo -e "${BLUE}配置 Debian 镜像源: ${mirror}${NC}"
sudo tee "$sources_file" > /dev/null <<EOF
# LinkMaster Node 自动配置的镜像源
deb https://${mirror}/debian/ ${CODENAME} main contrib non-free
deb https://${mirror}/debian/ ${CODENAME}-updates main contrib non-free
deb https://${mirror}/debian-security ${CODENAME}-security main contrib non-free
EOF
fi
echo -e "${GREEN}✓ 镜像源配置完成${NC}"
}
# 配置 CentOS/RHEL 镜像源
configure_centos_mirror() {
local mirror="$1"
local repo_dir="/etc/yum.repos.d"
local backup_dir="/etc/yum.repos.d/backup.$(date +%Y%m%d_%H%M%S)"
# 备份原始源配置
if [ -d "$repo_dir" ] && [ ! -d "$backup_dir" ]; then
echo -e "${BLUE}备份原始源配置...${NC}"
sudo mkdir -p "$backup_dir"
sudo cp -r "$repo_dir"/*.repo "$backup_dir/" 2>/dev/null || true
fi
# 检测系统类型和版本
local release_file="/etc/redhat-release"
local os_version=""
local os_name="centos"
if [ -f "$release_file" ]; then
RELEASE_CONTENT=$(cat "$release_file")
os_version=$(echo "$RELEASE_CONTENT" | grep -oE '[0-9]+' | head -1)
# 检测系统类型
if echo "$RELEASE_CONTENT" | grep -qi "rocky"; then
os_name="rocky"
elif echo "$RELEASE_CONTENT" | grep -qi "almalinux"; then
os_name="almalinux"
elif echo "$RELEASE_CONTENT" | grep -qi "centos"; then
os_name="centos"
fi
else
os_version="7"
fi
echo -e "${BLUE}配置 ${os_name} ${os_version} 镜像源: ${mirror}${NC}"
# 备份并禁用所有现有仓库
sudo find "$repo_dir" -name "*.repo" -not -name "*.backup" -exec sudo mv {} {}.backup \; 2>/dev/null || true
# 根据系统类型创建新的仓库配置
if [ "$os_name" = "rocky" ]; then
# Rocky Linux
sudo tee "$repo_dir/Rocky-Base.repo" > /dev/null <<EOF
[baseos]
name=Rocky Linux \$releasever - BaseOS - ${mirror}
baseurl=https://${mirror}/rocky/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rocky
[appstream]
name=Rocky Linux \$releasever - AppStream - ${mirror}
baseurl=https://${mirror}/rocky/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rocky
EOF
elif [ "$os_name" = "almalinux" ]; then
# AlmaLinux
sudo tee "$repo_dir/AlmaLinux-Base.repo" > /dev/null <<EOF
[baseos]
name=AlmaLinux \$releasever - BaseOS - ${mirror}
baseurl=https://${mirror}/almalinux/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux
[appstream]
name=AlmaLinux \$releasever - AppStream - ${mirror}
baseurl=https://${mirror}/almalinux/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux
EOF
elif [ "$os_version" = "7" ]; then
# CentOS 7
sudo tee "$repo_dir/CentOS-Base.repo" > /dev/null <<EOF
[base]
name=CentOS-\$releasever - Base - ${mirror}
baseurl=https://${mirror}/centos/\$releasever/os/\$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-\$releasever - Updates - ${mirror}
baseurl=https://${mirror}/centos/\$releasever/updates/\$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-\$releasever - Extras - ${mirror}
baseurl=https://${mirror}/centos/\$releasever/extras/\$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
else
# CentOS Stream 8/9 或其他版本
sudo tee "$repo_dir/CentOS-Base.repo" > /dev/null <<EOF
[baseos]
name=CentOS-\$releasever - BaseOS - ${mirror}
baseurl=https://${mirror}/centos-stream/\$stream/BaseOS/\$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[appstream]
name=CentOS-\$releasever - AppStream - ${mirror}
baseurl=https://${mirror}/centos-stream/\$stream/AppStream/\$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF
fi
echo -e "${GREEN}✓ 镜像源配置完成${NC}"
}
# 安装系统依赖 # 安装系统依赖
install_dependencies() { install_dependencies() {
echo -e "${BLUE}安装系统依赖...${NC}" echo -e "${BLUE}安装系统依赖...${NC}"
@@ -546,6 +830,9 @@ main() {
uninstall_service uninstall_service
fi fi
# 检测并配置最快的镜像源(在安装依赖之前)
detect_fastest_mirror
install_dependencies install_dependencies
build_from_source build_from_source
create_service create_service