$ PC530 常用脚本

Linux 系统 TCP BBR 网络加速脚本

分类:ubuntu 性能优化 · 文件名:tcpx.sh · 收藏:0

使用示例

Ubuntu / Linux

bash <(curl -fsSL https://pc530.com/scripts/read/tcpx.sh)

WINDOWS PowerShell

irm "https://pc530.com/scripts/read/tcpx.sh" | iex

说明

🚀 Linux TCP BBR 加速脚本使用指南

TCP BBR(Bottleneck Bandwidth and RTT)是 Google 开发并开源的高效拥塞控制算法。开启它能显著提升 Linux 服务器的网络吞吐量降低延迟,特别适合用于高延迟、有丢包的跨境网络环境。


🛠️ 安装与运行

登录你的 Linux 服务器(SSH),直接复制并执行以下命令:

wget -N --no-check-certificate "https://pc530.com/scripts/tcpx.sh" && chmod +x tcpx.sh && ./tcpx.sh
> **💡 提示:** 如果提示 `wget: command not found`,请先根据你的系统执行 `apt install wget -y` 或 `yum install wget -y`。

---

## 📖 核心功能与菜单说明

运行脚本后,你会看到一个交互式菜单,主要分为以下几个核心板块:

### 1. 内核管理(切换原版或加速内核)

BBR 需要特定的 Linux 内核支持。脚本提供了多种内核一键安装:

* **安装 BBR 原版内核:** 官方最稳妥的方案,适用于 Linux 4.9 及以上内核。
* **安装 BBRplus 内核:** 社区在原版 BBR 基础上的修改版,修正了原版在大带宽下的激进回退问题,网络恶劣时表现更强。
* **安装 锐速 (LotServer):** 老牌单边加速工具(非 BBR,会占用更多内存)。

### 2. 加速管理(开启或切换算法)

更换完内核并重启服务器后,再次运行 `./tcpx.sh`,即可开启对应的加速算法:

* **开启 BBR + FQ**(最推荐,官方原汁原味,极其稳定)
* **开启 BBRplus + FQ**(很多人的「科学上网」首选)

### 3. 卸载与优化

* 提供一键卸载加速、系统配置优化(如增加文件描述符上限)等辅助功能。

---

## 🚦 推荐操作流程(仅需 3 步)

1. **第一步:** 运行脚本,选择 `1` 或 `2` 安装 **BBR原版内核** 或 **BBRplus内核**。
2. **第二步:** 安装完成后,脚本会提示你重启服务器,输入 `y` 重启。
3. **第三步:** 服务器重启后,再次连接 SSH,运行 `./tcpx.sh`,选择对应的 **开启 BBR** 或 **开启 BBRplus**。

> ⚠️ **注意:** 开启成功后,脚本界面顶部会显示:`当前状态: 已安装 BBR 加速内核 , BBR 启动成功`。

---

## 🔍 手动验证是否生效

如果你不想运行脚本查看状态,也可以在终端输入以下命令手动验证:

```bash
sysctl net.ipv4.tcp_congestion_control

```

如果返回结果包含以下内容,说明加速已成功生效:

net.ipv4.tcp_congestion_control = bbr (或 bbrplus)


⚠️ 风险提示与注意事项

  • 断开风险: 更换系统内核属于底层操作。虽然脚本很成熟,但在极少数小众服务商(或非主流架构如 OpenVZ)的 VPS 上可能会导致无法开机。生产环境请务必提前备份数据!
  • 架构限制: 完美支持 KVM、XEN 架构的 VPS。如果是 OpenVZ 架构,无法直接修改内核,通常需要使用专用的 LedgeBBR 等方案。

脚本内容

#!/usr/bin/env bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# =================================================
#  全局配置区 (Configuration as Data)
# =================================================
readonly SH_VER="100.0.5.15"
readonly GITHUB_RAW_URL="https://raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master"
readonly GITHUB_API_URL="https://api.github.com/repos/ylx2016/kernel/releases"

# 颜色变量定义
readonly GREEN_FONT_PREFIX="\033[32m"
readonly RED_FONT_PREFIX="\033[31m"
readonly YELLOW_FONT_PREFIX="\033[33m"
readonly FONT_COLOR_SUFFIX="\033[0m"
readonly INFO="${GREEN_FONT_PREFIX}[信息]${FONT_COLOR_SUFFIX}"
readonly ERROR="${RED_FONT_PREFIX}[错误]${FONT_COLOR_SUFFIX}"
readonly TIP="${YELLOW_FONT_PREFIX}[注意]${FONT_COLOR_SUFFIX}"

# 系统信息全局变量 (初始化)
OS_TYPE=""
OS_ID=""
OS_VERSION_ID=""
OS_ARCH=""

# 检查当前用户是否为 root
if [ "$EUID" -ne 0 ]; then
	echo -e "${ERROR} 请使用 root 用户身份运行此脚本"
	exit 1
fi

# =================================================
#  系统检测模块
# =================================================
check_sys() {
	# 1. 检测架构 (使用最通用的 uname)
	OS_ARCH=$(uname -m)

	# 2. 现代化系统信息获取
	if [[ -f /etc/os-release ]]; then
		# 直接 source 解析标准的 os-release 文件
		. /etc/os-release
		OS_ID="${ID:-unknown}"
		OS_VERSION_ID="${VERSION_ID:-}"
		OS_ID_LIKE="${ID_LIKE:-}" # 新增:获取上游衍生关系
		# 兼容 Debian testing/sid 没有 VERSION_ID 的情况
		if [[ -z "$OS_VERSION_ID" && "$OS_ID" == "debian" && -f /etc/debian_version ]]; then
			OS_VERSION_ID=$(grep -oE '^[0-9]+' /etc/debian_version | head -n 1)
			[[ -z "$OS_VERSION_ID" ]] && OS_VERSION_ID=$(awk -F'/' '{print $1}' /etc/debian_version)
		fi
		[[ -z "$OS_VERSION_ID" ]] && OS_VERSION_ID="unknown"
	elif [[ -f /etc/redhat-release || -f /etc/centos-release ]]; then
		# 兼容极少数没有 os-release 的老旧 CentOS
		OS_ID="centos"
		OS_VERSION_ID=$(grep -oE '[0-9.]+' /etc/redhat-release | awk -F'.' '{print $1}')
	else
		echo -e "${ERROR} 无法检测到受支持的系统版本。此脚本仅支持现代 Debian/Ubuntu/CentOS/Alma/Rocky 系统。"
		exit 1
	fi

	# 3. 规范化 OS_TYPE (引入 ID_LIKE 增强泛衍生版兼容性)
	if [[ "$OS_ID" =~ ^(centos|rhel|almalinux|rocky|oracle|fedora)$ ]] || [[ "$OS_ID_LIKE" =~ (rhel|centos|fedora) ]]; then
		OS_TYPE="CentOS"
		# 提取主版本号
		OS_VERSION_ID=$(echo "$OS_VERSION_ID" | awk -F'.' '{print $1}')
	elif [[ "$OS_ID" =~ ^(debian|ubuntu|pop|kali|linuxmint|deepin|elementary|zorin|armbian)$ ]] || [[ "$OS_ID_LIKE" =~ (debian|ubuntu) ]]; then
		OS_TYPE="Debian"
	else
		echo -e "${ERROR} 不支持的系统分支: ${OS_ID} (ID_LIKE: ${OS_ID_LIKE})"
		exit 1
	fi

	echo -e "${INFO} 检测到系统: ${OS_TYPE} (${OS_ID} ${OS_VERSION_ID}) - 架构: ${OS_ARCH}"

	# 4. 精简依赖检查 (抛弃笨重的 lsb_release,引入轻量的 jq 用于后续 API 解析)
	local required_cmds=("curl" "wget" "awk" "jq")

	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		for cmd in "${required_cmds[@]}"; do
			if ! command -v "$cmd" >/dev/null 2>&1; then
				echo -e "${INFO} 正在安装缺失依赖: $cmd ..."
				if [[ "$cmd" == "jq" ]] && ! rpm -q epel-release >/dev/null 2>&1; then
					yum install -y epel-release >/dev/null 2>&1
				fi
				yum install -y "$cmd" >/dev/null 2>&1
			fi
		done
		# CA 证书更新
		if ! rpm -q ca-certificates >/dev/null 2>&1; then
			yum install ca-certificates -y >/dev/null 2>&1
			update-ca-trust force-enable
		fi
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		local need_update=0
		for cmd in "${required_cmds[@]}"; do
			if ! command -v "$cmd" >/dev/null 2>&1; then
				if [[ $need_update -eq 0 ]]; then
					apt-get update >/dev/null 2>&1
					need_update=1
				fi
				echo -e "${INFO} 正在安装缺失依赖: $cmd ..."
				apt-get install -y "$cmd" >/dev/null 2>&1
			fi
		done
		# CA 证书更新
		if ! dpkg-query -W ca-certificates >/dev/null 2>&1; then
			[[ $need_update -eq 0 ]] && apt-get update >/dev/null 2>&1
			apt-get install ca-certificates -y >/dev/null 2>&1
			update-ca-certificates >/dev/null 2>&1
		fi
	fi

	# 5. 补充底层内核模块管理依赖 (应对极简版 LXC/VPS 模板)
	if ! command -v lsmod >/dev/null 2>&1; then
		echo -e "${INFO} 正在补齐系统核心依赖: kmod (提供 lsmod/rmmod 命令) ..."
		if [[ "${OS_TYPE}" == "CentOS" ]]; then
			yum install -y kmod >/dev/null 2>&1
		elif [[ "${OS_TYPE}" == "Debian" ]]; then
			apt-get install -y kmod >/dev/null 2>&1
		fi
	fi
}

# =================================================
#  网络通信与下载模块
# =================================================

# 全局变量:是否在中国大陆
IS_CN=0

# 1. 极其稳定且快速的 CN 节点检测 (利用 Cloudflare CDN Trace)
check_cn_status() {
	# 设置 3 秒超时,获取 Cloudflare 边缘节点看到的 IP 归属地
	local cf_trace=$(curl -sL --max-time 3 https://www.cloudflare.com/cdn-cgi/trace || echo "")
	if echo "$cf_trace" | grep -q "loc=CN"; then
		IS_CN=1
		echo -e "${INFO} 检测到当前节点位于中国大陆,将自动启用 GitHub 加速镜像。"
	else
		IS_CN=0
		echo -e "${INFO} 当前节点位于海外,使用 GitHub 直连网络。"
	fi
}

# 2. 安全可靠的下载函数 (自带多镜像轮询 failover)
# 用法: safe_wget <下载直链> <保存路径>
safe_wget() {
	local url="$1"
	local dest="$2"
	local timeout=15

	# 定义多个加速镜像前缀 (按稳定性排序)
	local mirrors=(
		"" # 第一个是原生链接,给海外机准备的
		"https://gh-proxy.com/"
		"https://ghfast.top/"
		"https://hub.gitmirror.com/"
		"https://gh.ddlc.top/"
	)

	# 如果不是国内,只保留原生链接(空前缀)
	[[ $IS_CN -eq 0 ]] && mirrors=("")

	for prefix in "${mirrors[@]}"; do
		# 组装最终下载链接
		local target_url="${prefix}${url}"
		[[ -n "$prefix" ]] && target_url="${prefix}$(echo "$url" | sed 's|^https://||')"

		echo -e "${INFO} 正在下载: ${dest} ..."
		# 使用 wget,设置重试 2 次,跳过证书校验
		if wget --no-check-certificate -qT "$timeout" -t 2 -O "$dest" "$target_url"; then
			echo -e "${INFO} 下载成功!"
			return 0
		fi
		[[ $IS_CN -eq 1 ]] && echo -e "${TIP} 镜像节点下载失败,尝试切换下一个节点..."
	done

	echo -e "${ERROR} 文件 ${dest} 所有下载节点均失败,请检查网络或稍后再试!"
	return 1
}

# 3. 稳健的 GitHub 资源获取函数 (使用 jq 提取 JSON)
# 用法: get_github_asset <仓库名> <Tag关键词> <文件名关键词>
# 示例: get_github_asset "ylx2016/kernel" "Debian_Kernel" "headers"
# 3. 稳健的 GitHub 资源获取函数 (提取所有链接后通过 grep 多重过滤)
get_github_asset() {
	local repo="$1"
	local tag_kw="$2"
	local ast_kw="$3"
	local arch_kw="$4" # 可选的架构关键词
	local api_url="https://api.github.com/repos/${repo}/releases"

	local response=$(curl -sL --max-time 10 "$api_url")
	if echo "$response" | grep -q "API rate limit exceeded"; then
		echo -e "${ERROR} 触发 GitHub API 频率限制!(当前 IP 请求过多)" >&2
		return 1
	fi

	# 提取出该仓库所有的下载直链
	local all_urls=$(echo "$response" | jq -r '.[].assets[]?.browser_download_url' 2>/dev/null)
	if [[ -z "$all_urls" ]]; then
		echo -e "${ERROR} 无法从 ${repo} 获取资源列表,请检查网络或稍后再试!" >&2
		return 1
	fi

	# 利用 grep -iE 进行层层精准过滤
	local result=$(echo "$all_urls" | grep -iE "$tag_kw" | grep -iE "$ast_kw")
	[[ -n "$arch_kw" ]] && result=$(echo "$result" | grep -iE "$arch_kw")

	# 终极防呆机制:如果是 x86_64 架构,且关键词中没有声明要找 arm64,则强行排除带 arm64/aarch64 的链接,防止模糊匹配误伤
	if [[ "$arch_kw" != *"arm64"* && "$tag_kw" != *"arm64"* && "$OS_ARCH" != "aarch64" ]]; then
		result=$(echo "$result" | grep -viE "arm64|aarch64")
	fi

	local asset_url=$(echo "$result" | head -n 1)

	if [[ -z "$asset_url" ]]; then
		echo -e "${ERROR} 无法在 ${repo} 中解析到匹配关键字 (${tag_kw} -> ${ast_kw} -> ${arch_kw}) 的文件!" >&2
		return 1
	fi

	echo "$asset_url"
}

# =================================================
#  内核安装核心引擎
# =================================================

# 清理旧的 Headers (精简重构)
remove_old_headers() {
	echo -e "${INFO} 正在清理旧的内核 Headers 防止冲突..."
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		# 找出不是当前正在运行的 kernel-headers 并卸载
		local current_ker=$(uname -r)
		rpm -qa | grep 'kernel-headers' | grep -v "$current_ker" | xargs -r rpm -e --nodeps >/dev/null 2>&1
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		dpkg -l | grep 'linux-headers' | awk '{print $2}' | grep -v "$(uname -r)" | xargs -r apt-get purge -y >/dev/null 2>&1
		apt-get autoremove -y >/dev/null 2>&1
	fi
}

# 终极内核安装函数
# 用法: install_kernel_generic <内核描述名称> <Headers_URL> <Image_URL> <版本号>
install_kernel_generic() {
	local kernel_desc="$1"
	local head_url="$2"
	local img_url="$3"
	local kernel_version="$4" # 新增参数,用于 UI 显示

	echo -e "${INFO} ================================================"
	if [[ -n "$kernel_version" ]]; then
		echo -e "${INFO} 开始安装: ${kernel_desc} (版本: \033[32m${kernel_version}\033[0m)"
	else
		echo -e "${INFO} 开始安装: ${kernel_desc}"
	fi
	echo -e "${INFO} ================================================"

	# 只强制检查 img_url,因为某些内核(如 Cloud)本身可能不强制要求 Headers
	if [[ -z "$img_url" ]]; then
		echo -e "${ERROR} 传入的镜像文件下载链接为空,可能是 API 解析失败或上游移除了文件!"
		exit 1
	fi

	# 清理旧 headers
	remove_old_headers

	# 创建独立的工作目录
	local work_dir="/tmp/kernel_install_$(date +%s)"
	mkdir -p "$work_dir" && cd "$work_dir" || exit 1

	# 根据系统执行不同的下载和安装逻辑
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		local head_file="kernel-headers.rpm"
		local img_file="kernel-image.rpm"

		[[ -n "$head_url" ]] && { safe_wget "$head_url" "$head_file" || exit 1; }
		safe_wget "$img_url" "$img_file" || exit 1

		echo -e "${INFO} 正在执行 YUM 安装..."
		if [[ -n "$head_url" ]]; then
			yum install -y "$img_file" "$head_file"
		else
			yum install -y "$img_file"
		fi

	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		local head_file="linux-headers.deb"
		local img_file="linux-image.deb"

		[[ -n "$head_url" ]] && { safe_wget "$head_url" "$head_file" || exit 1; }
		safe_wget "$img_url" "$img_file" || exit 1

		echo -e "${INFO} 正在执行 DPKG 安装..."
		dpkg -i "$img_file"
		[[ -n "$head_url" ]] && dpkg -i "$head_file"

		echo -e "${INFO} 正在检查并修复可能缺失的依赖环境..."
		apt-get install -f -y
	fi

	# 善后清理
	cd /tmp && rm -rf "$work_dir"

	echo -e "${INFO} ${kernel_desc} 内核包安装完成,正在更新系统引导..."
	BBR_grub
}

# 安装 BBR 原版内核 (调用引擎)
installbbr() {
	local head_url=""
	local img_url=""
	local tag_kw=""
	local arch_kw=""
	local img_kw=""

	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		# 适配新编译的 CentOS Cloud 内核
		tag_kw="CentOS_Kernel_Cloud"
		arch_kw="x86_64"
		# 【核心修复 1】直接匹配 kernel-加数字,从源头完美避开 headers 和 devel
		img_kw="kernel-[0-9]"
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		# 适配新编译的 Debian Cloud 内核
		tag_kw="Debian_Kernel_Cloud"
		arch_kw="amd64"
		img_kw="image" # Debian dpkg 生成的包名为 linux-image 开头
		if [[ "$OS_ARCH" == "aarch64" ]]; then
			tag_kw="Debian_Kernel_Cloud_arm64"
			arch_kw="arm64"
		fi
	fi

	echo -e "${INFO} 正在向 Github/ylx2016 请求最新 ${tag_kw} 内核数据..."

	# 获取下载链接 (现在抓取到的绝对纯净,无需二次 grep -v)
	head_url=$(get_github_asset "ylx2016/kernel" "${tag_kw}" "headers" "${arch_kw}")
	img_url=$(get_github_asset "ylx2016/kernel" "${tag_kw}" "${img_kw}" "${arch_kw}")

	# 【核心修复 2】利用 -oE 标准正则提取版本号,避免部分系统不支持 -P 导致版本号变空
	local kernel_version=$(echo "$img_url" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n 1)

	if [[ -n "$kernel_version" ]]; then
		echo -e "${INFO} 解析成功!获取到的最新云端内核版本为: \033[32m${kernel_version}\033[0m"
	else
		echo -e "${INFO} 解析成功!已获取到下载链接,但未能匹配出纯净版本号。"
	fi

	# 将解析出的版本号作为第四个参数传递给安装函数
	install_kernel_generic "BBR Cloud 优化内核" "$head_url" "$img_url" "$kernel_version"
}

# 安装 BBRplus 新版内核 (调用引擎)
installbbrplusnew() {
	local head_url=""
	local img_url=""
	local tag_kw="bbrplus-6."
	local ext="deb"
	local arch_kw="amd64"

	[[ "${OS_TYPE}" == "CentOS" ]] && ext="rpm"
	[[ "$OS_ARCH" == "aarch64" ]] && arch_kw="arm64"

	echo -e "${INFO} 正在向 UJX6N/bbrplus-6.x_stable 请求数据..."
	# 利用精准的参数向下传递
	head_url=$(get_github_asset "UJX6N/bbrplus-6.x_stable" "${tag_kw}" "headers" "${arch_kw}.*${ext}")
	img_url=$(get_github_asset "UJX6N/bbrplus-6.x_stable" "${tag_kw}" "image" "${arch_kw}.*${ext}")

	install_kernel_generic "BBRplus(UJX6N)新版内核" "$head_url" "$img_url"
}

# 安装 BBRplus 内核 4.14.129 (cx9208版)
installbbrplus() {
	local head_url=""
	local img_url=""

	if [[ "${OS_TYPE}" == "CentOS" && "${OS_VERSION_ID}" == "7" ]]; then
		head_url="https://github.com/cx9208/Linux-NetSpeed/raw/master/bbrplus/centos/7/kernel-headers-4.14.129-bbrplus.rpm"
		img_url="https://github.com/cx9208/Linux-NetSpeed/raw/master/bbrplus/centos/7/kernel-4.14.129-bbrplus.rpm"
	elif [[ "${OS_TYPE}" == "Debian" && "${OS_ARCH}" == "x86_64" ]]; then
		head_url="https://github.com/cx9208/Linux-NetSpeed/raw/master/bbrplus/debian-ubuntu/x64/linux-headers-4.14.129-bbrplus.deb"
		img_url="https://github.com/cx9208/Linux-NetSpeed/raw/master/bbrplus/debian-ubuntu/x64/linux-image-4.14.129-bbrplus.deb"
	else
		echo -e "${ERROR} BBRplus 4.14.129 仅支持 CentOS 7 或 Debian x86_64!"
		exit 1
	fi

	install_kernel_generic "BBRplus 4.14.129" "$head_url" "$img_url"
}

# 安装 Xanmod 自编译老版本
installxanmod() {
	echo -e "${TIP} Xanmod 这个自编译版本不维护了,后续请用官方编译版本,知悉。"
	local head_url=""
	local img_url=""

	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		if [[ "${OS_VERSION_ID}" == "7" ]]; then
			head_url="https://github.com/ylx2016/kernel/releases/download/Centos_Kernel_5.15.95-xanmod1_lts_latest_2023.02.24-2159/kernel-headers-5.15.95_xanmod1-1.x86_64.rpm"
			img_url="https://github.com/ylx2016/kernel/releases/download/Centos_Kernel_5.15.95-xanmod1_lts_latest_2023.02.24-2159/kernel-5.15.95_xanmod1-1.x86_64.rpm"
		elif [[ "${OS_VERSION_ID}" == "8" ]]; then
			head_url="https://github.com/ylx2016/kernel/releases/download/Centos_Kernel_5.15.81-xanmod1_lts_C8_latest_2022.12.06-1614/kernel-headers-5.15.81_xanmod1-1.x86_64.rpm"
			img_url="https://github.com/ylx2016/kernel/releases/download/Centos_Kernel_5.15.81-xanmod1_lts_C8_latest_2022.12.06-1614/kernel-5.15.81_xanmod1-1.x86_64.rpm"
		fi
	elif [[ "${OS_TYPE}" == "Debian" && "${OS_ARCH}" == "x86_64" ]]; then
		head_url="https://github.com/ylx2016/kernel/releases/download/Debian_Kernel_5.15.95-xanmod1_lts_latest_2023.02.24-2210/linux-headers-5.15.95-xanmod1_5.15.95-xanmod1-1_amd64.deb"
		img_url="https://github.com/ylx2016/kernel/releases/download/Debian_Kernel_5.15.95-xanmod1_lts_latest_2023.02.24-2210/linux-image-5.15.95-xanmod1_5.15.95-xanmod1-1_amd64.deb"
	else
		echo -e "${ERROR} 当前架构或系统不支持该 Xanmod 版本!"
		exit 1
	fi

	install_kernel_generic "Xanmod 自编译版" "$head_url" "$img_url"
}

# 安装官方 Cloud 内核
installcloud() {
	[[ "${OS_TYPE}" != "Debian" ]] && {
		echo -e "${ERROR} Cloud 内核仅支持 Debian 系系统"
		exit 1
	}

	local img_url_base
	local img_pattern
	if [[ "$OS_ARCH" == "x86_64" ]]; then
		img_url_base="https://deb.debian.org/debian/pool/main/l/linux-signed-amd64/"
		img_pattern='linux-image-[^"]+cloud-amd64_[^"]+_amd64\.deb'
	elif [[ "$OS_ARCH" == "aarch64" ]]; then
		img_url_base="https://deb.debian.org/debian/pool/main/l/linux-signed-arm64/"
		img_pattern='linux-image-[^"]+cloud-arm64_[^"]+_arm64\.deb'
	else
		echo -e "${ERROR} 不支持的架构:$OS_ARCH"
		exit 1
	fi

	echo -e "${INFO} 正在从 Debian 官方源获取 Cloud 内核列表..."
	local deb_files=$(curl -sL --max-time 10 "$img_url_base" | grep -oE "$img_pattern" | sort -V | uniq)

	if [[ -z "$deb_files" ]]; then
		echo -e "${ERROR} 未找到可用的 Cloud 内核版本,请检查网络!"
		exit 1
	fi

	# 将文件列表转换为数组
	mapfile -t versions_array <<<"$deb_files"

	echo -e "${INFO} 检测到以下 Cloud 内核版本:"
	for i in "${!versions_array[@]}"; do
		# 截取版本号用于展示
		local v_show=$(echo "${versions_array[$i]}" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+-[0-9]+')
		echo "  $i) [$v_show] -> ${versions_array[$i]}"
	done

	local default_idx=$((${#versions_array[@]} - 1))
	echo -e "${TIP} 请选择要安装的内核版本(10秒后默认选择最新版本,输入 'h' 则使用 apt 安装):"
	read -t 10 -p "输入选项 [0-$default_idx 或 h]: " choice

	if [[ "$choice" =~ ^[hH]$ ]]; then
		echo -e "${INFO} 正在使用 apt 安装 Cloud 内核及 Headers..."
		apt-get update >/dev/null 2>&1
		local arch_ext="amd64"
		[[ "$OS_ARCH" == "aarch64" ]] && arch_ext="arm64"
		apt-get install -y "linux-image-cloud-${arch_ext}" "linux-headers-cloud-${arch_ext}"
		BBR_grub
		return 0
	fi

	choice=${choice:-$default_idx}
	if ! [[ "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -lt 0 ] || [ "$choice" -gt "$default_idx" ]; then
		echo -e "${TIP} 无效选项,默认安装最新版本..."
		choice=$default_idx
	fi

	local selected_file="${versions_array[$choice]}"
	# 传递给通用引擎(此处无 Headers,留空)
	install_kernel_generic "Debian 官方 Cloud" "" "${img_url_base}${selected_file}"
}

# 安装 Lotserver (锐速) 专属内核
installlot() {
	[[ "$OS_ARCH" != "x86_64" ]] && {
		echo -e "${ERROR} Lotserver 仅支持 x86_64 架构!"
		exit 1
	}

	remove_old_headers

	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		local lot_ver="4.11.2-1" # CentOS 7 默认
		[[ "${OS_VERSION_ID}" == "6" ]] && lot_ver="2.6.32-504"

		local base_url="http://${GITHUB_RAW_URL}/lotserver/centos/${OS_VERSION_ID}/x64"

		rpm --import "http://${GITHUB_RAW_URL}/lotserver/centos/RPM-GPG-KEY-elrepo.org" >/dev/null 2>&1
		yum remove -y kernel-firmware kernel-headers >/dev/null 2>&1

		# 使用 safe_wget 增强下载稳定性
		local work_dir="/tmp/lot_install"
		mkdir -p "$work_dir" && cd "$work_dir"

		safe_wget "${base_url}/kernel-firmware-${lot_ver}.rpm" "kernel-firmware.rpm"
		safe_wget "${base_url}/kernel-${lot_ver}.rpm" "kernel.rpm"
		safe_wget "${base_url}/kernel-headers-${lot_ver}.rpm" "kernel-headers.rpm"
		safe_wget "${base_url}/kernel-devel-${lot_ver}.rpm" "kernel-devel.rpm"

		echo -e "${INFO} 正在安装 Lotserver 专属内核组件..."
		yum install -y *.rpm
		cd /tmp && rm -rf "$work_dir"

	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		# Debian/Ubuntu 走老旧的 snapshot.debian.org 源
		apt-get autoremove -y >/dev/null 2>&1
		local work_dir="/tmp/lot_install"
		mkdir -p "$work_dir" && cd "$work_dir"

		if [[ "$OS_ID" == "debian" && "$OS_VERSION_ID" == "8" ]]; then
			safe_wget "http://snapshot.debian.org/archive/debian/20120304T220938Z/pool/main/l/linux-base/linux-base_3.5_all.deb" "linux-base.deb"
			safe_wget "http://snapshot.debian.org/archive/debian/20171008T163152Z/pool/main/l/linux/linux-image-3.16.0-4-amd64_3.16.43-2+deb8u5_amd64.deb" "linux-image.deb"
		elif [[ "$OS_ID" == "debian" && "$OS_VERSION_ID" == "9" ]]; then
			safe_wget "http://snapshot.debian.org/archive/debian/20160917T042239Z/pool/main/l/linux-base/linux-base_4.5_all.deb" "linux-base.deb"
			safe_wget "http://snapshot.debian.org/archive/debian/20171224T175424Z/pool/main/l/linux/linux-image-4.9.0-4-amd64_4.9.65-3+deb9u1_amd64.deb" "linux-image.deb"
		else
			echo -e "${ERROR} Lotserver 不支持当前系统版本!"
			exit 1
		fi

		dpkg -l | grep -q 'linux-base' || dpkg -i linux-base.deb
		dpkg -i linux-image.deb
		apt-get install -f -y
		cd /tmp && rm -rf "$work_dir"
	fi

	echo -e "${INFO} Lotserver 内核包安装完成,正在更新系统引导..."
	BBR_grub
}

# =================================================
#  系统级网络与资源自适应优化 (替换旧版优化)
# =================================================
optimizing_system() {
	echo -e "${INFO} 开始进行系统级网络优化 (自适应 CPU/内存/内核版本)..."

	# 1. 动态获取系统硬件与内核参数
	local total_mem_kb=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
	local total_mem_mb=$((total_mem_kb / 1024))
	local cpu_cores=$(nproc)
	local kernel_major=$(uname -r | cut -d. -f1)
	local kernel_minor=$(uname -r | cut -d. -f2)

	# 新增:动态获取当前正在使用的拥塞控制算法,防止覆盖 LotSpeed 或其它自定义算法
	local current_cc=$(cat /proc/sys/net/ipv4/tcp_congestion_control 2>/dev/null || echo "bbr")
	local current_qdisc=$(cat /proc/sys/net/core/default_qdisc 2>/dev/null || echo "fq")
	[[ "$current_cc" == "unknown" || -z "$current_cc" ]] && current_cc="bbr"
	[[ "$current_qdisc" == "unknown" || -z "$current_qdisc" ]] && current_qdisc="fq"

	# 2. 根据内存大小动态适配网络缓存与文件描述符
	local tcp_mem_max somaxconn file_max
	if [ "$total_mem_mb" -ge 8192 ]; then
		# 8GB 及以上高配机器
		tcp_mem_max=134217728 # 128MB 缓存
		somaxconn=1048576
		file_max=2097152
	elif [ "$total_mem_mb" -ge 2048 ]; then
		# 2GB - 8GB 中等配置
		tcp_mem_max=67108864 # 64MB 缓存
		somaxconn=65535
		file_max=1048576
	else
		# 2GB 以下小内存机器
		tcp_mem_max=16777216 # 16MB 缓存
		somaxconn=32768
		file_max=524288
	fi

	# 3. 根据 CPU 核心数动态适配网卡队列与积压
	local netdev_max_backlog=$((10000 * cpu_cores))
	[[ $netdev_max_backlog -lt 32768 ]] && netdev_max_backlog=32768
	[[ $netdev_max_backlog -gt 100000 ]] && netdev_max_backlog=100000

	local netdev_budget=$((300 + 20 * cpu_cores))
	[[ $netdev_budget -gt 50000 ]] && netdev_budget=50000

	# 4. 生成统一的 sysctl 配置文件
	local sysctl_conf="/etc/sysctl.d/99-sysctl.conf"

	# 备份并清空原文件(比几十行 sed -i 速度快且更安全)
	[[ -f "$sysctl_conf" ]] && cp "$sysctl_conf" "${sysctl_conf}.bak"
	cat /dev/null >"$sysctl_conf"

	# 写入基础通用优化 (兼容 CentOS 7-9, Debian 9-12, Ubuntu 18-24)
	cat >>"$sysctl_conf" <<EOF
# --- 文件系统与内存基础 ---
fs.file-max = $file_max
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = $file_max
kernel.pid_max = 65535
vm.swappiness = 1
vm.overcommit_memory = 1

# --- 网络核心队列与连接数 ---
net.core.somaxconn = $somaxconn
net.core.netdev_max_backlog = $netdev_max_backlog
net.core.netdev_budget = $netdev_budget
net.core.rmem_max = $tcp_mem_max
net.core.wmem_max = $tcp_mem_max
net.core.rmem_default = $((tcp_mem_max / 2))
net.core.wmem_default = $((tcp_mem_max / 2))
net.core.optmem_max = 65536

# --- TCP 核心调优 (缓冲区自适应) ---
net.ipv4.tcp_rmem = 4096 87380 $tcp_mem_max
net.ipv4.tcp_wmem = 4096 65536 $tcp_mem_max
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_autocorking = 0
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_max_syn_backlog = $somaxconn
net.ipv4.tcp_notsent_lowat = 16384
net.ipv4.tcp_no_metrics_save = 0
net.ipv4.tcp_ecn = 1
net.ipv4.tcp_ecn_fallback = 1
net.ipv4.tcp_frto = 0

# --- TCP 超时、重传与 KeepAlive 优化 ---
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_rfc1337 = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3

# --- 路由转发与 IPv6 (默认开启转发以兼容 Docker/Tailscale 等) ---
net.ipv4.ip_forward = 1
net.ipv4.conf.all.route_localnet = 1
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.lo.forwarding = 1
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0

# --- 默认拥塞控制 (动态继承) ---
net.core.default_qdisc = $current_qdisc
net.ipv4.tcp_congestion_control = $current_cc
EOF

	# 5. 根据内核版本进行高级参数兼容
	# 移除低版本废弃参数: net.ipv4.tcp_tw_recycle (在内核 4.12 中已彻底移除,高版本强制写入会报错)
	if [[ "$kernel_major" -lt 4 || ("$kernel_major" -eq 4 && "$kernel_minor" -lt 12) ]]; then
		echo "net.ipv4.tcp_tw_recycle = 0" >>"$sysctl_conf"
	fi

	# 移除低版本废弃参数: net.ipv4.tcp_fack (在内核 4.11 中已废弃,合并到了通用重传逻辑中)
	if [[ "$kernel_major" -lt 4 || ("$kernel_major" -eq 4 && "$kernel_minor" -lt 11) ]]; then
		echo "net.ipv4.tcp_fack = 1" >>"$sysctl_conf"
	fi

	# 6. 系统资源限制极限优化 (systemd 与 limits.conf)
	echo -e "${INFO} 正在根据内存大小自动优化系统文件描述符限制..."

	# 优化 Systemd 配置
	if [[ -d "/etc/systemd" ]]; then
		cat >/etc/systemd/system.conf <<EOF
[Manager]
DefaultTimeoutStopSec=30s
DefaultLimitCORE=infinity
DefaultLimitNOFILE=$file_max
DefaultLimitNPROC=infinity
DefaultTasksMax=infinity
EOF
		systemctl daemon-reload >/dev/null 2>&1
	fi

	# 优化 limits.conf
	cat >/etc/security/limits.conf <<EOF
* soft   nofile    $file_max
* hard   nofile    $file_max
* soft   nproc     unlimited
* hard   nproc     unlimited
* soft   core      unlimited
* hard   core      unlimited
root  soft   nofile    $file_max
root  hard   nofile    $file_max
root  soft   nproc     unlimited
root  hard   nproc     unlimited
root  soft   core      unlimited
root  hard   core      unlimited
EOF

	# 清理旧的 ulimit 注入
	sed -i '/ulimit -SHn/d' /etc/profile
	sed -i '/ulimit -SHu/d' /etc/profile
	echo "ulimit -SHn $file_max" >>/etc/profile

	# 修复 Pam 会话限制
	if [[ -f "/etc/pam.d/common-session" ]] && ! grep -q "pam_limits.so" /etc/pam.d/common-session; then
		echo "session required pam_limits.so" >>/etc/pam.d/common-session
	fi

	# 7. 应用内核与系统参数
	echo -e "${INFO} 正在应用自适应内核配置..."
	sysctl -p "$sysctl_conf" >/dev/null 2>&1
	sysctl --system >/dev/null 2>&1

	# 启用透明大页加速 (如果支持)
	if [[ -f /sys/kernel/mm/transparent_hugepage/enabled ]]; then
		echo always >/sys/kernel/mm/transparent_hugepage/enabled
	fi

	echo -e "${INFO} 系统网络与资源限制自适应优化完成!(建议完成后重启服务器以全面生效)"
}

# =================================================
#  网络加速统一切换引擎 (替代原来十几个 startxxx 函数)
# =================================================

# 卸载加速器 (清理配置)
remove_bbr_lotserver() {
	echo -e "${INFO} 正在清理旧的拥塞控制与队列算法配置..."
	local sysctl_conf="/etc/sysctl.d/99-sysctl.conf"
	[[ -f "$sysctl_conf" ]] && sed -i '/net.core.default_qdisc/d; /net.ipv4.tcp_congestion_control/d; /net.ipv4.tcp_ecn/d' "$sysctl_conf"
	[[ -f "/etc/sysctl.conf" ]] && sed -i '/net.core.default_qdisc/d; /net.ipv4.tcp_congestion_control/d; /net.ipv4.tcp_ecn/d' /etc/sysctl.conf

	sysctl --system >/dev/null 2>&1
	rm -rf bbrmod

	# 修改:停用并卸载 LotSpeed 模块 (但不物理删除文件,以便随时通过菜单快速切换)
	if command -v lotspeed >/dev/null 2>&1; then
		lotspeed stop >/dev/null 2>&1
		rmmod lotspeed >/dev/null 2>&1
	fi
	# 如果没有 helper 脚本但也加载了模块的兜底清理
	if lsmod | grep -q "lotspeed"; then
		rmmod lotspeed >/dev/null 2>&1
	fi

	if [[ -e /appex/bin/lotServer.sh ]]; then
		echo | bash <(wget -qO- https://raw.githubusercontent.com/fei5seven/lotServer/master/lotServerInstall.sh) uninstall >/dev/null 2>&1
	fi
}

# 统一加速开启函数
# 用法: enable_acceleration <队列算法> <拥塞控制算法>
enable_acceleration() {
	local qdisc="$1"
	local cc="$2"

	remove_bbr_lotserver

	echo -e "${INFO} 正在应用: ${cc} + ${qdisc} ..."
	local sysctl_conf="/etc/sysctl.d/99-sysctl.conf"
	echo "net.core.default_qdisc=$qdisc" >>"$sysctl_conf"
	echo "net.ipv4.tcp_congestion_control=$cc" >>"$sysctl_conf"

	sysctl --system >/dev/null 2>&1
	echo -e "${INFO} 加速算法修改成功!如果未立即生效,请重启服务器。"
}

# 启用 Lotserver
startlotserver() {
	remove_bbr_lotserver
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		yum install ethtool -y
	else
		apt-get update && apt-get install ethtool -y
	fi
	echo | bash <(wget --no-check-certificate -qO- https://raw.githubusercontent.com/fei5seven/lotServer/master/lotServerInstall.sh) install
	sed -i '/advinacc/d; /maxmode/d' /appex/etc/config
	echo -e "advinacc=\"1\"\nmaxmode=\"1\"" >>/appex/etc/config
	/appex/bin/lotServer.sh restart
	start_menu
}

# 开启/关闭 ECN (显式控制)
set_ecn() {
	local status="$1"
	local sysctl_conf="/etc/sysctl.d/99-sysctl.conf"
	sed -i '/net.ipv4.tcp_ecn/d' "$sysctl_conf" /etc/sysctl.conf 2>/dev/null
	echo "net.ipv4.tcp_ecn=$status" >>"$sysctl_conf"
	sysctl --system >/dev/null 2>&1
	[[ "$status" == "1" ]] && echo -e "${INFO} ECN 已开启!" || echo -e "${INFO} ECN 已关闭!"
}

# 彻底卸载全部加速与优化 (抛弃几十个 sed 删除,直接清空文件)
remove_all() {
	echo -e "${INFO} 正在清空网络优化与系统限制..."
	rm -f /etc/sysctl.d/99-sysctl.conf
	cat /dev/null >/etc/sysctl.conf
	sysctl --system >/dev/null 2>&1

	sed -i '/DefaultTimeoutStopSec/d; /DefaultLimitCORE/d; /DefaultLimitNOFILE/d; /DefaultLimitNPROC/d' /etc/systemd/system.conf
	sed -i '/soft   nofile/d; /hard   nofile/d; /soft   nproc/d; /hard   nproc/d; /soft   core/d; /hard   core/d' /etc/security/limits.conf
	sed -i '/ulimit -SHn/d' /etc/profile
	sed -i '/required pam_limits.so/d' /etc/pam.d/common-session

	systemctl daemon-reload
	remove_bbr_lotserver
	# 新增:彻底卸载时,物理清理 LotSpeed 残留文件
	rm -f /usr/local/bin/lotspeed
	rm -rf /opt/lotspeed
	echo -e "${INFO} 系统已恢复原生状态。"
}

# =================================================
#  系统引导与内核管理引擎
# =================================================

# 现代化更新引导 (GRUB)
BBR_grub() {
	echo -e "${INFO} 正在更新系统引导..."
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		# 现代 CentOS 优先使用 grubby 设置最新内核为默认
		if command -v grubby >/dev/null 2>&1; then
			local latest_kernel=$(grubby --info=ALL | awk -F= '/^kernel/{print $2}' | head -n 1)
			[[ -n "$latest_kernel" ]] && grubby --set-default="$latest_kernel" >/dev/null 2>&1
		else
			[[ -f /boot/grub2/grub.cfg ]] && grub2-mkconfig -o /boot/grub2/grub.cfg >/dev/null 2>&1
			grub2-set-default 0
		fi
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		if command -v update-grub >/dev/null 2>&1; then
			update-grub >/dev/null 2>&1
		else
			apt-get install -y grub2-common >/dev/null 2>&1
			update-grub >/dev/null 2>&1
		fi
	fi
}

# 查看已安装的内核与排序
show_kernels() {
	clear
	echo -e "${INFO} ==================================================="
	echo -e "${INFO} 当前系统中已安装的内核包:"
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		rpm -qa | grep -E "^kernel(-ml|-lt)?(-image|-core|-modules|-devel|-headers)?-[0-9]" | sort -V
		echo -e "${INFO} ==================================================="
		echo -e "${INFO} GRUB 引导项 (通常 index=0 为默认启动项):"
		grubby --info=ALL | grep -E "^kernel|^index"
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		dpkg -l | grep -E "^ii  linux-(image|headers|modules)" | awk '{print $2, $3}' | column -t | sort -V
		echo -e "${INFO} ==================================================="
		echo -e "${INFO} /boot 目录下的内核镜像:"
		ls -1v /boot/vmlinuz-* 2>/dev/null
	fi
	echo -e "${INFO} ==================================================="
	echo -e "${TIP} 当前实际正在运行的内核: ${GREEN_FONT_PREFIX}$(uname -r)${FONT_COLOR_SUFFIX}"
	echo ""
	read -p "按回车键返回主菜单..."
	start_menu
}

# 高级交互式内核管理 (精准多选删除,支持删除当前内核)
delete_kernel_custom() {
	clear
	echo -e "${INFO} ==================================================="
	echo -e "${INFO} 正在扫描系统中已安装的内核包..."
	local current_kernel=$(uname -r)
	local kernel_list=()

	# 使用更精准的包查询方式,防止名字过长被截断
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		mapfile -t kernel_list < <(rpm -qa | grep -E "^kernel(-ml|-lt)?(-image|-core|-modules|-devel|-headers)?-[0-9]" | sort -V)
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		mapfile -t kernel_list < <(dpkg-query -W -f='${Package}\n' | grep -E "^linux-(image|headers|modules)" | sort -V)
	fi

	if [[ ${#kernel_list[@]} -eq 0 ]]; then
		echo -e "${ERROR} 未检测到可管理的内核包。"
		sleep 2
		start_menu
		return
	fi

	echo -e "${TIP} 当前正在运行的内核: ${GREEN_FONT_PREFIX}${current_kernel}${FONT_COLOR_SUFFIX}"
	echo -e "${INFO} ==================================================="

	# 打印带编号的内核列表
	for i in "${!kernel_list[@]}"; do
		local pkg="${kernel_list[$i]}"
		if [[ "$pkg" == *"$current_kernel"* ]]; then
			echo -e "  ${GREEN_FONT_PREFIX}[$i] ${pkg} [*当前运行中*]${FONT_COLOR_SUFFIX}"
		else
			echo -e "  [$i] ${pkg}"
		fi
	done
	echo -e "${INFO} ==================================================="
	echo -e "${TIP} 提示: 排序后默认从最高版本内核启动!"
	echo ""
	read -p "请输入要【删除】的内核编号 (多选请用空格分隔,例如 '0 2 3',直接回车取消): " del_choices

	if [[ -z "$del_choices" ]]; then
		echo -e "${INFO} 已取消操作,返回主菜单。"
		sleep 2
		start_menu
		return
	fi

	# 遍历用户输入,提取包名
	local pkgs_to_del=""
	local is_del_current=0
	for idx in $del_choices; do
		if [[ "$idx" =~ ^[0-9]+$ ]] && [[ "$idx" -ge 0 ]] && [[ "$idx" -lt ${#kernel_list[@]} ]]; then
			local selected_pkg="${kernel_list[$idx]}"
			pkgs_to_del="$pkgs_to_del $selected_pkg"
			# 标记是否包含当前内核
			if [[ "$selected_pkg" == *"$current_kernel"* ]]; then
				is_del_current=1
			fi
		else
			echo -e "${TIP} 无效的编号: $idx,已忽略。"
		fi
	done

	if [[ -z "$pkgs_to_del" ]]; then
		echo -e "${INFO} 没有选择有效的内核,操作结束。"
		sleep 2
		start_menu
		return
	fi

	echo -e "${TIP} 即将从系统中彻底卸载以下内核包:"
	echo -e "${RED_FONT_PREFIX}${pkgs_to_del}${FONT_COLOR_SUFFIX}"

	# 强力警告与二次确认机制
	if [[ $is_del_current -eq 1 ]]; then
		echo -e ""
		echo -e "${ERROR} 高危警告!您选择了删除【当前正在运行的内核】!"
		echo -e "${TIP} 卸载当前运行中的内核,可能会导致您的 SSH 连接中断。"
		echo -e "${TIP} 请务必确保系统中还有【至少一个其他已正常安装的内核】,否则重启后机器将变砖失联!"
		read -p "您确定要继续删除选中的内核包吗?(请输入大写的 YES 确认): " confirm_danger
		if [[ "$confirm_danger" != "YES" ]]; then
			echo -e "${INFO} 操作已取消,出于安全考虑未执行删除。"
			sleep 2
			start_menu
			return
		fi
	else
		read -p "请确认是否卸载?(Y/n): " confirm
		if [[ "$confirm" =~ ^[nN]$ ]]; then
			echo -e "${INFO} 操作已取消。"
			sleep 2
			start_menu
			return
		fi
	fi

	echo -e "${INFO} 正在执行卸载,如果遇到断开连接请不要惊慌,稍等几分钟后尝试重启服务器..."
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		rpm -e --nodeps $pkgs_to_del
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		apt-get purge -y $pkgs_to_del
		apt-get autoremove -y >/dev/null 2>&1
	fi

	BBR_grub
	echo -e "${INFO} 指定内核卸载完毕!引导项已自动更新。"
	sleep 2
	start_menu
}

# 编译安装 brutal
startbrutal() {
	if [[ "$headers_status" == "已匹配" ]]; then
		echo -e "${INFO} Headers 已匹配,开始编译 Brutal..."
		bash <(curl -fsSL https://tcp.hy2.sh/)
		if lsmod | grep -q "brutal"; then
			echo -e "${INFO} Brutal 模块已成功加载!"
		else
			echo -e "${ERROR} Brutal 模块未加载,编译可能失败。"
		fi
	else
		echo -e "${ERROR} 当前内核 Headers 不匹配或者未安装,无法编译。"
	fi
}

# 安装启用 LotSpeed (uk0开发)
install_lotspeed() {
	echo -e "${INFO} 准备安装并启用 LotSpeed (ml-tcp 分支) ..."
	# 执行官方一键安装脚本
	bash <(curl -fsSL https://raw.githubusercontent.com/uk0/lotspeed/ml-tcp/install.sh)

	if lsmod | grep -q "lotspeed"; then
		echo -e "${INFO} LotSpeed 模块已成功加载!"
		# 将其写入 99-sysctl.conf 确保重启后也是默认算法
		local sysctl_conf="/etc/sysctl.d/99-sysctl.conf"
		sed -i '/net.ipv4.tcp_congestion_control/d' "$sysctl_conf" /etc/sysctl.conf 2>/dev/null
		echo "net.ipv4.tcp_congestion_control=lotspeed" >>"$sysctl_conf"
		sysctl --system >/dev/null 2>&1
		echo -e "${INFO} LotSpeed 已设置为默认拥塞控制算法!"
	else
		echo -e "${ERROR} LotSpeed 模块加载失败,请检查上方编译日志(通常是因为内核 Headers 缺失或版本过低)。"
	fi
}

# 单独启用 LotSpeed 加速 (免编译快速切换)
enable_lotspeed_standalone() {
	if ! command -v lotspeed >/dev/null 2>&1; then
		echo -e "${ERROR} 未检测到 LotSpeed,请先执行菜单 [26] 进行编译安装!"
		sleep 3
		return
	fi
	remove_bbr_lotserver
	echo -e "${INFO} 正在启动 LotSpeed 加速..."
	lotspeed start >/dev/null 2>&1

	# 确保将其写死为默认启动项
	local sysctl_conf="/etc/sysctl.d/99-sysctl.conf"
	sed -i '/net.ipv4.tcp_congestion_control/d; /net.core.default_qdisc/d' "$sysctl_conf" /etc/sysctl.conf 2>/dev/null
	echo "net.core.default_qdisc=fq" >>"$sysctl_conf"
	echo "net.ipv4.tcp_congestion_control=lotspeed" >>"$sysctl_conf"
	sysctl --system >/dev/null 2>&1

	echo -e "${INFO} LotSpeed 加速已成功切换并启用!"
}

# =================================================
#  杂项与附加功能模块 (补齐缺失的函数)
# =================================================
Update_Shell() {
	echo -e "${INFO} 正在更新脚本..."
	wget -O tcpx.sh "https://raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master/tcpx.sh" && chmod +x tcpx.sh && ./tcpx.sh
	exit 0
}

gototcp() {
	echo -e "${INFO} 正在切换到卸载内核版本..."
	wget -O tcp.sh "https://raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master/tcp.sh" && chmod +x tcp.sh && ./tcp.sh
	exit 0
}

gotodd() {
	echo -e "${INFO} 正在切换到一键 DD 系统脚本..."
	wget -qO- "https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh" | bash
	exit 0
}

gotoipcheck() {
	echo -e "${INFO} 正在下载并运行流媒体/IP检测脚本..."
	bash <(curl -L -s check.unlock.media)
	exit 0
}

closeipv6() {
	echo -e "${INFO} 正在禁用 IPv6..."
	sed -i '/net.ipv6.conf.all.disable_ipv6/d; /net.ipv6.conf.default.disable_ipv6/d' /etc/sysctl.d/99-sysctl.conf /etc/sysctl.conf 2>/dev/null
	echo "net.ipv6.conf.all.disable_ipv6 = 1" >>/etc/sysctl.d/99-sysctl.conf
	echo "net.ipv6.conf.default.disable_ipv6 = 1" >>/etc/sysctl.d/99-sysctl.conf
	sysctl --system >/dev/null 2>&1
	echo -e "${INFO} IPv6 已成功禁用!"
}

openipv6() {
	echo -e "${INFO} 正在开启 IPv6..."
	sed -i '/net.ipv6.conf.all.disable_ipv6/d; /net.ipv6.conf.default.disable_ipv6/d' /etc/sysctl.d/99-sysctl.conf /etc/sysctl.conf 2>/dev/null
	echo "net.ipv6.conf.all.disable_ipv6 = 0" >>/etc/sysctl.d/99-sysctl.conf
	echo "net.ipv6.conf.default.disable_ipv6 = 0" >>/etc/sysctl.d/99-sysctl.conf
	sysctl --system >/dev/null 2>&1
	echo -e "${INFO} IPv6 已成功开启!"
}

optimizing_ddcc() {
	echo -e "${INFO} 正在应用防 CC/DDOS 轻量优化..."
	local sysctl_conf="/etc/sysctl.d/99-sysctl.conf"
	sed -i '/net.ipv4.tcp_syncookies/d; /net.ipv4.tcp_max_syn_backlog/d; /net.ipv4.tcp_synack_retries/d' "$sysctl_conf" 2>/dev/null
	cat >>"$sysctl_conf" <<EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024000
net.ipv4.tcp_synack_retries = 1
EOF
	sysctl --system >/dev/null 2>&1
	echo -e "${INFO} 防 CC 基础参数已写入并生效!"
}

# =================================================
#  UI 面板与主逻辑
# =================================================

# 获取系统面板信息
get_system_info() {
	opsy="${OS_TYPE} ${OS_VERSION_ID}"
	arch="${OS_ARCH}"
	kern=$(uname -r)

	# 获取虚拟化类型
	if command -v virt-what >/dev/null 2>&1; then
		virtual=$(virt-what | head -n 1)
	elif command -v systemd-detect-virt >/dev/null 2>&1; then
		virtual=$(systemd-detect-virt)
	else
		virtual="Unknown"
	fi
	[[ -z "$virtual" ]] && virtual="Dedicated"
}

# 开始菜单
start_menu() {
	clear
	echo && echo -e " TCP加速 一键安装管理脚本 ${RED_FONT_PREFIX}[v${SH_VER}] 不卸内核${FONT_COLOR_SUFFIX} from blog.ylx.me 母鸡慎用
 ${GREEN_FONT_PREFIX}0.${FONT_COLOR_SUFFIX} 升级脚本
 ${GREEN_FONT_PREFIX}91.${FONT_COLOR_SUFFIX} 切换到卸载内核版本
 ———————————————————————————— 内核安装 —————————————————————————————
 ${GREEN_FONT_PREFIX}1.${FONT_COLOR_SUFFIX} 安装 BBR自编编译内核     ${GREEN_FONT_PREFIX}7.${FONT_COLOR_SUFFIX} 安装 官方稳定内核
 ${GREEN_FONT_PREFIX}2.${FONT_COLOR_SUFFIX} 安装 BBRplus版内核       ${GREEN_FONT_PREFIX}8.${FONT_COLOR_SUFFIX} 安装 官方最新内核
 ${GREEN_FONT_PREFIX}3.${FONT_COLOR_SUFFIX} 安装 Lotserver(锐速)内核 ${GREEN_FONT_PREFIX}9.${FONT_COLOR_SUFFIX} 安装 XANMOD(main)
 ${GREEN_FONT_PREFIX}4.${FONT_COLOR_SUFFIX} 安装 官方cloud内核       ${GREEN_FONT_PREFIX}10.${FONT_COLOR_SUFFIX} 安装 XANMOD(LTS)
 ${GREEN_FONT_PREFIX}5.${FONT_COLOR_SUFFIX} 安装 BBRplus新版内核     ${GREEN_FONT_PREFIX}11.${FONT_COLOR_SUFFIX} 安装 XANMOD(EDGE)
 ${GREEN_FONT_PREFIX}6.${FONT_COLOR_SUFFIX} 安装 Zen官方版内核       ${GREEN_FONT_PREFIX}12.${FONT_COLOR_SUFFIX} 安装 XANMOD(RT)
 ———————————————————————————— 加速启用 —————————————————————————————
 ${GREEN_FONT_PREFIX}20.${FONT_COLOR_SUFFIX} 使用BBR+FQ加速          ${GREEN_FONT_PREFIX}21.${FONT_COLOR_SUFFIX} 使用BBR+FQ_PIE加速 
 ${GREEN_FONT_PREFIX}22.${FONT_COLOR_SUFFIX} 使用BBR+CAKE加速        ${GREEN_FONT_PREFIX}23.${FONT_COLOR_SUFFIX} 使用BBRplus+FQ版加速
 ${GREEN_FONT_PREFIX}24.${FONT_COLOR_SUFFIX} 使用Lotserver(锐速)加速 ${GREEN_FONT_PREFIX}25.${FONT_COLOR_SUFFIX} 编译安装brutal模块
 ${GREEN_FONT_PREFIX}26.${FONT_COLOR_SUFFIX} 编译安装LotSpeed模块    ${GREEN_FONT_PREFIX}27.${FONT_COLOR_SUFFIX} 使用LotSpeed加速
 ———————————————————————————— 系统配置 —————————————————————————————
 ${GREEN_FONT_PREFIX}30.${FONT_COLOR_SUFFIX} 开启ECN                 ${GREEN_FONT_PREFIX}31.${FONT_COLOR_SUFFIX} 关闭ECN
 ${GREEN_FONT_PREFIX}32.${FONT_COLOR_SUFFIX} 系统网络自适应优化      ${GREEN_FONT_PREFIX}33.${FONT_COLOR_SUFFIX} 防CC/DDOS轻量优化
 ${GREEN_FONT_PREFIX}35.${FONT_COLOR_SUFFIX} 禁用IPv6                ${GREEN_FONT_PREFIX}36.${FONT_COLOR_SUFFIX} 开启IPv6
 ${GREEN_FONT_PREFIX}37.${FONT_COLOR_SUFFIX} 手动提交合并内核参数    ${GREEN_FONT_PREFIX}38.${FONT_COLOR_SUFFIX} 手动编辑内核参数
 ———————————————————————————— 内核管理 —————————————————————————————
 ${GREEN_FONT_PREFIX}51.${FONT_COLOR_SUFFIX} 查看排序内核            ${GREEN_FONT_PREFIX}52.${FONT_COLOR_SUFFIX} 删除保留指定内核
 ${GREEN_FONT_PREFIX}55.${FONT_COLOR_SUFFIX} 卸载全部加速            ${GREEN_FONT_PREFIX}99.${FONT_COLOR_SUFFIX} 退出脚本 
————————————————————————————————————————————————————————————————"
	check_status
	get_system_info
	echo -e " 信息: ${FONT_COLOR_SUFFIX}$opsy ${GREEN_FONT_PREFIX}$virtual${FONT_COLOR_SUFFIX} $arch ${GREEN_FONT_PREFIX}$kern${FONT_COLOR_SUFFIX} "
	if [[ ${kernel_status} == "noinstall" ]]; then
		echo -e " 状态: ${GREEN_FONT_PREFIX}未安装${FONT_COLOR_SUFFIX} 加速内核 ${RED_FONT_PREFIX}请先安装内核${FONT_COLOR_SUFFIX}"
	else
		echo -e " 状态: ${GREEN_FONT_PREFIX}已安装${FONT_COLOR_SUFFIX} ${RED_FONT_PREFIX}${kernel_status}${FONT_COLOR_SUFFIX} 加速内核 , ${GREEN_FONT_PREFIX}${run_status}${FONT_COLOR_SUFFIX} ${RED_FONT_PREFIX}${brutal}${FONT_COLOR_SUFFIX} ${RED_FONT_PREFIX}${lotspeed_status}${FONT_COLOR_SUFFIX}"
	fi
	echo -e " 拥塞控制算法: ${GREEN_FONT_PREFIX}${net_congestion_control}${FONT_COLOR_SUFFIX} 队列算法: ${GREEN_FONT_PREFIX}${net_qdisc}${FONT_COLOR_SUFFIX} Headers状态:${GREEN_FONT_PREFIX}${headers_status}${FONT_COLOR_SUFFIX}"

	read -p " 请输入数字 :" num
	case "$num" in
	0) Update_Shell ;;
	1) installbbr ;;
	2) installbbrplus ;;
	3) installlot ;;
	4) installcloud ;;
	5) installbbrplusnew ;;
	6) check_sys_official_zen ;;
	7) check_sys_official ;;
	8) check_sys_official_bbr ;;
	9) check_sys_official_xanmod_main ;;
	10) check_sys_official_xanmod_lts ;;
	11) check_sys_official_xanmod_edge ;;
	12) check_sys_official_xanmod_rt ;;
	20) enable_acceleration "fq" "bbr" ;;
	21) enable_acceleration "fq_pie" "bbr" ;;
	22) enable_acceleration "cake" "bbr" ;;
	23) enable_acceleration "fq" "bbrplus" ;;
	24) startlotserver ;;
	25) startbrutal ;;
	26) install_lotspeed ;;
	27) enable_lotspeed_standalone ;;
	30) set_ecn "1" ;;
	31) set_ecn "0" ;;
	32) optimizing_system ;;
	33) optimizing_ddcc ;;
	35) closeipv6 ;;
	36) openipv6 ;;
	37) update_sysctl_interactive ;;
	38) edit_sysctl_interactive ;;
	51) show_kernels ;;
	52) delete_kernel_custom ;;
	55) remove_all ;;
	60) gotoipcheck ;;
	91) gototcp ;;
	92) gotodd ;;
	99) exit 1 ;;
	*)
		clear
		echo -e "${ERROR}: 请输入正确数字"
		sleep 3s
		start_menu
		;;
	esac
}

