源检测自动换源
This commit is contained in:
287
install.sh
287
install.sh
@@ -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 使用 -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 <<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
|
||||||
|
|||||||
Reference in New Issue
Block a user