From 72bbddd0aa5dae8a2f92ad8c7476d04741a0fc25 Mon Sep 17 00:00:00 2001 From: yoyo Date: Wed, 3 Dec 2025 17:26:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=BA=90=E6=A3=80=E6=B5=8B=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=8D=A2=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.sh | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) diff --git a/install.sh b/install.sh index 0e7bdac..776ddea 100755 --- a/install.sh +++ b/install.sh @@ -74,6 +74,290 @@ detect_system() { 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 使用 -W,Linux 使用 -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 < /dev/null </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 < /dev/null < /dev/null < /dev/null <