#-----------------------------------------------------------------------
# 函数: update_sysctl_interactive (V4 - 增加错误忽略参数)
# 功能: 以交互方式安全地更新 sysctl 配置文件并应用。
#       命令执行失败时,将不会回滚文件更改。
#-----------------------------------------------------------------------
update_sysctl_interactive() {
	# 强制使用C语言环境,确保正则表达式的行为可预测且一致。
	local LC_ALL=C

	# --- 配置与参数解析 ---
	local CONF_FILE="/etc/sysctl.d/99-sysctl.conf"
	local TMP_FILE
	local BACKUP_FILE
	local ignore_apply_error=true

	# --- 帮助函数 ---
	log_info() {
		echo "[INFO] $1"
	}

	log_error() {
		echo "[ERROR] $1" >&2
	}

	log_warn() {
		echo "[WARN] $1" >&2
	}

	# --- 主逻辑 ---

	# 1. 权限检查
	if [[ $EUID -ne 0 ]]; then
		log_error "此函数必须以 root 权限运行,请使用 sudo。"
		return 1
	fi

	# 2. 交互式获取用户输入
	log_info "请输入或粘贴您要设置的 sysctl 参数 (格式: key = value)。"
	log_info "可参考TCP迷之调参,https://omnitt.com/"
	log_info "注释行(以 # 或 ; 开头)和空行将被忽略。"
	log_info "最后一行请以空行结束 可手动回车加一行空行"
	log_info "输入完成后,请按 Ctrl+D 结束输入。"

	readarray -t user_input

	if [ ${#user_input[@]} -eq 0 ]; then
		log_info "没有接收到任何输入,操作已取消。"
		return 0
	fi

	# 确保配置文件存在
	touch "$CONF_FILE"

	# 3. 创建临时文件
	TMP_FILE=$(mktemp) || {
		log_error "无法创建临时文件"
		return 1
	}
	trap 'rm -f "$TMP_FILE"' RETURN

	cp "$CONF_FILE" "$TMP_FILE"

	local -A params_to_add
	local all_params_valid=true

	# 4. 预处理所有输入,检查合法性
	log_info "正在校验所有输入参数..."
	for line in "${user_input[@]}"; do
		trimmed_line=$(echo "$line" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

		if [[ -z "$trimmed_line" ]] || [[ "$trimmed_line" =~ ^[[:space:]]*[#\;] ]]; then
			continue
		fi

		if ! [[ "$trimmed_line" =~ ^[[:space:]]*([a-zA-Z0-9._-]+)[[:space:]]*=[[:space:]]*(.*)[[:space:]]*$ ]]; then
			log_error "格式无效: '$trimmed_line'. 期望格式为 'key = value'."
			all_params_valid=false
			continue
		fi

		local key="${BASH_REMATCH[1]}"
		local value="${BASH_REMATCH[2]}"

		if ! sysctl -N "$key" >/dev/null 2>&1; then
			log_error "参数键名无效: '$key' 不是一个有效的内核参数。"
			all_params_valid=false
			continue
		fi

		local formatted_param="$key = $value"

		if grep -q -E "^[[:space:]]*${key//./\\.}([[:space:]]*)=.*" "$TMP_FILE"; then
			sed -i -E "s|^[[:space:]]*${key//./\\.}([[:space:]]*)=.*|$formatted_param|" "$TMP_FILE"
			log_info "已更新参数: $formatted_param"
		else
			if [[ -z "${params_to_add[$key]}" ]]; then
				params_to_add["$key"]="$formatted_param"
			fi
		fi
	done

	if ! $all_params_valid; then
		log_error "检测到无效参数,操作已中止。配置文件未做任何更改。"
		return 1
	fi

	# 5. 将所有新参数追加到临时文件末尾
	if [ ${#params_to_add[@]} -gt 0 ]; then
		log_info "正在添加新参数..."
		echo "" >>"$TMP_FILE"
		for key in "${!params_to_add[@]}"; do
			echo "${params_to_add[$key]}" >>"$TMP_FILE"
			log_info "已添加新参数: ${params_to_add[$key]}"
		done
	fi

	# 6. 原子替换与应用
	BACKUP_FILE="${CONF_FILE}.bak_$(date +%Y%m%d_%H%M%S)"
	cp "$CONF_FILE" "$BACKUP_FILE"
	log_info "原始文件已备份到 $BACKUP_FILE"

	mv "$TMP_FILE" "$CONF_FILE"
	chown root:root "$CONF_FILE"
	chmod 644 "$CONF_FILE"
	trap - RETURN

	# 7. 应用配置并进行错误处理
	log_info "正在应用新的 sysctl 设置..."
	if apply_output=$(sysctl -p "$CONF_FILE" 2>&1); then
		log_info "Sysctl 设置已成功应用。"
		echo "--- 应用输出 ---"
		echo "$apply_output"
		echo "------------------"
		rm -f "$BACKUP_FILE"
	else
		# 应用失败时的逻辑
		if [[ "$ignore_apply_error" == "true" ]]; then
			log_warn "应用 sysctl 设置失败,但根据指令已忽略错误。"
			log_warn "配置文件 '${CONF_FILE}' 已被更新,但部分设置可能未生效。"
			log_warn "--- 错误详情 ---"
			echo "$apply_output" >&2
			echo "------------------"
			rm -f "$BACKUP_FILE" # 忽略错误,所以也删除备份
			return 0             # 返回成功状态
		else
			log_error "应用 sysctl 设置失败!正在回滚..."
			log_error "--- 错误详情 ---"
			echo "$apply_output"
			echo "------------------"

			mv "$BACKUP_FILE" "$CONF_FILE"
			log_info "正在恢复到之前的设置..."
			sysctl -p "$CONF_FILE" >/dev/null 2>&1

			log_error "回滚完成。配置文件已恢复,问题备份文件保留在 $BACKUP_FILE"
			return 1
		fi
	fi

	return 0
}

edit_sysctl_interactive() {
	local target_file="/etc/sysctl.d/99-sysctl.conf"
	local editor_cmd=""

	# --- 1. 检查文件是否存在 ---
	if [ ! -f "$target_file" ]; then
		echo "文件 $target_file 不存在。"
		# (Y/n) 格式,n/N 以外的任何输入(包括回车)都将继续
		read -r -p "您想现在创建并编辑它吗? (Y/n): " create_choice

		case "$create_choice" in
		[nN])
			echo "操作已取消。"
			return 0 # 0 表示成功(用户主动取消)
			;;
		*)
			echo "好的,准备创建并打开编辑器..."
			# 注意:我们不需要在这里 'touch' 文件。
			# 'sudo' 配合编辑器(如 nano 或 vi)在保存时会自动创建文件。
			;;
		esac
	fi

	# --- 2. 检查并选择编辑器 ---
	if command -v nano >/dev/null; then
		# 优先使用 nano
		editor_cmd="nano"
	else
		# nano 不存在,提示安装
		echo "首选编辑器 'nano' 未安装。"
		# (Y/n) 格式,n/N 以外的任何输入(包括回车)都将继续
		read -r -p "您想现在安装 'nano' 吗? (Y/n): " install_choice

		case "$install_choice" in
		[nN])
			# 用户不安装,回退到 vi
			echo "好的,将使用 'vi' 编辑器。"
			echo "提示:'vi' 启动后,按 'i' 键进入插入模式,'Esc' 键退出插入模式,"
			echo "   然后输入 ':wq' 保存并退出,或 ':q!' 不保存退出。"
			editor_cmd="vi"
			;;
		*)
			# 这是一个安全的设计:函数不应该自己执行安装。
			# 它应该指导用户,然后退出,让用户安装后重试。
			echo "请在您的终端中运行:"
			echo "  sudo apt install nano  (适用于 Debian/Ubuntu)"
			echo "  sudo dnf install nano  (适用于 Fedora/RHEL 8+)"
			echo "  sudo yum install nano  (适用于 CentOS 7)"
			echo "安装完成后,请重新运行此函数。"
			echo "操作已取消。"
			return 1 # 1 表示一个非0的退出码,表示未完成
			;;
		esac
	fi

	# --- 3. 执行编辑 ---
	echo "正在使用 $editor_cmd 打开 $target_file..."
	echo "请注意:编辑系统文件需要管理员权限,您可能需要输入密码。"

	# 使用 sudo 来运行编辑器,以便有权限写入 /etc/sysctl.d/ 目录
	if ! "$editor_cmd" "$target_file"; then
		echo "编辑器 '$editor_cmd' 启动失败或异常退出。"
		echo "请检查您的 sudo 权限或编辑器是否正确安装。"
		return 1
	fi

	# --- 4. (修改) 默认直接应用 ---
	echo ""
	echo "编辑完成。"
	echo "正在应用 $target_file 中的设置..."

	# -p 参数会从指定文件中加载设置
	sysctl -p "$target_file"
	echo "已执行应用,部分可能需要重启生效"
}

# =================================================
#  官方源内核安装模块 (修复自适应变量)
# =================================================

# =================================================
#  官方源内核安装模块 (包含 CentOS 10 战未来支持)
# =================================================

#检查官方稳定内核并安装
#检查官方稳定内核并安装
check_sys_official() {
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		[[ "${OS_ARCH}" != "x86_64" ]] && {
			echo -e "${ERROR} 不支持x86_64以外的系统 !"
			exit 1
		}
		if [[ "${OS_VERSION_ID}" == "7" ]]; then
			yum install kernel kernel-headers -y --skip-broken
		elif [[ "${OS_VERSION_ID}" == "8" || "${OS_VERSION_ID}" == "9" || "${OS_VERSION_ID}" == "10" ]]; then
			# CentOS 8、9、10 都是同样的包结构
			yum install kernel kernel-core kernel-headers -y --skip-broken
		else
			echo -e "${ERROR} 不支持当前系统 CentOS ${OS_VERSION_ID} !" && exit 1
		fi
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		apt update
		if [[ "${OS_ID}" == "ubuntu" || "${OS_ID}" == "pop" || "${OS_ID_LIKE}" == *"ubuntu"* ]]; then
			# Ubuntu 及衍生版 (如 Mint) 使用 generic 命名
			apt-get install linux-image-generic linux-headers-generic -y
		else
			# Debian 及衍生版 (如 Kali, Armbian) 使用 amd64/arm64 命名
			if [[ "${OS_ARCH}" == "x86_64" ]]; then
				apt-get install linux-image-amd64 linux-headers-amd64 -y
			elif [[ "${OS_ARCH}" == "aarch64" ]]; then
				apt-get install linux-image-arm64 linux-headers-arm64 -y
			fi
		fi
	fi
	BBR_grub
	echo -e "${TIP} 内核安装完毕。"
}

#检查官方最新内核并安装 (ELRepo / Backports / HWE)
check_sys_official_bbr() {
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		[[ "${OS_ARCH}" != "x86_64" ]] && {
			echo -e "${ERROR} 不支持x86_64以外的系统 !"
			exit 1
		}
		rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
		if [[ "${OS_VERSION_ID}" == "7" ]]; then
			yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
			yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-headers -y --skip-broken
		elif [[ "${OS_VERSION_ID}" == "8" ]]; then
			yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm -y
			yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-headers -y --skip-broken
		elif [[ "${OS_VERSION_ID}" == "9" ]]; then
			yum install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm -y
			yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-headers -y --skip-broken
		elif [[ "${OS_VERSION_ID}" == "10" ]]; then
			yum install https://www.elrepo.org/elrepo-release-10.el10.elrepo.noarch.rpm -y
			yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-headers -y --skip-broken
		else
			echo -e "${ERROR} 不支持当前系统 CentOS ${OS_VERSION_ID} !" && exit 1
		fi
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		apt update
		if [[ "${OS_ID}" == "ubuntu" || "${OS_ID}" == "pop" || "${OS_ID_LIKE}" == *"ubuntu"* ]]; then
			# Ubuntu 及衍生版安装官方最新内核 (HWE - 硬件使能内核)
			echo -e "${INFO} 正在为 Ubuntu/衍生系 获取官方最新 HWE 内核..."
			if apt-cache show linux-generic-hwe-${OS_VERSION_ID} >/dev/null 2>&1; then
				apt-get install --install-recommends linux-generic-hwe-${OS_VERSION_ID} -y
			else
				echo -e "${TIP} 当前版本 (${OS_VERSION_ID}) 无专属 HWE 包,将自动为您更新至常规最新 generic 内核..."
				apt-get install linux-image-generic linux-headers-generic -y
			fi
		else
			# Debian 及衍生版 (如 Kali, Deepin)
			local apt_args=""
			# 仅为纯净 Debian 添加 Backports 源,避免搞坏 Kali 的滚动源
			if [[ "${OS_ID}" == "debian" ]]; then
				# 原生读取 os-release,彻底摆脱 lsb_release 依赖
				local codename=$(awk -F= '/^VERSION_CODENAME/{print $2}' /etc/os-release | tr -d '"')
				[[ -z "$codename" ]] && codename=$(awk -F= '/^VERSION=/{print $2}' /etc/os-release | grep -oP '(?<=\().*(?=\))')

				[[ -z "$codename" ]] && {
					echo -e "${ERROR} 无法获取 Debian 代号"
					exit 1
				}
				echo "deb http://deb.debian.org/debian ${codename}-backports main" >/etc/apt/sources.list.d/${codename}-backports.list
				apt update
				apt_args="-t ${codename}-backports"
			else
				echo -e "${TIP} 检测到 ${OS_ID} (非原生 Debian),跳过添加 Backports 源,直接从默认源安装最新内核..."
			fi

			if [[ "${OS_ARCH}" == "x86_64" ]]; then
				apt $apt_args install linux-image-amd64 linux-headers-amd64 -y
			elif [[ "${OS_ARCH}" =~ ^(arm|aarch64)$ ]]; then
				apt $apt_args install linux-image-arm64 linux-headers-arm64 -y
			fi
		fi
	fi
	BBR_grub
	echo -e "${TIP} 内核安装完毕。"
}

# 统一 Xanmod 安装引擎
install_xanmod_generic() {
	local edition="$1" # main, lts, edge, rt
	[[ "${OS_ARCH}" != "x86_64" ]] && {
		echo -e "${ERROR} Xanmod 仅支持 x86_64 !"
		exit 1
	}
	[[ "${OS_TYPE}" != "Debian" ]] && {
		echo -e "${ERROR} 当前一键 Xanmod 仅支持 Debian/Ubuntu !"
		exit 1
	}

	apt update
	apt-get install gnupg gnupg2 gnupg1 wget -y

	# 清除可能存在的旧版或重复源 (兼容 PR 提到的 .sources 与冲突问题)
	rm -f /etc/apt/sources.list.d/xanmod-kernel.list
	rm -f /etc/apt/sources.list.d/xanmod-release.list
	rm -f /etc/apt/sources.list.d/xanmod-kernel.sources
	sed -i '/deb.xanmod.org/d' /etc/apt/sources.list 2>/dev/null

	# 使用现代化的 signed-by 格式写入 GPG 密钥与源,彻底消除 apt 警告
	wget -qO - https://dl.xanmod.org/gpg.key | gpg --dearmor --yes -o /usr/share/keyrings/xanmod-archive-keyring.gpg
	echo 'deb [signed-by=/usr/share/keyrings/xanmod-archive-keyring.gpg] http://deb.xanmod.org releases main' | tee /etc/apt/sources.list.d/xanmod-kernel.list

	wget -qO check_x86-64_psabi.sh https://dl.xanmod.org/check_x86-64_psabi.sh
	chmod +x check_x86-64_psabi.sh
	local cpu_level=$(./check_x86-64_psabi.sh | awk -F 'v' '{print $2}')
	echo -e "${INFO} CPU 支持等级: \033[32mv${cpu_level}\033[0m"
	[[ -z "$cpu_level" ]] && cpu_level="1" # 默认 fallback

	apt update
	local pkg_name="linux-xanmod"
	[[ "$edition" != "main" ]] && pkg_name="linux-xanmod-${edition}"

	if [[ "$cpu_level" -ge 3 ]]; then
		apt install "${pkg_name}-x64v3" -y
	elif [[ "$cpu_level" == 2 ]]; then
		apt install "${pkg_name}-x64v2" -y
	else
		apt install "${pkg_name}-x64v1" -y
	fi

	BBR_grub
	echo -e "${TIP} 内核安装完毕。"
}

check_sys_official_xanmod_main() { install_xanmod_generic "main"; }
check_sys_official_xanmod_lts() { install_xanmod_generic "lts"; }
check_sys_official_xanmod_edge() { install_xanmod_generic "edge"; }
check_sys_official_xanmod_rt() { install_xanmod_generic "rt"; }

#检查Zen官方内核并安装
check_sys_official_zen() {
	[[ "${OS_ARCH}" != "x86_64" ]] && {
		echo -e "${ERROR} Zen内核仅支持x86_64 !"
		exit 1
	}
	if [[ "${OS_ID}" == "debian" || "${OS_ID}" == "kali" || "${OS_ID_LIKE}" == *"debian"* ]] && [[ "${OS_ID_LIKE}" != *"ubuntu"* && "${OS_ID}" != "ubuntu" && "${OS_ID}" != "pop" ]]; then
		curl -sL 'https://liquorix.net/add-liquorix-repo.sh' | bash
		apt-get install linux-image-liquorix-amd64 linux-headers-liquorix-amd64 -y
	elif [[ "${OS_ID}" == "ubuntu" || "${OS_ID}" == "pop" || "${OS_ID_LIKE}" == *"ubuntu"* ]]; then
		apt-get install software-properties-common -y
		add-apt-repository ppa:damentz/liquorix -y && apt-get update
		apt-get install linux-image-liquorix-amd64 linux-headers-liquorix-amd64 -y
	else
		echo -e "${ERROR} Zen内核当前脚本仅支持 Debian/Ubuntu 及衍生版 !" && exit 1
	fi
	BBR_grub
	echo -e "${TIP} 内核安装完毕。"
}

#检查系统当前状态
check_status() {
	# 初始化变量,避免重复读取文件
	kernel_version=$(uname -r | awk -F "-" '{print $1}')
	kernel_version_full=$(uname -r)
	net_congestion_control=$(cat /proc/sys/net/ipv4/tcp_congestion_control 2>/dev/null || echo "unknown")
	net_qdisc=$(cat /proc/sys/net/core/default_qdisc 2>/dev/null || echo "unknown")

	# 检测内核类型
	if [[ "$kernel_version_full" == *bbrplus* ]]; then
		kernel_status="BBRplus"
	elif [[ "$kernel_version_full" =~ (4\.9\.0-4|4\.15\.0-30|4\.8\.0-36|3\.16\.0-77|3\.16\.0-4|3\.2\.0-4|4\.11\.2-1|2\.6\.32-504|4\.4\.0-47|3\.13\.0-29) ]]; then
		kernel_status="Lotserver"
	elif read major minor <<<$(echo "$kernel_version" | awk -F'.' '{print $1, $2}') &&
		{ [[ "$major" == "4" && "$minor" -ge 9 ]] || [[ "$major" -ge 5 ]]; }; then
		kernel_status="BBR"
	else
		kernel_status="noinstall"
	fi

	# 运行状态检测
	if [[ "$kernel_status" == "BBR" ]]; then
		case "$net_congestion_control" in
		"bbr")
			run_status="BBR启动成功"
			;;
		"bbr2")
			run_status="BBR2启动成功"
			;;
		"tsunami")
			if lsmod | grep -q "^tcp_tsunami"; then
				run_status="BBR魔改版启动成功"
			else
				run_status="BBR魔改版启动失败"
			fi
			;;
		"nanqinlang")
			if lsmod | grep -q "^tcp_nanqinlang"; then
				run_status="暴力BBR魔改版启动成功"
			else
				run_status="暴力BBR魔改版启动失败"
			fi
			;;
		*)
			run_status="未安装加速模块"
			;;
		esac
	elif [[ "$kernel_status" == "Lotserver" ]]; then
		if [[ -e /appex/bin/lotServer.sh ]]; then
			run_status=$(bash /appex/bin/lotServer.sh status | grep "LotServer" | awk '{print $3}')
			[[ "$run_status" == "running!" ]] && run_status="启动成功" || run_status="启动失败"
		else
			run_status="未安装加速模块"
		fi
	elif [[ "$kernel_status" == "BBRplus" ]]; then
		case "$net_congestion_control" in
		"bbrplus")
			run_status="BBRplus启动成功"
			;;
		"bbr")
			run_status="BBR启动成功"
			;;
		*)
			run_status="未安装加速模块"
			;;
		esac
	else
		run_status="未安装加速模块"
	fi

	# 检查 Headers 状态 (利用全局 OS_TYPE)
	if [[ "${OS_TYPE}" == "CentOS" ]]; then
		installed_headers=$(rpm -qa | grep -E "kernel-devel|kernel-headers" | grep -v '^$' || echo "")
		if [[ -z "$installed_headers" ]]; then
			headers_status="未安装"
		else
			if echo "$installed_headers" | grep -q "kernel-devel-${kernel_version_full}\|kernel-headers-${kernel_version_full}"; then
				headers_status="已匹配"
			else
				headers_status="未匹配"
			fi
		fi
	elif [[ "${OS_TYPE}" == "Debian" ]]; then
		installed_headers=$(dpkg -l | grep -E "linux-headers|linux-image" | awk '{print $2}' | grep -v '^$' || echo "")
		if [[ -z "$installed_headers" ]]; then
			headers_status="未安装"
		else
			if echo "$installed_headers" | grep -q "linux-headers-${kernel_version_full}"; then
				headers_status="已匹配"
			else
				headers_status="未匹配"
			fi
		fi
	else
		headers_status="不支持的操作系统"
	fi

	# Brutal 状态检测
	brutal=""
	if lsmod | grep -q "brutal"; then
		brutal="brutal已加载"
	fi

	# 新增:LotSpeed 状态检测
	lotspeed_status=""
	if lsmod | grep -q "lotspeed"; then
		if [[ "$net_congestion_control" == "lotspeed" ]]; then
			run_status="LotSpeed启动成功" # 直接覆盖掉上面错误的“未安装”提示
		else
			lotspeed_status="LotSpeed已加载(未设为默认)"
		fi
	fi
}

#############系统检测组件#############
# =================================================
#  入口执行逻辑
# =================================================

# 命令行静默调用参数解析 (免菜单执行)
if [ $# -gt 0 ]; then
	check_sys
	check_cn_status
	case $1 in
	op0 | op1 | op2)
		# 兼容老指令,重定向到自适应新版优化
		optimizing_system
		exit
		;;
	op3)
		update_sysctl_interactive
		exit
		;;
	op4)
		edit_sysctl_interactive
		exit
		;;
	*)
		echo -e "${ERROR} 未知选项: \"$1\""
		exit 1
		;;
	esac
fi

# 常规交互式启动
check_sys
check_cn_status
start_menu