From 1609a31a09afd9f8ccebfd5e9f864887735e1682 Mon Sep 17 00:00:00 2001 From: zhao Date: Sat, 21 Dec 2024 09:22:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20install=5Fkernel.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhao --- install_kernel.sh | 3773 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3773 insertions(+) create mode 100644 install_kernel.sh diff --git a/install_kernel.sh b/install_kernel.sh new file mode 100644 index 0000000..a45e62a --- /dev/null +++ b/install_kernel.sh @@ -0,0 +1,3773 @@ +#!/bin/bash + +# +# Install linux kernel for TCP BBR and BBR Plus +# +# Copyright (C) 2021-2023 JinWYP +# + + +# 4.4 LTS 4.9 LTS 4.14 LTS 4.19 LTS +# 5.4 LTS 5.10 LTS + + +# 4.x版本内核最新的longterm版本是4.19.113,安装的话只能找个4.19的rpm包来安装了 + +# 从 Linux 4.9 版本开始,TCP BBR 就已经成为了 Linux 系统内核的一部分。因此,开启 BBR 的首要前提就是当前系统内核版本大于等于 4.9 + +# Linux 内核 5.6 正式发布了,内置了 wireguard module +# Linux 5.6 引入 FQ-PIE 数据包调度程序以帮助应对 Bufferbloat +# 5.5内核支持cake队列 +# 自来光大佬: xamod内核5.8默认队列算法已经改为 fq_pie 之前是cake + + +# centos8 安装完成默认内核 kernel-core-4.18.0-240.15.1.el8_3.x86_64, kernel-modules-4.18.0-240.15.1.el8_3.x86_64 +# ubuntu16 安装完成默认内核 linux-generic 4.4.0.210, linux-headers-4.4.0-210 +# ubuntu18 安装完成默认内核 linux-generic 4.15.0.140, linux-headers-4.15.0-140 +# ubuntu20 安装完成默认内核 linux-image-5.4.0-70-generic , linux-headers-5.4.0-70 +# debian10 安装完成默认内核 4.19.0-16-amd64 +# debian11 安装完成默认内核 linux-image-5.10.0-8-amd64 + +# UJX6N 编译的bbr plus 内核 5.10.27-bbrplus 5.9.16 5.4.86 +# UJX6N 编译的bbr plus 内核 4.19.164 4.14.213 4.9.264-1.bbrplus +# https://github.com/cx9208/bbrplus/issues/27 + + +# BBR 速度评测 +# https://www.shopee6.com/web/web-tutorial/bbr-vs-plus-vs-bbr2.html +# https://hostloc.com/thread-644985-1-1.html + +# https://dropbox.tech/infrastructure/evaluating-bbrv2-on-the-dropbox-edge-network + + + +export LC_ALL=C +export LANG=en_US.UTF-8 +export LANGUAGE=en_US.UTF-8 + + +sudoCmd="" +if [[ $(/usr/bin/id -u) -ne 0 ]]; then + sudoCmd="sudo" +fi + + +# fonts color +red(){ + echo -e "\033[31m\033[01m$1\033[0m" +} +green(){ + echo -e "\033[32m\033[01m$1\033[0m" +} +yellow(){ + echo -e "\033[33m\033[01m$1\033[0m" +} +blue(){ + echo -e "\033[34m\033[01m$1\033[0m" +} +bold(){ + echo -e "\033[1m\033[01m$1\033[0m" +} + +Green_font_prefix="\033[32m" +Red_font_prefix="\033[31m" +Green_background_prefix="\033[42;37m" +Red_background_prefix="\033[41;37m" +Font_color_suffix="\033[0m" + + + + + +osCPU="" +osArchitecture="arm" +osInfo="" +osRelease="" +osReleaseVersion="" +osReleaseVersionNo="" +osReleaseVersionNoShort="" +osReleaseVersionCodeName="CodeName" +osSystemPackage="" +osSystemMdPath="" +osSystemShell="bash" + +function checkArchitecture(){ + # https://stackoverflow.com/questions/48678152/how-to-detect-386-amd64-arm-or-arm64-os-architecture-via-shell-bash + + case $(uname -m) in + i386) osArchitecture="386" ;; + i686) osArchitecture="386" ;; + x86_64) osArchitecture="amd64" ;; + arm) dpkg --print-architecture | grep -q "arm64" && osArchitecture="arm64" || osArchitecture="arm" ;; + aarch64) dpkg --print-architecture | grep -q "arm64" && osArchitecture="arm64" || osArchitecture="arm" ;; + * ) osArchitecture="arm" ;; + esac +} + +function checkCPU(){ + osCPUText=$(cat /proc/cpuinfo | grep vendor_id | uniq) + if [[ $osCPUText =~ "GenuineIntel" ]]; then + osCPU="intel" + elif [[ $osCPUText =~ "AMD" ]]; then + osCPU="amd" + else + echo + fi + + # green " Status 状态显示--当前CPU是: $osCPU" +} + +# 检测系统版本号 +getLinuxOSVersion(){ + if [[ -s /etc/redhat-release ]]; then + osReleaseVersion=$(grep -oE '[0-9.]+' /etc/redhat-release) + else + osReleaseVersion=$(grep -oE '[0-9.]+' /etc/issue) + fi + + # https://unix.stackexchange.com/questions/6345/how-can-i-get-distribution-name-and-version-number-in-a-simple-shell-script + + if [ -f /etc/os-release ]; then + # freedesktop.org and systemd + source /etc/os-release + osInfo=$NAME + osReleaseVersionNo=$VERSION_ID + + if [ -n "$VERSION_CODENAME" ]; then + osReleaseVersionCodeName=$VERSION_CODENAME + fi + elif type lsb_release >/dev/null 2>&1; then + # linuxbase.org + osInfo=$(lsb_release -si) + osReleaseVersionNo=$(lsb_release -sr) + + elif [ -f /etc/lsb-release ]; then + # For some versions of Debian/Ubuntu without lsb_release command + . /etc/lsb-release + osInfo=$DISTRIB_ID + osReleaseVersionNo=$DISTRIB_RELEASE + + elif [ -f /etc/debian_version ]; then + # Older Debian/Ubuntu/etc. + osInfo=Debian + osReleaseVersion=$(cat /etc/debian_version) + osReleaseVersionNo=$(sed 's/\..*//' /etc/debian_version) + elif [ -f /etc/redhat-release ]; then + osReleaseVersion=$(grep -oE '[0-9.]+' /etc/redhat-release) + else + # Fall back to uname, e.g. "Linux ", also works for BSD, etc. + osInfo=$(uname -s) + osReleaseVersionNo=$(uname -r) + fi + + osReleaseVersionNoShort=$(echo $osReleaseVersionNo | sed 's/\..*//') +} + + +# 检测系统发行版代号 +function getLinuxOSRelease(){ + if [[ -f /etc/redhat-release ]]; then + osRelease="centos" + osSystemPackage="yum" + osSystemMdPath="/usr/lib/systemd/system/" + osReleaseVersionCodeName="" + elif cat /etc/issue | grep -Eqi "debian|raspbian"; then + osRelease="debian" + osSystemPackage="apt-get" + osSystemMdPath="/lib/systemd/system/" + osReleaseVersionCodeName="buster" + elif cat /etc/issue | grep -Eqi "ubuntu"; then + osRelease="ubuntu" + osSystemPackage="apt-get" + osSystemMdPath="/lib/systemd/system/" + osReleaseVersionCodeName="bionic" + elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then + osRelease="centos" + osSystemPackage="yum" + osSystemMdPath="/usr/lib/systemd/system/" + osReleaseVersionCodeName="" + elif cat /proc/version | grep -Eqi "debian|raspbian"; then + osRelease="debian" + osSystemPackage="apt-get" + osSystemMdPath="/lib/systemd/system/" + osReleaseVersionCodeName="buster" + elif cat /proc/version | grep -Eqi "ubuntu"; then + osRelease="ubuntu" + osSystemPackage="apt-get" + osSystemMdPath="/lib/systemd/system/" + osReleaseVersionCodeName="bionic" + elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then + osRelease="centos" + osSystemPackage="yum" + osSystemMdPath="/usr/lib/systemd/system/" + osReleaseVersionCodeName="" + fi + + getLinuxOSVersion + checkArchitecture + checkCPU + virt_check + + [[ -z $(echo $SHELL|grep zsh) ]] && osSystemShell="bash" || osSystemShell="zsh" + + echo "OS info: ${osInfo}, ${osRelease}, ${osReleaseVersion}, ${osReleaseVersionNo}, ${osReleaseVersionCodeName}, ${osSystemShell}, ${osSystemPackage}, ${osSystemMdPath}" +} + + +virt_check(){ + # if hash ifconfig 2>/dev/null; then + # eth=$(ifconfig) + # fi + + virtualx=$(dmesg) 2>/dev/null + + + if [ "$(command -v dmidecode)" ]; then + sys_manu=$(dmidecode -s system-manufacturer) 2>/dev/null + sys_product=$(dmidecode -s system-product-name) 2>/dev/null + sys_ver=$(dmidecode -s system-version) 2>/dev/null + else + sys_manu="" + sys_product="" + sys_ver="" + fi + + if grep docker /proc/1/cgroup -qa; then + virtual="Docker" + elif grep lxc /proc/1/cgroup -qa; then + virtual="Lxc" + elif grep -qa container=lxc /proc/1/environ; then + virtual="Lxc" + elif [[ -f /proc/user_beancounters ]]; then + virtual="OpenVZ" + elif [[ "$virtualx" == *kvm-clock* ]]; then + virtual="KVM" + elif [[ "$cname" == *KVM* ]]; then + virtual="KVM" + elif [[ "$cname" == *QEMU* ]]; then + virtual="KVM" + elif [[ "$virtualx" == *"VMware Virtual Platform"* ]]; then + virtual="VMware" + elif [[ "$virtualx" == *"Parallels Software International"* ]]; then + virtual="Parallels" + elif [[ "$virtualx" == *VirtualBox* ]]; then + virtual="VirtualBox" + elif [[ -e /proc/xen ]]; then + virtual="Xen" + elif [[ "$sys_manu" == *"Microsoft Corporation"* ]]; then + if [[ "$sys_product" == *"Virtual Machine"* ]]; then + if [[ "$sys_ver" == *"7.0"* || "$sys_ver" == *"Hyper-V" ]]; then + virtual="Hyper-V" + else + virtual="Microsoft Virtual Machine" + fi + fi + else + virtual="Dedicated母鸡" + fi +} + + + + + + +function installSoftDownload(){ + if [[ "${osRelease}" == "debian" || "${osRelease}" == "ubuntu" ]]; then + + PACKAGE_LIST=( "wget" "curl" "git" "unzip" "apt-transport-https" "cpu-checker" "bc" "cron" ) + + # 检查所有软件包是否已安装 + for package in "${PACKAGE_LIST[@]}"; do + if ! dpkg -l | grep -qw "$package"; then + # green "$package is not installed. ${osSystemPackage} Installing..." + ${osSystemPackage} install -y "$package" + fi + done + + if ! dpkg -l | grep -qw curl; then + ${osSystemPackage} -y install wget curl git + + if [[ "${osRelease}" == "debian" ]]; then + echo "deb http://deb.debian.org/debian buster-backports main contrib non-free" > /etc/apt/sources.list.d/buster-backports.list + echo "deb-src http://deb.debian.org/debian buster-backports main contrib non-free" >> /etc/apt/sources.list.d/buster-backports.list + ${sudoCmd} apt update -y + fi + + fi + + if ! dpkg -l | grep -qw ca-certificates; then + ${osSystemPackage} -y install ca-certificates dmidecode + update-ca-certificates + fi + + elif [[ "${osRelease}" == "centos" ]]; then + + PACKAGE_LIST_Centos=( "wget" "curl" "git" "unzip" "bc" ) + + # 检查所有软件包是否已安装 + for package in "${PACKAGE_LIST_Centos[@]}"; do + if ! rpm -qa | grep -qw "$package"; then + # green "$package is not installed. ${osSystemPackage} Installing..." + ${osSystemPackage} install -y "$package" + fi + done + + # 处理ca证书 + if ! rpm -qa | grep -qw ca-certificates; then + ${osSystemPackage} -y install ca-certificates dmidecode + update-ca-trust force-enable + fi + fi + +} + + + + + + + + + + +# 更新本脚本 +function upgradeScript(){ + wget -Nq --no-check-certificate -O ./install_kernel.sh "https://raw.githubusercontent.com/jinwyp/one_click_script/master/install_kernel.sh" + green " Script upgrade successful. 本脚本升级成功! " + chmod +x ./install_kernel.sh + sleep 2s + exec "./install_kernel.sh" +} + + + + + + + + + +function rebootSystem(){ + + if [ -z $1 ]; then + + red "请检查上面的信息 是否有新内核版本, 老内核版本 ${osKernelVersionBackup} 是否已经卸载!" + echo + red "请注意检查 是否把新内核也误删卸载了, 无新内核 ${linuxKernelToInstallVersionFull} 不要重启, 可重新安装内核后再重启! " + + fi + + echo + read -p "是否立即重启? 请输入[Y/n]?" isRebootInput + isRebootInput=${isRebootInput:-Y} + + if [[ $isRebootInput == [Yy] ]]; then + ${sudoCmd} reboot + else + exit + fi +} + +function promptContinueOpeartion(){ + read -p "是否继续操作? 直接回车默认继续操作, 请输入[Y/n]:" isContinueInput + isContinueInput=${isContinueInput:-Y} + + if [[ $isContinueInput == [Yy] ]]; then + echo "" + else + exit 1 + fi +} + +# https://stackoverflow.com/questions/4023830/how-to-compare-two-strings-in-dot-separated-version-format-in-bash +versionCompare () { + if [[ $1 == $2 ]]; then + return 0 + fi + local IFS=. + local i ver1=($1) ver2=($2) + # fill empty fields in ver1 with zeros + for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)) + do + ver1[i]=0 + done + for ((i=0; i<${#ver1[@]}; i++)) + do + if [[ -z ${ver2[i]} ]] + then + # fill empty fields in ver2 with zeros + ver2[i]=0 + fi + if ((10#${ver1[i]} > 10#${ver2[i]})) + then + return 1 + fi + if ((10#${ver1[i]} < 10#${ver2[i]})) + then + return 2 + fi + done + return 0 +} + +versionCompareWithOp () { + versionCompare $1 $2 + case $? in + 0) op='=';; + 1) op='>';; + 2) op='<';; + esac + if [[ $op != $3 ]]; then + # echo "Version Number Compare Fail: Expected '$3', Actual '$op', Arg1 '$1', Arg2 '$2'" + return 1 + else + # echo "Version Number Compare Pass: '$1 $op $2'" + return 0 + fi +} + + + + + + + + + + + + + + + + +osKernelVersionFull=$(uname -r) +osKernelVersionBackup=$(uname -r | awk -F "-" '{print $1}') +osKernelVersionShort=$(uname -r | cut -d- -f1 | awk -F "." '{print $1"."$2}') +osKernelBBRStatus="" +systemBBRRunningStatus="no" +systemBBRRunningStatusText="" + +function listAvailableLinuxKernel(){ + echo + green " ==================================================" + green " 状态显示--当前可以被安装的 Linux 内核: " + if [[ "${osRelease}" == "centos" ]]; then + ${sudoCmd} yum --disablerepo="*" --enablerepo="elrepo-kernel" list available | grep kernel + else + if [ -z $1 ]; then + ${sudoCmd} apt-cache search linux-image + else + ${sudoCmd} apt-cache search linux-image | grep $1 + fi + fi + + green " ==================================================" + echo +} + +function listInstalledLinuxKernel(){ + echo + green " ==================================================" + green " 状态显示--当前已安装的 Linux 内核: " + echo + + if [[ "${osRelease}" == "debian" || "${osRelease}" == "ubuntu" ]]; then + dpkg --get-selections | grep linux- + # dpkg -l | grep linux- + # dpkg-query -l | grep linux- + # apt list --installed | grep linux- + echo + red " 如安装内核遇到kernel linux-image linux-headers 版本不一致问题, 请手动卸载已安装的kernel" + red " 卸载内核命令1 apt remove -y --purge linux-xxx名称" + red " 卸载内核命令2 apt autoremove -y --purge linux-xxx名称" + + elif [[ "${osRelease}" == "centos" ]]; then + ${sudoCmd} rpm -qa | grep kernel + echo + red " 如安装内核遇到kernel kernel-headers kernel-devel版本不一致问题, 请手动卸载已安装的kernel" + red " 卸载内核命令 rpm --nodeps -e kernel-xxx名称" + fi + green " ==================================================" + echo +} + +function showLinuxKernelInfoNoDisplay(){ + + isKernelSupportBBRVersion="4.9" + + if versionCompareWithOp "${isKernelSupportBBRVersion}" "${osKernelVersionShort}" ">"; then + echo + else + osKernelBBRStatus="BBR" + fi + + if [[ ${osKernelVersionFull} == *"bbrplus"* ]]; then + osKernelBBRStatus="BBR Plus" + elif [[ ${osKernelVersionFull} == *"xanmod"* ]]; then + osKernelBBRStatus="BBR 和 BBR2" + fi + + net_congestion_control=`cat /proc/sys/net/ipv4/tcp_congestion_control | awk '{print $1}'` + net_qdisc=`cat /proc/sys/net/core/default_qdisc | awk '{print $1}'` + net_ecn=`cat /proc/sys/net/ipv4/tcp_ecn | awk '{print $1}'` + + if [[ ${osKernelVersionBackup} == *"4.14.129"* ]]; then + # isBBREnabled=$(grep "net.ipv4.tcp_congestion_control" /etc/sysctl.conf | awk -F "=" '{print $2}') + # isBBREnabled=$(sysctl net.ipv4.tcp_available_congestion_control | awk -F "=" '{print $2}') + + isBBRTcpEnabled=$(lsmod | grep "bbr" | awk '{print $1}') + isBBRPlusTcpEnabled=$(lsmod | grep "bbrplus" | awk '{print $1}') + isBBR2TcpEnabled=$(lsmod | grep "bbr2" | awk '{print $1}') + else + isBBRTcpEnabled=$(sysctl net.ipv4.tcp_congestion_control | grep "bbr" | awk -F "=" '{print $2}' | awk '{$1=$1;print}') + isBBRPlusTcpEnabled=$(sysctl net.ipv4.tcp_congestion_control | grep "bbrplus" | awk -F "=" '{print $2}' | awk '{$1=$1;print}') + isBBR2TcpEnabled=$(sysctl net.ipv4.tcp_congestion_control | grep "bbr2" | awk -F "=" '{print $2}' | awk '{$1=$1;print}') + fi + + if [[ ${net_ecn} == "1" ]]; then + systemECNStatusText="已开启" + elif [[ ${net_ecn} == "0" ]]; then + systemECNStatusText="已关闭" + elif [[ ${net_ecn} == "2" ]]; then + systemECNStatusText="只对入站请求开启(默认值)" + else + systemECNStatusText="" + fi + + if [[ ${net_congestion_control} == "bbr" ]]; then + + if [[ ${isBBRTcpEnabled} == *"bbr"* ]]; then + systemBBRRunningStatus="bbr" + systemBBRRunningStatusText="BBR 已启动成功" + else + systemBBRRunningStatusText="BBR 启动失败" + fi + + elif [[ ${net_congestion_control} == "bbrplus" ]]; then + + if [[ ${isBBRPlusTcpEnabled} == *"bbrplus"* ]]; then + systemBBRRunningStatus="bbrplus" + systemBBRRunningStatusText="BBR Plus 已启动成功" + else + systemBBRRunningStatusText="BBR Plus 启动失败" + fi + + elif [[ ${net_congestion_control} == "bbr2" ]]; then + + if [[ ${isBBR2TcpEnabled} == *"bbr2"* ]]; then + systemBBRRunningStatus="bbr2" + systemBBRRunningStatusText="BBR2 已启动成功" + else + systemBBRRunningStatusText="BBR2 启动失败" + fi + + else + systemBBRRunningStatusText="未启动加速模块" + fi + +} + +function showLinuxKernelInfo(){ + + # https://stackoverflow.com/questions/8654051/how-to-compare-two-floating-point-numbers-in-bash + # https://stackoverflow.com/questions/229551/how-to-check-if-a-string-contains-a-substring-in-bash + + isKernelSupportBBRVersion="4.9" + + green " ==================================================" + green " 状态显示--当前Linux 内核版本: ${osKernelVersionShort} , $(uname -r) " + + if versionCompareWithOp "${isKernelSupportBBRVersion}" "${osKernelVersionShort}" ">"; then + green " 当前系统内核低于4.9, 不支持开启 BBR " + else + green " 当前系统内核高于4.9, 支持开启 BBR, ${systemBBRRunningStatusText}" + fi + + if [[ ${osKernelVersionFull} == *"xanmod"* ]]; then + green " 当前系统内核已支持开启 BBR2, ${systemBBRRunningStatusText}" + else + green " 当前系统内核不支持开启 BBR2" + fi + + if [[ ${osKernelVersionFull} == *"bbrplus"* ]]; then + green " 当前系统内核已支持开启 BBR Plus, ${systemBBRRunningStatusText}" + else + green " 当前系统内核不支持开启 BBR Plus" + fi + # sysctl net.ipv4.tcp_available_congestion_control 返回值 net.ipv4.tcp_available_congestion_control = bbr cubic reno 或 reno cubic bbr + # sysctl net.ipv4.tcp_congestion_control 返回值 net.ipv4.tcp_congestion_control = bbr + # sysctl net.core.default_qdisc 返回值 net.core.default_qdisc = fq + # lsmod | grep bbr 返回值 tcp_bbr 20480 3 或 tcp_bbr 20480 1 注意:并不是所有的 VPS 都会有此返回值,若没有也属正常。 + + # isFlagBbr=$(sysctl net.ipv4.tcp_congestion_control | awk '{print $3}') + + # if [[ (${isFlagBbr} == *"bbr"*) && (${isFlagBbr} != *"bbrplus"*) && (${isFlagBbr} != *"bbr2"*) ]]; then + # green " 状态显示--是否开启BBR: 已开启 " + # else + # green " 状态显示--是否开启BBR: 未开启 " + # fi + + # if [[ ${isFlagBbr} == *"bbrplus"* ]]; then + # green " 状态显示--是否开启BBR Plus: 已开启 " + # else + # green " 状态显示--是否开启BBR Plus: 未开启 " + # fi + + # if [[ ${isFlagBbr} == *"bbr2"* ]]; then + # green " 状态显示--是否开启BBR2: 已开启 " + # else + # green " 状态显示--是否开启BBR2: 未开启 " + # fi + + green " ==================================================" + echo +} + + +function enableBBRSysctlConfig(){ + # https://hostloc.com/thread-644985-1-1.html + # 优质线路用5.5+cake和原版bbr带宽跑的更足,不过cake的话就算高峰也不会像原版bbr那样跑不动,相比plus能慢些,但是区别不大, + # bbr plus的话美西或者一些延迟高的,用起来更好,锐速针对丢包高的有奇效 + # 带宽大,并且延迟低不丢包的话5.5+cake在我这比较好,延迟高用plus更好,丢包多锐速最好. 一般130ms以下用cake不错,以上的话用plus更好些 + + # https://github.com/xanmod/linux/issues/26 + # 说白了 bbrplus 就是改了点东西,然后那部分修改在 5.1 内核里合并进去了, 5.1 及以上的内核里自带的 bbr 已经包含了所谓的 bbrplus 的修改。 + # PS:bbr 是一直在修改的,比如说 5.0 内核的 bbr,4.15 内核的 bbr 和 4.9 内核的 bbr 其实都是不一样的 + + # https://sysctl-explorer.net/net/ipv4/tcp_ecn/ + + + removeBbrSysctlConfig + currentBBRText="bbr" + currentQueueText="fq" + currentECNValue="2" + currentECNText="" + + if [ $1 = "bbrplus" ]; then + currentBBRText="bbrplus" + + else + echo + echo " 请选择开启 (1) BBR 还是 (2) BBR2 网络加速 " + red " 选择 1 BBR 需要内核在 4.9 以上" + red " 选择 2 BBR2 需要内核为 XanMod " + read -p "请选择? 直接回车默认选1 BBR, 请输入[1/2]:" BBRTcpInput + BBRTcpInput=${BBRTcpInput:-1} + if [[ $BBRTcpInput == [2] ]]; then + if [[ ${osKernelVersionFull} == *"xanmod"* ]]; then + currentBBRText="bbr2" + + echo + echo " 请选择是否开启 ECN, (1) 关闭 (2) 开启 (3) 仅对入站请求开启 " + red " 注意: 开启 ECN 可能会造成网络设备无法访问" + read -p "请选择? 直接回车默认选1 关闭ECN, 请输入[1/2]:" ECNTcpInput + ECNTcpInput=${ECNTcpInput:-1} + if [[ $ECNTcpInput == [2] ]]; then + currentECNValue="1" + currentECNText="+ ECN" + elif [[ $ECNTcpInput == [3] ]]; then + currentECNValue="2" + else + currentECNValue="0" + fi + + else + echo + red " 当前系统内核没有安装 XanMod 内核, 无法开启BBR2, 改为开启BBR" + echo + currentBBRText="bbr" + fi + + else + currentBBRText="bbr" + fi + fi + + echo + echo " 请选择队列算法 (1) FQ, (2) FQ-Codel, (3) FQ-PIE, (4) CAKE " + red " 选择 2 FQ-Codel 队列算法 需要内核在 4.13 以上" + red " 选择 3 FQ-PIE 队列算法 需要内核在 5.6 以上" + red " 选择 4 CAKE 队列算法 需要内核在 5.5 以上" + read -p "请选择队列算法? 直接回车默认选1 FQ, 请输入[1/2/3/4]:" BBRQueueInput + BBRQueueInput=${BBRQueueInput:-1} + + if [[ $BBRQueueInput == [2] ]]; then + currentQueueText="fq_codel" + + elif [[ $BBRQueueInput == [3] ]]; then + currentQueueText="fq_pie" + + elif [[ $BBRQueueInput == [4] ]]; then + currentQueueText="cake" + + else + currentQueueText="fq" + fi + + echo "net.core.default_qdisc=${currentQueueText}" >> /etc/sysctl.conf + echo "net.ipv4.tcp_congestion_control=${currentBBRText}" >> /etc/sysctl.conf + echo "net.ipv4.tcp_ecn=${currentECNValue}" >> /etc/sysctl.conf + + isSysctlText=$(sysctl -p 2>&1 | grep "No such file") + + echo + if [[ -z "$isSysctlText" ]]; then + green " 已成功开启 ${currentBBRText} + ${currentQueueText} ${currentECNText} " + else + green " 已成功开启 ${currentBBRText} ${currentECNText}" + red " 但当前内核版本过低, 开启队列算法 ${currentQueueText} 失败! " + red "请重新运行脚本, 选择'2 开启 BBR 加速'后, 务必再选择 (1)FQ 队列算法 !" + fi + echo + + + read -p "是否优化系统网络配置? 直接回车默认优化, 请输入[Y/n]:" isOptimizingSystemInput + isOptimizingSystemInput=${isOptimizingSystemInput:-Y} + + if [[ $isOptimizingSystemInput == [Yy] ]]; then + addOptimizingSystemConfig "cancel" + else + echo + echo "sysctl -p" + echo + sysctl -p + echo + fi + +} + +# 卸载 bbr+锐速 配置 +function removeBbrSysctlConfig(){ + sed -i '/net.core.default_qdisc/d' /etc/sysctl.conf + sed -i '/net.ipv4.tcp_congestion_control/d' /etc/sysctl.conf + + sed -i '/net.ipv4.tcp_ecn/d' /etc/sysctl.conf + + if [[ -e /appex/bin/lotServer.sh ]]; then + bash <(wget --no-check-certificate -qO- https://git.io/lotServerInstall.sh) uninstall + fi +} + + +function removeOptimizingSystemConfig(){ + removeBbrSysctlConfig + + sed -i '/fs.file-max/d' /etc/sysctl.conf + sed -i '/fs.inotify.max_user_instances/d' /etc/sysctl.conf + + sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf + sed -i '/net.ipv4.tcp_fin_timeout/d' /etc/sysctl.conf + sed -i '/net.ipv4.tcp_tw_reuse/d' /etc/sysctl.conf + sed -i '/net.ipv4.ip_local_port_range/d' /etc/sysctl.conf + sed -i '/net.ipv4.tcp_max_syn_backlog/d' /etc/sysctl.conf + sed -i '/net.ipv4.tcp_max_tw_buckets/d' /etc/sysctl.conf + sed -i '/net.ipv4.route.gc_timeout/d' /etc/sysctl.conf + + sed -i '/net.ipv4.tcp_syn_retries/d' /etc/sysctl.conf + sed -i '/net.ipv4.tcp_synack_retries/d' /etc/sysctl.conf + sed -i '/net.core.somaxconn/d' /etc/sysctl.conf + sed -i '/net.core.netdev_max_backlog/d' /etc/sysctl.conf + sed -i '/net.ipv4.tcp_timestamps/d' /etc/sysctl.conf + sed -i '/net.ipv4.tcp_max_orphans/d' /etc/sysctl.conf + + # sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf + + + sed -i '/1000000/d' /etc/security/limits.conf + sed -i '/1000000/d' /etc/profile + + echo + green " 已删除当前系统的网络优化配置 " + echo +} + +function addOptimizingSystemConfig(){ + + # https://ustack.io/2019-11-21-Linux%E5%87%A0%E4%B8%AA%E9%87%8D%E8%A6%81%E7%9A%84%E5%86%85%E6%A0%B8%E9%85%8D%E7%BD%AE.html + # https://www.cnblogs.com/xkus/p/7463135.html + + # 优化系统配置 + + if grep -q "1000000" "/etc/profile"; then + echo + green " 系统网络配置 已经优化过, 不需要再次优化 " + echo + sysctl -p + echo + exit + fi + + if [ -z $1 ]; then + removeOptimizingSystemConfig + fi + + + + echo + green " 开始准备 优化系统网络配置 " + + cat >> /etc/sysctl.conf <<-EOF + +fs.file-max = 1000000 +fs.inotify.max_user_instances = 8192 + +net.ipv4.tcp_syncookies = 1 +net.ipv4.tcp_fin_timeout = 30 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.ip_local_port_range = 1024 65000 +net.ipv4.tcp_max_syn_backlog = 16384 +net.ipv4.tcp_max_tw_buckets = 6000 +net.ipv4.route.gc_timeout = 100 + +net.ipv4.tcp_syn_retries = 1 +net.ipv4.tcp_synack_retries = 1 +net.core.somaxconn = 32768 +net.core.netdev_max_backlog = 32768 +net.ipv4.tcp_timestamps = 0 +net.ipv4.tcp_max_orphans = 32768 + +# forward ipv4 +#net.ipv4.ip_forward = 1 + + +EOF + + + + cat >> /etc/security/limits.conf <<-EOF +* soft nofile 1000000 +* hard nofile 1000000 +EOF + + + echo "ulimit -SHn 1000000" >> /etc/profile + source /etc/profile + + + echo + sysctl -p + + echo + green " 已完成 系统网络配置的优化 " + echo + rebootSystem "noinfo" + +} + + + +function startIpv4(){ + + cat >> /etc/sysctl.conf <<-EOF +net.ipv4.tcp_retries2 = 8 +net.ipv4.tcp_slow_start_after_idle = 0 + +# forward ipv4 + +net.ipv6.conf.all.disable_ipv6 = 0 +net.ipv6.conf.default.disable_ipv6 = 0 + +net.ipv4.ip_forward = 1 +net.ipv6.conf.all.forwarding = 1 + +EOF + +} + + + + +function Enable_IPv6_Support() { + if [[ $(sysctl -a | grep 'disable_ipv6.*=.*1') || $(cat /etc/sysctl.{conf,d/*} | grep 'disable_ipv6.*=.*1') ]]; then + sed -i '/disable_ipv6/d' /etc/sysctl.{conf,d/*} + echo 'net.ipv6.conf.all.disable_ipv6 = 0' >/etc/sysctl.d/ipv6.conf + sysctl -w net.ipv6.conf.all.disable_ipv6=0 + fi +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +isInstallFromRepo="no" +userHomePath="${HOME}/download_linux_kernel" +linuxKernelByUser="elrepo" +linuxKernelToBBRType="" +linuxKernelToInstallVersion="5.15" +linuxKernelToInstallVersionFull="" + +elrepo_kernel_name="kernel-ml" +elrepo_kernel_version="5.4.110" + +altarch_kernel_name="kernel" +altarch_kernel_version="5.4.105" + + + +function downloadFile(){ + + tempUrl=$1 + tempFilename=$(echo "${tempUrl##*/}") + + echo "${userHomePath}/${linuxKernelToInstallVersionFull}/${tempFilename}" + if [ -f "${userHomePath}/${linuxKernelToInstallVersionFull}/${tempFilename}" ]; then + green "文件已存在, 不需要下载, 文件原下载地址: $1 " + else + green "文件下载中... Path: $1 " + wget -N --no-check-certificate -P ${userHomePath}/${linuxKernelToInstallVersionFull} $1 + if [ $? -eq 0 ]; then + green "文件下载成功. ${userHomePath}/${linuxKernelToInstallVersionFull}/${tempFilename}" + else + red "文件下载失败, 请检查网络或者手动下载文件到目录 ${userHomePath}/${linuxKernelToInstallVersionFull} " + promptContinueOpeartion + fi + fi + echo +} + + +function installKernel(){ + preferIPV4 + + if [ "${linuxKernelToBBRType}" = "bbrplus" ]; then + getVersionBBRPlus + fi + + if [[ "${osRelease}" == "debian" || "${osRelease}" == "ubuntu" ]]; then + installDebianUbuntuKernel + + elif [[ "${osRelease}" == "centos" ]]; then + rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org + + if [ "${linuxKernelToBBRType}" = "xanmod" ]; then + red " xanmod 内核不支持 Centos 系统安装" + exit 255 + fi + + if [ "${isInstallFromRepo}" = "yes" ]; then + getLatestCentosKernelVersion + installCentosKernelFromRepo + else + if [ "${linuxKernelToBBRType}" = "bbrplus" ]; then + echo + else + getLatestCentosKernelVersion "manual" + fi + + installCentosKernelManual + fi + fi +} + + +function getVersionBBRPlus(){ + if [ "${linuxKernelToInstallVersion}" = "6.7" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-6.x_stable") + + elif [ "${linuxKernelToInstallVersion}" = "6.6" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-6.6") + + elif [ "${linuxKernelToInstallVersion}" = "6.1" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-6.1") + + elif [ "${linuxKernelToInstallVersion}" = "5.19" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-5.19") + + elif [ "${linuxKernelToInstallVersion}" = "5.15" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-5.15") + + elif [ "${linuxKernelToInstallVersion}" = "5.10" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-5.10") + + elif [ "${linuxKernelToInstallVersion}" = "5.4" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-5.4") + + elif [ "${linuxKernelToInstallVersion}" = "4.19" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-4.19") + + elif [ "${linuxKernelToInstallVersion}" = "4.14" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus") + + elif [ "${linuxKernelToInstallVersion}" = "4.9" ]; then + bbrplusKernelVersion=$(getGithubLatestReleaseVersionBBRPlus "UJX6N/bbrplus-4.9") + fi + echo + green "UJX6N 编译的 Linux bbrplus 内核版本号为 ${bbrplusKernelVersion}" + echo + +} + +function getGithubLatestReleaseVersionBBRPlus(){ + wget --no-check-certificate -qO- https://api.github.com/repos/$1/tags | grep 'name' | cut -d\" -f4 | head -1 | cut -d- -f1 + # wget --no-check-certificate -qO- https://api.github.com/repos/UJX6N/bbrplus-5.14/tags | grep 'name' | cut -d\" -f4 | head -1 | cut -d- -f1 +} + + +function getLatestCentosKernelVersion(){ + + # https://stackoverflow.com/questions/4988155/is-there-a-bash-command-that-can-tell-the-size-of-a-shell-variable + + elrepo_kernel_version_lt_array=($(wget -qO- https://elrepo.org/linux/kernel/el8/x86_64/RPMS | awk -F'\"kernel-lt-' '/>kernel-lt-[4-9]./{print $2}' | cut -d- -f1 | sort -V)) + + # echo ${elrepo_kernel_version_lt_array[@]} + + echo + if [ ${#elrepo_kernel_version_lt_array[@]} -eq 0 ]; then + red " 无法获取到 Centos elrepo 源的最新的Linux 内核 kernel-lt 版本号 " + else + # echo ${elrepo_kernel_version_lt_array[${#elrepo_kernel_version_lt_array[@]} - 1]} + elrepo_kernel_version_lt=${elrepo_kernel_version_lt_array[${#elrepo_kernel_version_lt_array[@]} - 1]} + green "Centos elrepo 源的最新的Linux 内核 kernel-lt 版本号为 ${elrepo_kernel_version_lt}" + fi + + if [ -z $1 ]; then + elrepo_kernel_version_ml_array=($(wget -qO- https://elrepo.org/linux/kernel/el8/x86_64/RPMS | awk -F'>kernel-ml-' '/>kernel-ml-[4-9]./{print $2}' | cut -d- -f1 | sort -V)) + + if [ ${#elrepo_kernel_version_ml_array[@]} -eq 0 ]; then + red " 无法获取到 Centos elrepo 源的最新的Linux 内核 kernel-ml 版本号 " + else + elrepo_kernel_version_ml=${elrepo_kernel_version_ml_array[-1]} + green "Centos elrepo 源的最新的Linux 内核 kernel-ml 版本号为 ${elrepo_kernel_version_ml}" + fi + else + elrepo_kernel_version_ml_teddysun_ftp_array=($(wget --no-check-certificate -qO- https://fr1.teddyvps.com/kernel/el8 | awk -F'>kernel-ml-' '/>kernel-ml-[4-9]./{print $2}' | cut -d- -f1 | sort -V)) + elrepo_kernel_version_ml_teddysun_ftp_array_lts=($(wget --no-check-certificate -qO- https://fr1.teddyvps.com/kernel/el8 | awk -F'>kernel-ml-' '/>kernel-ml-[4-9]./{print $2}' | grep -v "elrepo" | cut -d- -f1 | sort -V)) + + if [ ${#elrepo_kernel_version_ml_teddysun_ftp_array_lts[@]} -eq 0 ]; then + red " 无法获取到由 Teddysun 编译的 Centos 最新的Linux 5.10 内核 kernel-ml 版本号 " + else + elrepo_kernel_version_ml=${elrepo_kernel_version_ml_teddysun_ftp_array[-1]} + elrepo_kernel_version_ml_Teddysun_number_temp=$(echo ${elrepo_kernel_version_ml} | grep -oe "\.[0-9]*\." | grep -oe "[0-9]*" ) + elrepo_kernel_version_ml_Teddysun_number_temp_first=${elrepo_kernel_version_ml:0:1} + + if [[ ${elrepo_kernel_version_ml_Teddysun_number_temp_first} == "5" ]]; then + elrepo_kernel_version_ml_Teddysun_latest_version_middle="19" + elrepo_kernel_version_ml_Teddysun_latest_version="5.${elrepo_kernel_version_ml_Teddysun_latest_version_middle}" + else + elrepo_kernel_version_ml_Teddysun_latest_version_middle=$((elrepo_kernel_version_ml_Teddysun_number_temp-1)) + elrepo_kernel_version_ml_Teddysun_latest_version="6.${elrepo_kernel_version_ml_Teddysun_latest_version_middle}" + fi + + + + + # https://stackoverflow.com/questions/229551/how-to-check-if-a-string-contains-a-substring-in-bash + for ver in "${elrepo_kernel_version_ml_teddysun_ftp_array_lts[@]}"; do + + if [[ ${ver} == *"5.10.222"* ]]; then + # echo "符合所选版本的Linux 5.10 内核版本: ${ver}" + elrepo_kernel_version_ml_Teddysun510=${ver} + fi + + if [[ ${ver} == *"5.15.163"* ]]; then + # echo "符合所选版本的Linux 5.15 内核版本: ${ver}" + elrepo_kernel_version_ml_Teddysun515=${ver} + fi + + if [[ ${ver} == *"6.1.100"* ]]; then + # echo "符合所选版本的Linux 6.1 内核版本: ${ver}" + elrepo_kernel_version_ml_Teddysun61=${ver} + fi + + if [[ ${ver} == *"6.6.41"* ]]; then + # echo "符合所选版本的Linux 6.1 内核版本: ${ver}" + elrepo_kernel_version_ml_Teddysun66=${ver} + fi + + if [[ ${ver} == *"${elrepo_kernel_version_ml_Teddysun_latest_version}"* ]]; then + # echo "符合所选版本的Linux 内核版本: ${ver}, ${elrepo_kernel_version_ml_Teddysun_latest_version}" + elrepo_kernel_version_ml_Teddysun_latest=${ver} + fi + + done + + green "Centos elrepo 源的最新的Linux 内核 kernel-ml 版本号为 ${elrepo_kernel_version_ml}" + green "由 Teddysun 编译的 Centos 最新的Linux 5.10 LTS 内核 kernel-ml 版本号为 ${elrepo_kernel_version_ml_Teddysun510}" + green "由 Teddysun 编译的 Centos 最新的Linux 5.15 LTS 内核 kernel-ml 版本号为 ${elrepo_kernel_version_ml_Teddysun515}" + green "由 Teddysun 编译的 Centos 最新的Linux 6.1 LTS 内核 kernel-ml 版本号为 ${elrepo_kernel_version_ml_Teddysun61}" + green "由 Teddysun 编译的 Centos 最新的Linux 6.6 LTS 内核 kernel-ml 版本号为 ${elrepo_kernel_version_ml_Teddysun66}" + green "由 Teddysun 编译的 Centos 最新的Linux 6.xx 内核 kernel-ml 版本号为 ${elrepo_kernel_version_ml_Teddysun_latest}" + + fi + fi + echo +} + + +function installCentosKernelFromRepo(){ + + green " ==================================================" + green " 开始通过 elrepo 源安装 linux 内核, 不支持Centos6 " + green " ==================================================" + + if [ -n "${osReleaseVersionNoShort}" ]; then + + if [ "${linuxKernelToInstallVersion}" = "5.4" ]; then + elrepo_kernel_name="kernel-lt" + elrepo_kernel_version=${elrepo_kernel_version_lt} + + else + elrepo_kernel_name="kernel-ml" + elrepo_kernel_version=${elrepo_kernel_version_ml} + fi + + if [ "${osKernelVersionBackup}" = "${elrepo_kernel_version}" ]; then + red "当前系统内核版本已经是 ${osKernelVersionBackup} 无需安装! " + promptContinueOpeartion + fi + + linuxKernelToInstallVersionFull=${elrepo_kernel_version} + + if [ "${osReleaseVersionNoShort}" -eq 7 ]; then + # https://computingforgeeks.com/install-linux-kernel-5-on-centos-7/ + + # https://elrepo.org/linux/kernel/ + # https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ + + ${sudoCmd} yum install -y yum-plugin-fastestmirror + ${sudoCmd} yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm + + elif [ "${osReleaseVersionNoShort}" -eq 8 ]; then + # https://elrepo.org/linux/kernel/el8/x86_64/RPMS/ + + ${sudoCmd} yum install -y yum-plugin-fastestmirror + ${sudoCmd} yum install -y https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm + + elif [ "${osReleaseVersionNoShort}" -eq 9 ]; then + # https://elrepo.org/linux/kernel/el8/x86_64/RPMS/ + + ${sudoCmd} yum install -y yum-plugin-fastestmirror + ${sudoCmd} yum install -y https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm + + else + green " ==================================================" + red " 不支持 Centos 7, 8, 9 以外的其他版本 安装 linux 内核" + green " ==================================================" + exit 255 + fi + + removeCentosKernelMulti + listAvailableLinuxKernel + echo + green " ==================================================" + green " 开始安装 linux 内核版本: ${linuxKernelToInstallVersionFull}" + echo + ${sudoCmd} yum -y --enablerepo=elrepo-kernel install ${elrepo_kernel_name} + ${sudoCmd} yum -y --enablerepo=elrepo-kernel install ${elrepo_kernel_name}-{devel,headers,tools,tools-libs} + + green " ==================================================" + green " 安装 linux 内核 ${linuxKernelToInstallVersionFull} 成功! " + red " 请根据以下信息 检查新内核是否安装成功,无新内核不要重启! " + green " ==================================================" + echo + + showLinuxKernelInfo + listInstalledLinuxKernel + removeCentosKernelMulti "kernel" + listInstalledLinuxKernel + rebootSystem + fi +} + + + + +function installCentosKernelManual(){ + + green " ==================================================" + green " 开始手动安装 linux 内核, 不支持Centos6 " + green " ==================================================" + echo + + yum install -y linux-firmware + + mkdir -p ${userHomePath} + cd ${userHomePath} + + kernelVersionFirstletter=${linuxKernelToInstallVersion:0:1} + + echo + if [ "${linuxKernelToBBRType}" = "bbrplus" ]; then + linuxKernelByUser="UJX6N" + if [ "${linuxKernelToInstallVersion}" = "4.14.129" ]; then + linuxKernelByUser="cx9208" + fi + green " 准备从 ${linuxKernelByUser} github 网站下载 bbrplus ${linuxKernelToInstallVersion} 的linux内核并安装 " + else + linuxKernelByUserTeddysun="" + + if [[ "${kernelVersionFirstletter}" == "5" || "${kernelVersionFirstletter}" == "6" ]]; then + linuxKernelByUser="elrepo" + + if [[ "${linuxKernelToInstallVersion}" == "5.10" || "${linuxKernelToInstallVersion}" == "5.15" || "${linuxKernelToInstallVersion}" == "5.19" ]]; then + linuxKernelByUserTeddysun="Teddysun" + fi + else + linuxKernelByUser="altarch" + fi + + if [ "${linuxKernelByUserTeddysun}" = "Teddysun" ]; then + green " 准备从 Teddysun 网站下载 linux ${linuxKernelByUser} 内核并安装 " + else + green " 准备从 ${linuxKernelByUser} 网站下载linux内核并安装 " + fi + + fi + echo + + if [ "${linuxKernelByUser}" = "elrepo" ]; then + # elrepo + + if [ "${linuxKernelToInstallVersion}" = "5.4" ]; then + elrepo_kernel_name="kernel-lt" + elrepo_kernel_version=${elrepo_kernel_version_lt} + elrepo_kernel_filename="elrepo." + ELREPODownloadUrl="https://elrepo.org/linux/kernel/el${osReleaseVersionNoShort}/x86_64/RPMS" + + # https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ + # https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.105-1.el7.elrepo.x86_64.rpm + # https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-tools-5.4.109-1.el7.elrepo.x86_64.rpm + # https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-tools-libs-5.4.109-1.el7.elrepo.x86_64.rpm + + elif [ "${linuxKernelToInstallVersion}" = "5.10" ]; then + elrepo_kernel_name="kernel-ml" + elrepo_kernel_version=${elrepo_kernel_version_ml_Teddysun510} + elrepo_kernel_filename="" + ELREPODownloadUrl="https://dl.lamp.sh/kernel/el${osReleaseVersionNoShort}" + + # https://dl.lamp.sh/kernel/el7/kernel-ml-5.10.37-1.el7.x86_64.rpm + # https://dl.lamp.sh/kernel/el8/kernel-ml-5.10.27-1.el8.x86_64.rpm + + elif [ "${linuxKernelToInstallVersion}" = "5.15" ]; then + elrepo_kernel_name="kernel-ml" + elrepo_kernel_version=${elrepo_kernel_version_ml_Teddysun515} + elrepo_kernel_filename="" + ELREPODownloadUrl="https://dl.lamp.sh/kernel/el${osReleaseVersionNoShort}" + + elif [ "${linuxKernelToInstallVersion}" = "6.1" ]; then + elrepo_kernel_name="kernel-ml" + elrepo_kernel_version=${elrepo_kernel_version_ml_Teddysun61} + elrepo_kernel_filename="" + ELREPODownloadUrl="https://dl.lamp.sh/kernel/el${osReleaseVersionNoShort}" + + elif [ "${linuxKernelToInstallVersion}" = "6.6" ]; then + elrepo_kernel_name="kernel-ml" + elrepo_kernel_version=${elrepo_kernel_version_ml_Teddysun66} + elrepo_kernel_filename="" + ELREPODownloadUrl="https://dl.lamp.sh/kernel/el${osReleaseVersionNoShort}" + + elif [ "${linuxKernelToInstallVersion}" = "${elrepo_kernel_version_ml_Teddysun_latest_version}" ]; then + elrepo_kernel_name="kernel-ml" + elrepo_kernel_version=${elrepo_kernel_version_ml_Teddysun_latest} + elrepo_kernel_filename="" + ELREPODownloadUrl="https://fr1.teddyvps.com/kernel/el${osReleaseVersionNoShort}" + + # https://fr1.teddyvps.com/kernel/el7/kernel-ml-5.12.14-1.el7.x86_64.rpm + + else + elrepo_kernel_name="kernel-ml" + elrepo_kernel_version=${elrepo_kernel_version_ml} + elrepo_kernel_filename="elrepo." + ELREPODownloadUrl="https://fr1.teddyvps.com/kernel/el${osReleaseVersionNoShort}" + + # https://fr1.teddyvps.com/kernel/el7/kernel-ml-5.13.0-1.el7.elrepo.x86_64.rpm + fi + + linuxKernelToInstallVersionFull=${elrepo_kernel_version} + + mkdir -p ${userHomePath}/${linuxKernelToInstallVersionFull} + cd ${userHomePath}/${linuxKernelToInstallVersionFull} + + echo + echo "+++++++++++ elrepo_kernel_version ${elrepo_kernel_version}" + echo + + if [ "${osReleaseVersionNoShort}" -eq 7 ]; then + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-${elrepo_kernel_version}-1.el7.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-devel-${elrepo_kernel_version}-1.el7.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-headers-${elrepo_kernel_version}-1.el7.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-tools-${elrepo_kernel_version}-1.el7.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-tools-libs-${elrepo_kernel_version}-1.el7.${elrepo_kernel_filename}x86_64.rpm + + elif [ "${osReleaseVersionNoShort}" -eq 8 ]; then + + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-${elrepo_kernel_version}-1.el8.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-devel-${elrepo_kernel_version}-1.el8.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-headers-${elrepo_kernel_version}-1.el8.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-core-${elrepo_kernel_version}-1.el8.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-modules-${elrepo_kernel_version}-1.el8.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-tools-${elrepo_kernel_version}-1.el8.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-tools-libs-${elrepo_kernel_version}-1.el8.${elrepo_kernel_filename}x86_64.rpm + + elif [ "${osReleaseVersionNoShort}" -eq 9 ]; then + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-${elrepo_kernel_version}-1.el9.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-devel-${elrepo_kernel_version}-1.el9.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-headers-${elrepo_kernel_version}-1.el9.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-core-${elrepo_kernel_version}-1.el9.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-modules-${elrepo_kernel_version}-1.el9.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-modules-extra-${elrepo_kernel_version}-1.el9.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-tools-${elrepo_kernel_version}-1.el9.${elrepo_kernel_filename}x86_64.rpm + downloadFile ${ELREPODownloadUrl}/${elrepo_kernel_name}-tools-libs-${elrepo_kernel_version}-1.el9.${elrepo_kernel_filename}x86_64.rpm + + # https://fr1.teddyvps.com/kernel/el9/kernel-ml-6.1.0-1.el9.elrepo.x86_64.rpm + # https://fr1.teddyvps.com/kernel/el9/kernel-ml-modules-extra-6.1.0-1.el9.elrepo.x86_64.rpm + # https://fr1.teddyvps.com/kernel/el9/kernel-ml-tools-libs-devel-6.1.0-1.el9.elrepo.x86_64.rpm + fi + + + removeCentosKernelMulti + echo + green " ==================================================" + green " 开始安装 linux 内核版本: ${linuxKernelToInstallVersionFull}" + echo + + if [ "${osReleaseVersionNoShort}" -eq 8 ]; then + rpm -ivh --force --nodeps ${elrepo_kernel_name}-core-${elrepo_kernel_version}-*.rpm + fi + + rpm -ivh --force --nodeps ${elrepo_kernel_name}-${elrepo_kernel_version}-*.rpm + rpm -ivh --force --nodeps ${elrepo_kernel_name}-*.rpm + + + elif [ "${linuxKernelByUser}" = "altarch" ]; then + # altarch + + if [ "${linuxKernelToInstallVersion}" = "4.14" ]; then + altarch_kernel_version="4.14.119-200" + altarchDownloadUrl="https://vault.centos.org/altarch/7.6.1810/kernel/x86_64/Packages" + + # https://vault.centos.org/altarch/7.6.1810/kernel/x86_64/Packages/kernel-4.14.119-200.el7.x86_64.rpm + elif [ "${linuxKernelToInstallVersion}" = "4.19" ]; then + altarch_kernel_version="4.19.113-300" + altarchDownloadUrl="https://vault.centos.org/altarch/7.8.2003/kernel/x86_64/Packages" + + # https://vault.centos.org/altarch/7.8.2003/kernel/x86_64/Packages/kernel-4.19.113-300.el7.x86_64.rpm + else + altarch_kernel_version="5.4.105" + altarchDownloadUrl="http://mirror.centos.org/altarch/7/kernel/x86_64/Packages" + + # http://mirror.centos.org/altarch/7/kernel/x86_64/Packages/kernel-5.4.96-200.el7.x86_64.rpm + fi + + linuxKernelToInstallVersionFull=$(echo ${altarch_kernel_version} | cut -d- -f1) + + mkdir -p ${userHomePath}/${linuxKernelToInstallVersionFull} + cd ${userHomePath}/${linuxKernelToInstallVersionFull} + + if [ "${osReleaseVersionNoShort}" -eq 7 ]; then + + if [ "$kernelVersionFirstletter" = "5" ]; then + # http://mirror.centos.org/altarch/7/kernel/x86_64/Packages/ + + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-${altarch_kernel_version}-200.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-core-${altarch_kernel_version}-200.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-devel-${altarch_kernel_version}-200.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-headers-${altarch_kernel_version}-200.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-modules-${altarch_kernel_version}-200.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-tools-${altarch_kernel_version}-200.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-tools-libs-${altarch_kernel_version}-200.el7.x86_64.rpm + + else + # https://vault.centos.org/altarch/7.6.1810/kernel/x86_64/Packages/ + # https://vault.centos.org/altarch/7.6.1810/kernel/x86_64/Packages/kernel-4.14.119-200.el7.x86_64.rpm + + # https://vault.centos.org/altarch/7.8.2003/kernel/x86_64/Packages/ + # https://vault.centos.org/altarch/7.8.2003/kernel/i386/Packages/kernel-4.19.113-300.el7.i686.rpm + # https://vault.centos.org/altarch/7.8.2003/kernel/x86_64/Packages/kernel-4.19.113-300.el7.x86_64.rpm + # http://ftp.iij.ad.jp/pub/linux/centos-vault/altarch/7.8.2003/kernel/i386/Packages/kernel-4.19.113-300.el7.i686.rpm + + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-${altarch_kernel_version}.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-core-${altarch_kernel_version}.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-devel-${altarch_kernel_version}.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-headers-${altarch_kernel_version}.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-modules-${altarch_kernel_version}.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-tools-${altarch_kernel_version}.el7.x86_64.rpm + downloadFile ${altarchDownloadUrl}/${altarch_kernel_name}-tools-libs-${altarch_kernel_version}.el7.x86_64.rpm + + fi + + else + red "从 altarch 源没有找到 Centos 8 的 ${linuxKernelToInstallVersion} Kernel " + exit 255 + fi + + removeCentosKernelMulti + echo + green " ==================================================" + green " 开始安装 linux 内核版本: ${linuxKernelToInstallVersionFull}" + echo + rpm -ivh --force --nodeps ${altarch_kernel_name}-core-${altarch_kernel_version}* + rpm -ivh --force --nodeps ${altarch_kernel_name}-* + # yum install -y kernel-* + + + elif [ "${linuxKernelByUser}" = "cx9208" ]; then + + linuxKernelToInstallVersionFull="4.14.129-bbrplus" + + if [ "${osReleaseVersionNoShort}" -eq 7 ]; then + mkdir -p ${userHomePath}/${linuxKernelToInstallVersionFull} + cd ${userHomePath}/${linuxKernelToInstallVersionFull} + + # https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/bbrplus/centos/7/kernel-4.14.129-bbrplus.rpm + # https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/bbrplus/centos/7/kernel-headers-4.14.129-bbrplus.rpm + + bbrplusDownloadUrl="https://raw.githubusercontent.com/cx9208/Linux-NetSpeed/master/bbrplus/centos/7" + + downloadFile ${bbrplusDownloadUrl}/kernel-${linuxKernelToInstallVersionFull}.rpm + downloadFile ${bbrplusDownloadUrl}/kernel-headers-${linuxKernelToInstallVersionFull}.rpm + + removeCentosKernelMulti + echo + green " ==================================================" + green " 开始安装 linux 内核版本: ${linuxKernelToInstallVersionFull}" + echo + rpm -ivh --force --nodeps kernel-${linuxKernelToInstallVersionFull}.rpm + rpm -ivh --force --nodeps kernel-headers-${linuxKernelToInstallVersionFull}.rpm + else + red "从 cx9208 的 github 网站没有找到 Centos 8 的 ${linuxKernelToInstallVersion} Kernel " + exit 255 + fi + + elif [ "${linuxKernelByUser}" = "UJX6N" ]; then + + linuxKernelToInstallVersionFull="${bbrplusKernelVersion}-bbrplus" + + mkdir -p ${userHomePath}/${linuxKernelToInstallVersionFull} + cd ${userHomePath}/${linuxKernelToInstallVersionFull} + + + if [ "${linuxKernelToInstallVersion}" = "6.7" ]; then + bbrplusDownloadUrl="https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/${linuxKernelToInstallVersionFull}" + + elif [ "${linuxKernelToInstallVersion}" = "4.14" ]; then + bbrplusDownloadUrl="https://github.com/UJX6N/bbrplus/releases/download/${linuxKernelToInstallVersionFull}" + + else + bbrplusDownloadUrl="https://github.com/UJX6N/bbrplus-${linuxKernelToInstallVersion}/releases/download/${linuxKernelToInstallVersionFull}" + fi + + + + if [ "${osReleaseVersionNoShort}" -eq 7 ]; then + + # https://github.com/UJX6N/bbrplus-5.14/releases/download/5.14.15-bbrplus/CentOS-7_Required_kernel-bbrplus-5.14.15-1.bbrplus.el7.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.15/releases/download/5.15.86-bbrplus/CentOS-7_Required_kernel-5.15.86-bbrplus.el7.x86_64.rpm + + # https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/6.7.4-bbrplus/CentOS-7_Required_kernel-6.7.4-bbrplus.el7.x86_64.rpm + # https://github.com/UJX6N/bbrplus-6.1/releases/download/6.1.28-bbrplus/CentOS-7_Required_kernel-6.1.28-bbrplus.el7.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.10/releases/download/5.10.76-bbrplus/CentOS-7_Required_kernel-bbrplus-5.10.76-1.bbrplus.el7.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.10/releases/download/5.10.27-bbrplus/CentOS-7_Optional_kernel-bbrplus-devel-5.10.27-1.bbrplus.el7.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.10/releases/download/5.10.27-bbrplus/CentOS-7_Optional_kernel-bbrplus-headers-5.10.27-1.bbrplus.el7.x86_64.rpm + + if [[ "${linuxKernelToInstallVersion}" == "5.10" || "${linuxKernelToInstallVersion}" == "5.15" || "${linuxKernelToInstallVersion}" == "6.1" || "${linuxKernelToInstallVersion}" == "6.6" || "${linuxKernelToInstallVersion}" == "6.7" ]]; then + # https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/6.7.4-bbrplus/CentOS-7_Required_kernel-6.7.4-bbrplus.el7.x86_64.rpm + # https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/6.7.4-bbrplus/CentOS-7_Optional_kernel-headers-6.7.4-bbrplus.el7.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.10/releases/download/5.10.16-bbrplus/CentOS-7_Required_kernel-5.10.162-bbrplus.el7.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.10/releases/download/5.10.162-bbrplus/CentOS-7_Optional_kernel-headers-5.10.162-bbrplus.el7.x86_64.rpm + + downloadFile ${bbrplusDownloadUrl}/CentOS-7_Required_kernel-${bbrplusKernelVersion}-bbrplus.el7.x86_64.rpm + downloadFile ${bbrplusDownloadUrl}/CentOS-7_Optional_kernel-headers-${bbrplusKernelVersion}-bbrplus.el7.x86_64.rpm + else + # https://github.com/UJX6N/bbrplus-4.9/releases/download/4.9.337-bbrplus/CentOS-7_Optional_kernel-bbrplus-devel-4.9.337-1.bbrplus.el7.x86_64.rpm + + downloadFile ${bbrplusDownloadUrl}/CentOS-7_Required_kernel-bbrplus-${bbrplusKernelVersion}-1.bbrplus.el7.x86_64.rpm + downloadFile ${bbrplusDownloadUrl}/CentOS-7_Optional_kernel-bbrplus-devel-${bbrplusKernelVersion}-1.bbrplus.el7.x86_64.rpm + downloadFile ${bbrplusDownloadUrl}/CentOS-7_Optional_kernel-bbrplus-headers-${bbrplusKernelVersion}-1.bbrplus.el7.x86_64.rpm + fi + + + + + removeCentosKernelMulti + echo + green " ==================================================" + green " 开始安装 linux 内核版本: ${linuxKernelToInstallVersionFull}" + echo + rpm -ivh --force --nodeps CentOS-7_Required_kernel-bbrplus-${bbrplusKernelVersion}-1.bbrplus.el7.x86_64.rpm + rpm -ivh --force --nodeps *.rpm + else + + if [[ "${kernelVersionFirstletter}" == "5" || "${kernelVersionFirstletter}" == "6" ]]; then + echo + else + red "从 UJX6N 的 github 网站没有找到 Centos 8 的 ${linuxKernelToInstallVersion} Kernel " + exit 255 + fi + + # https://github.com/UJX6N/bbrplus-5.14/releases/download/5.14.18-bbrplus/CentOS-8_Required_kernel-bbrplus-core-5.14.18-1.bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.14/releases/download/5.14.18-bbrplus/CentOS-8_Required_kernel-bbrplus-modules-5.14.18-1.bbrplus.el8.x86_64.rpm + + + # https://github.com/UJX6N/bbrplus-5.14/releases/download/5.14.18-bbrplus/CentOS-8_Optional_kernel-bbrplus-5.14.18-1.bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.14/releases/download/5.14.18-bbrplus/CentOS-8_Optional_kernel-bbrplus-devel-5.14.18-1.bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.14/releases/download/5.14.18-bbrplus/CentOS-8_Optional_kernel-bbrplus-headers-5.14.18-1.bbrplus.el8.x86_64.rpm + + # https://github.com/UJX6N/bbrplus-5.10/releases/download/5.10.27-bbrplus/CentOS-8_Optional_kernel-bbrplus-modules-5.10.27-1.bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.14/releases/download/5.14.18-bbrplus/CentOS-8_Optional_kernel-bbrplus-modules-extra-5.14.18-1.bbrplus.el8.x86_64.rpm + + + if [[ "${linuxKernelToInstallVersion}" == "5.10" || "${linuxKernelToInstallVersion}" == "5.15" || "${linuxKernelToInstallVersion}" == "6.1" || "${linuxKernelToInstallVersion}" == "6.6" || "${linuxKernelToInstallVersion}" == "6.7" ]]; then + # https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/6.7.4-bbrplus/CentOS-Stream-8_Required_kernel-6.7.4-bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/6.6.1-bbrplus/CentOS-Stream-8_Required_kernel-6.6.1-bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/6.4.3-bbrplus/CentOS-Stream-8_Required_kernel-6.4.3-bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-6.1/releases/download/6.1.28-bbrplus/CentOS-Stream-8_Required_kernel-6.1.28-bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.15/releases/download/5.15.86-bbrplus/CentOS-Stream-8_Required_kernel-5.15.86-bbrplus.el8.x86_64.rpm + # https://github.com/UJX6N/bbrplus-5.10/releases/download/5.10.162-bbrplus/CentOS-Stream-8_Optional_kernel-headers-5.10.162-bbrplus.el8.x86_64.rpm + + downloadFile ${bbrplusDownloadUrl}/CentOS-Stream-8_Required_kernel-${bbrplusKernelVersion}-bbrplus.el8.x86_64.rpm + downloadFile ${bbrplusDownloadUrl}/CentOS-Stream-8_Optional_kernel-headers-${bbrplusKernelVersion}-bbrplus.el8.x86_64.rpm + + else + # https://github.com/UJX6N/bbrplus-5.19/releases/download/5.19.17-bbrplus/CentOS-8_Required_kernel-bbrplus-core-5.19.17-1.bbrplus.el8.x86_64.rpm + + + downloadFile ${bbrplusDownloadUrl}/CentOS-8_Required_kernel-bbrplus-core-${bbrplusKernelVersion}-1.bbrplus.el8.x86_64.rpm + downloadFile ${bbrplusDownloadUrl}/CentOS-8_Required_kernel-bbrplus-modules-${bbrplusKernelVersion}-1.bbrplus.el8.x86_64.rpm + + downloadFile ${bbrplusDownloadUrl}/CentOS-8_Optional_kernel-bbrplus-${bbrplusKernelVersion}-1.bbrplus.el8.x86_64.rpm + downloadFile ${bbrplusDownloadUrl}/CentOS-8_Optional_kernel-bbrplus-devel-${bbrplusKernelVersion}-1.bbrplus.el8.x86_64.rpm + downloadFile ${bbrplusDownloadUrl}/CentOS-8_Optional_kernel-bbrplus-headers-${bbrplusKernelVersion}-1.bbrplus.el8.x86_64.rpm + # downloadFile ${bbrplusDownloadUrl}/CentOS-8_Optional_kernel-bbrplus-modules-${bbrplusKernelVersion}-1.bbrplus.el8.x86_64.rpm + downloadFile ${bbrplusDownloadUrl}/CentOS-8_Optional_kernel-bbrplus-modules-extra-${bbrplusKernelVersion}-1.bbrplus.el8.x86_64.rpm + fi + + + removeCentosKernelMulti + echo + green " ==================================================" + green " 开始安装 linux 内核版本: ${linuxKernelToInstallVersionFull}" + echo + rpm -ivh --force --nodeps CentOS-8_Required_kernel-bbrplus-core-${bbrplusKernelVersion}-1.bbrplus.el8.x86_64.rpm + rpm -ivh --force --nodeps *.rpm + + fi + + fi; + + updateGrubConfig + + green " ==================================================" + green " 安装 linux 内核 ${linuxKernelToInstallVersionFull} 成功! " + red " 请根据以下信息 检查新内核是否安装成功,无新内核不要重启! " + green " ==================================================" + echo + + showLinuxKernelInfo + removeCentosKernelMulti "kernel" + listInstalledLinuxKernel + rebootSystem +} + + + +function removeCentosKernelMulti(){ + listInstalledLinuxKernel + + if [ -z $1 ]; then + red " 开始准备删除 kernel-header kernel-devel kernel-tools kernel-tools-libs 内核, 建议删除 " + else + red " 开始准备删除 kernel 内核, 建议删除 " + fi + + red " 注意: 删除内核有风险, 可能会导致VPS无法启动, 请先做好备份! " + read -p "是否删除内核? 直接回车默认删除内核, 请输入[Y/n]:" isContinueDelKernelInput + isContinueDelKernelInput=${isContinueDelKernelInput:-Y} + + echo + + if [[ $isContinueDelKernelInput == [Yy] ]]; then + + if [ -z $1 ]; then + removeCentosKernel "kernel-devel" + removeCentosKernel "kernel-header" + removeCentosKernel "kernel-tools" + + removeCentosKernel "kernel-ml-devel" + removeCentosKernel "kernel-ml-header" + removeCentosKernel "kernel-ml-tools" + + removeCentosKernel "kernel-lt-devel" + removeCentosKernel "kernel-lt-header" + removeCentosKernel "kernel-lt-tools" + + removeCentosKernel "kernel-bbrplus-devel" + removeCentosKernel "kernel-bbrplus-headers" + removeCentosKernel "kernel-bbrplus-modules" + else + removeCentosKernel "kernel" + fi + fi + echo +} + +function removeCentosKernel(){ + + # 嗯嗯,用的yum localinstall kernel-ml-* 后,再指定顺序, 用那个 rpm -ivh 包名不行,提示kernel-headers冲突, + # 输入rpm -e --nodeps kernel-headers 提示无法加载到此包, + + # 此时需要指定已安装的完整的 rpm 包名。 + # rpm -qa | grep kernel + # 可以查看。比如:kernel-ml-headers-5.10.16-1.el7.elrepo.x86_64 + # 那么强制删除,则命令为:rpm -e --nodeps kernel-ml-headers-5.10.16-1.el7.elrepo.x86_64 + + # ${sudoCmd} yum remove kernel-ml kernel-ml-{devel,headers,perf} + # ${sudoCmd} rpm -e --nodeps kernel-headers + # ${sudoCmd} rpm -e --nodeps kernel-ml-headers-${elrepo_kernel_version}-1.el7.elrepo.x86_64 + + removeKernelNameText="kernel" + removeKernelNameText=$1 + grepExcludelinuxKernelVersion=$(echo ${linuxKernelToInstallVersionFull} | cut -d- -f1) + + + # echo "rpm -qa | grep ${removeKernelNameText} | grep -v ${grepExcludelinuxKernelVersion} | grep -v noarch | wc -l" + rpmOldKernelNumber=$(rpm -qa | grep "${removeKernelNameText}" | grep -v "${grepExcludelinuxKernelVersion}" | grep -v "noarch" | wc -l) + rpmOLdKernelNameList=$(rpm -qa | grep "${removeKernelNameText}" | grep -v "${grepExcludelinuxKernelVersion}" | grep -v "noarch") + # echo "${rpmOLdKernelNameList}" + + # https://stackoverflow.com/questions/29269259/extract-value-of-column-from-a-line-variable + + + if [ "${rpmOldKernelNumber}" -gt "0" ]; then + + yellow "========== 准备开始删除旧内核 ${removeKernelNameText} ${osKernelVersionBackup}, 当前要安装新内核版本为: ${grepExcludelinuxKernelVersion}" + red " 当前系统的旧内核 ${removeKernelNameText} ${osKernelVersionBackup} 有 ${rpmOldKernelNumber} 个需要删除" + echo + for((integer = 1; integer <= ${rpmOldKernelNumber}; integer++)); do + rpmOLdKernelName=$(awk "NR==${integer}" <<< "${rpmOLdKernelNameList}") + green "+++++ 开始卸载第 ${integer} 个内核: ${rpmOLdKernelName}. 命令: rpm --nodeps -e ${rpmOLdKernelName}" + rpm --nodeps -e ${rpmOLdKernelName} + green "+++++ 已卸载第 ${integer} 个内核 ${rpmOLdKernelName} +++++" + echo + done + yellow "========== 共 ${rpmOldKernelNumber} 个旧内核 ${removeKernelNameText} ${osKernelVersionBackup} 已经卸载完成" + echo + else + red " 当前需要卸载的系统旧内核 ${removeKernelNameText} ${osKernelVersionBackup} 数量为0 !" + fi + + echo +} + + + +# 更新引导文件 grub.conf +updateGrubConfig(){ + if [[ "${osRelease}" == "centos" ]]; then + + # if [ ! -f "/boot/grub/grub.conf" ]; then + # red "File '/boot/grub/grub.conf' not found, 没找到该文件" + # else + # sed -i 's/^default=.*/default=0/g' /boot/grub/grub.conf + # grub2-set-default 0 + + # awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg + # egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \' + + # grub2-editenv list + # fi + + # https://blog.51cto.com/foxhound/2551477 + # 看看最新的 5.10.16 是否排在第一,也就是第 0 位。 如果是,执行:grub2-set-default 0, 然后再看看:grub2-editenv list + + green " ==================================================" + echo + + if [[ ${osReleaseVersionNoShort} = "6" ]]; then + red " 不支持 Centos 6" + exit 255 + else + if [ -f "/boot/grub2/grub.cfg" ]; then + grub2-mkconfig -o /boot/grub2/grub.cfg + grub2-set-default 0 + elif [ -f "/boot/efi/EFI/centos/grub.cfg" ]; then + grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg + grub2-set-default 0 + elif [ -f "/boot/efi/EFI/redhat/grub.cfg" ]; then + grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg + grub2-set-default 0 + else + red " /boot/grub2/grub.cfg 没找到该文件,请检查." + exit + fi + + echo + green " 查看当前 grub 菜单启动项列表, 确保新安装的内核 ${linuxKernelToInstallVersionFull} 是否在第一项 " + # grubby --info=ALL|awk -F= '$1=="kernel" {print i++ " : " $2}' + awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg + + echo + green " 查看当前 grub 启动顺序是否已设置为第一项 " + echo "grub2-editenv list" + grub2-editenv list + green " ==================================================" + echo + fi + + elif [[ "${osRelease}" == "debian" || "${osRelease}" == "ubuntu" ]]; then + echo + echo "/usr/sbin/update-grub" + /usr/sbin/update-grub + fi +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +function getLatestUbuntuKernelVersion(){ + ubuntuKernelLatestVersionArray=($(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/ | awk -F'\"v' '/v[4-9]\./{print $2}' | cut -d/ -f1 | grep -v - | sort -V)) + ubuntuKernelLatestVersion=${ubuntuKernelLatestVersionArray[${#ubuntuKernelLatestVersionArray[@]} - 1]} + echo + green "Ubuntu mainline 最新的Linux 内核 kernel 版本号为 ${ubuntuKernelLatestVersion}" + + for ver in "${ubuntuKernelLatestVersionArray[@]}"; do + + if [[ ${ver} == *"${linuxKernelToInstallVersion}"* ]]; then + # echo "符合所选版本的Linux 内核版本: ${ver}, 选择的版本为 ${linuxKernelToInstallVersion}" + ubuntuKernelVersion=${ver} + fi + done + + + green "即将安装的内核版本: ${ubuntuKernelVersion}" + ubuntuDownloadUrl="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${ubuntuKernelVersion}/amd64" + echo + echo "wget -qO- ${ubuntuDownloadUrl} | awk -F'>' '/-[4-9]\./{print \$7}' | cut -d'<' -f1 | grep -v lowlatency" + ubuntuKernelDownloadUrlArray=($(wget -qO- ${ubuntuDownloadUrl} | awk -F'>' '/-[4-9]\./{print $7}' | cut -d'<' -f1 | grep -v lowlatency )) + + # echo "${ubuntuKernelDownloadUrlArray[*]}" + echo +} + +function installDebianUbuntuKernel(){ + + ${sudoCmd} apt-get clean + ${sudoCmd} apt-get update + ${sudoCmd} apt-get install -y dpkg + + # https://kernel.ubuntu.com/~kernel-ppa/mainline/ + + # https://unix.stackexchange.com/questions/545601/how-to-upgrade-the-debian-10-kernel-from-backports-without-recompiling-it-from-s + + # https://askubuntu.com/questions/119080/how-to-update-kernel-to-the-latest-mainline-version-without-any-distro-upgrade + + # https://sypalo.com/how-to-upgrade-ubuntu + + if [ "${isInstallFromRepo}" = "yes" ]; then + + if [ "${linuxKernelToBBRType}" = "xanmod" ]; then + + green " ==================================================" + green " 开始准备从 XanMod 官方源安装 linux 内核 ${linuxKernelToInstallVersion}" + green " ==================================================" + + # https://xanmod.org/ + + + # echo 'deb http://deb.xanmod.org releases main' > /etc/apt/sources.list.d/xanmod-kernel.list + # wget -qO - https://dl.xanmod.org/gpg.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/xanmod-kernel.gpg add - + + wget -qO - https://dl.xanmod.org/archive.key | sudo gpg --dearmor -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' | sudo tee /etc/apt/sources.list.d/xanmod-release.list + + ${sudoCmd} apt update -y + + listAvailableLinuxKernel "xanmod" + + linuxKernelToInstallVersionFull=${linuxKernelToInstallVersion} + echo + green " ==================================================" + green " 开始安装 linux 内核版本: XanMod ${linuxKernelToInstallVersionFull}" + echo + + if [ "${linuxKernelToInstallVersion}" = "6.6" ]; then + ${sudoCmd} apt install -y linux-xanmod-lts-x64v3 + elif [ "${linuxKernelToInstallVersion}" = "6.11" ]; then + ${sudoCmd} apt install -y linux-xanmod-x64v3 + else + ${sudoCmd} apt install -y linux-xanmod + fi + + listInstalledLinuxKernel + rebootSystem + else + + if [ "${linuxKernelToInstallVersion}" = "5.10" ]; then + debianKernelVersion="5.10.0-0" + if [ "${osReleaseVersionNo}" = "11" ]; then + debianKernelVersion="5.10.0-16" + fi + # linux-image-5.10.0-0.bpo.15-amd64 + elif [ "${linuxKernelToInstallVersion}" = "5.19" ]; then + debianKernelVersion="5.16.0-0" + if [ "${osReleaseVersionNo}" = "11" ]; then + debianKernelVersion="5.19.0-0" + fi + + elif [ "${linuxKernelToInstallVersion}" = "4.19" ]; then + debianKernelVersion="4.19.0-21" + + elif [ "${linuxKernelToInstallVersion}" = "6.1" ]; then + debianKernelVersion="6.1.0-0" + if [ "${osReleaseVersionNo}" = "11" ]; then + debianKernelVersion="6.1.0-20" + fi + if [ "${osReleaseVersionNo}" = "12" ]; then + debianKernelVersion="6.1.0-25" + fi + else + debianKernelVersion="6.6.0-0" + if [ "${osReleaseVersionNo}" = "11" ]; then + debianKernelVersion="6.6.0-0" + fi + if [ "${osReleaseVersionNo}" = "12" ]; then + debianKernelVersion="6.6.0-0" + fi + fi + + + + green " ==================================================" + green " 开始通过 Debian 官方源安装 linux 内核 ${debianKernelVersion}" + green " ==================================================" + + if [ "${osKernelVersionBackup}" = "${debianKernelVersion}" ]; then + red "当前系统内核版本已经是 ${osKernelVersionBackup} 无需安装! " + promptContinueOpeartion + fi + + linuxKernelToInstallVersionFull=${debianKernelVersion} + + echo "deb http://deb.debian.org/debian $osReleaseVersionCodeName-backports main contrib non-free" > /etc/apt/sources.list.d/$osReleaseVersionCodeName-backports.list + echo "deb-src http://deb.debian.org/debian $osReleaseVersionCodeName-backports main contrib non-free" >> /etc/apt/sources.list.d/$osReleaseVersionCodeName-backports.list + ${sudoCmd} apt update -y + + listAvailableLinuxKernel + + echo + green " apt --fix-broken install" + ${sudoCmd} apt --fix-broken install + + #green " apt install -y -t $osReleaseVersionCodeName-backports linux-image-amd64" + #${sudoCmd} apt install -y -t $osReleaseVersionCodeName-backports linux-image-amd64 + + #green " apt install -y -t $osReleaseVersionCodeName-backports firmware-linux firmware-linux-nonfree" + #${sudoCmd} apt install -y -t $osReleaseVersionCodeName-backports firmware-linux firmware-linux-nonfree + + echo + echo "dpkg --get-selections | grep linux-image-${debianKernelVersion} | awk '/linux-image-[4-9]./{print \$1}' | awk -F'linux-image-' '{print \$2}' " + #debianKernelVersionPackageName=$(dpkg --get-selections | grep "${debianKernelVersion}" | awk '/linux-image-[4-9]./{print $1}' | awk -F'linux-image-' '{print $2}') + echo "apt-cache search linux-image | grep ${debianKernelVersion} | awk '/linux-image-[4-9]\.[0-9]+\.[0-9]+/{print \$1}' | awk '/[0-9]+-amd64$/{print \$1}' | awk -F'linux-image-' '{print \$2}' | sort -V | tail -1" + debianKernelVersionPackageName=$(apt-cache search linux-image | grep "${debianKernelVersion}" | awk '/linux-image-[4-9]\.[0-9]+\.[0-9]+/{print $1}' | awk '/[0-9]+-amd64$/{print $1}' | awk -F'linux-image-' '{print $2}' | sort -V | tail -1) + + + echo + green " Debian 官方源安装 linux 内核版本: ${debianKernelVersionPackageName}" + echo + + green " 开始安装 linux-image 命令为: apt install -y linux-image-${debianKernelVersionPackageName}" + ${sudoCmd} apt install -y linux-image-${debianKernelVersionPackageName} + echo + green " 开始安装 linux-headers 命令为: apt install -y linux-headers-${debianKernelVersionPackageName}" + ${sudoCmd} apt install -y linux-headers-${debianKernelVersionPackageName} + # ${sudoCmd} apt-get -y dist-upgrade + + fi + + else + echo + green " ==================================================" + green " 开始手动安装 linux 内核 " + green " ==================================================" + echo + + mkdir -p ${userHomePath} + cd ${userHomePath} + + linuxKernelByUser="" + + if [ "${linuxKernelToBBRType}" = "bbrplus" ]; then + linuxKernelByUser="UJX6N" + if [ "${linuxKernelToInstallVersion}" = "4.14.129" ]; then + linuxKernelByUser="cx9208" + fi + green " 准备从 ${linuxKernelByUser} github 网站下载 bbr plus 的linux内核并安装 " + else + green " 准备从 Ubuntu kernel-ppa mainline 网站下载linux内核并安装 " + fi + echo + + if [[ "${osRelease}" == "ubuntu" && ${osReleaseVersionNo} == "16.04" ]]; then + + if [ -f "${userHomePath}/libssl1.1_1.1.0g-2ubuntu4_amd64.deb" ]; then + green "文件已存在, 不需要下载, 文件原下载地址: http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb " + else + green "文件下载中... 下载地址: http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb " + wget -P ${userHomePath} http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb + fi + + ${sudoCmd} dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb + fi + + if [[ "${linuxKernelToInstallVersion}" == "5.19" || "${linuxKernelToInstallVersion}" == "5.10.118" || "${linuxKernelToInstallVersion}" == "5.15" ]]; then + if [ -f "${userHomePath}/libssl3_3.0.2-0ubuntu1_amd64.deb" ]; then + green "文件已存在, 不需要下载, 文件原下载地址: http://mirrors.kernel.org/ubuntu/pool/main/o/openssl/libssl3_3.0.2-0ubuntu1_amd64.deb " + else + green "文件下载中... 下载地址: http://mirrors.kernel.org/ubuntu/pool/main/o/openssl/libssl3_3.0.2-0ubuntu1_amd64.deb " + wget -P ${userHomePath} http://mirrors.kernel.org/ubuntu/pool/main/o/openssl/libssl3_3.0.2-0ubuntu1_amd64.deb + fi + + if [ -f "${userHomePath}/libc6_2.35-0ubuntu3_amd64.deb" ]; then + green "文件已存在, 不需要下载, 文件原下载地址: http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/libc6_2.35-0ubuntu3_amd64.deb " + else + green "文件下载中... 下载地址: http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/libc6_2.35-0ubuntu3_amd64.deb " + wget -P ${userHomePath} http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/libc6_2.35-0ubuntu3_amd64.deb + fi + + if [ -f "${userHomePath}/locales_2.35-0ubuntu3_all.deb" ]; then + green "文件已存在, 不需要下载, 文件原下载地址: http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/locales_2.35-0ubuntu3_all.deb " + else + green "文件下载中... 下载地址: http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/locales_2.35-0ubuntu3_all.deb " + wget -P ${userHomePath} http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/locales_2.35-0ubuntu3_all.deb + fi + + if [ -f "${userHomePath}/libc-bin_2.35-0ubuntu3_amd64.deb" ]; then + green "文件已存在, 不需要下载, 文件原下载地址: http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/libc-bin_2.35-0ubuntu3_amd64.deb " + else + green "文件下载中... 下载地址: http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/libc-bin_2.35-0ubuntu3_amd64.deb " + wget -P ${userHomePath} http://mirrors.kernel.org/ubuntu/pool/main/g/glibc/libc-bin_2.35-0ubuntu3_amd64.deb + fi + + ${sudoCmd} dpkg -i locales_2.35-0ubuntu3_all.deb + ${sudoCmd} dpkg -i libc-bin_2.35-0ubuntu3_amd64.deb + ${sudoCmd} dpkg -i libssl3_3.0.2-0ubuntu1_amd64.deb + ${sudoCmd} dpkg -i libc6_2.35-0ubuntu3_amd64.deb + + fi + + + + if [ "${linuxKernelByUser}" = "" ]; then + + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.11.12/amd64/ + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.11.12/amd64/linux-image-unsigned-5.11.12-051112-generic_5.11.12-051112.202104071432_amd64.deb + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.11.12/amd64/linux-modules-5.11.12-051112-generic_5.11.12-051112.202104071432_amd64.deb + + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/ + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/amd64/linux-image-unsigned-5.19.17-051917-generic_5.19.17-051917.202210240939_amd64.deb + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/amd64/linux-headers-5.19.17-051917-generic_5.19.17-051917.202210240939_amd64.deb + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/amd64/linux-modules-5.19.17-051917-generic_5.19.17-051917.202210240939_amd64.deb + + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/arm64/linux-image-unsigned-5.19.17-051917-generic_5.19.17-051917.202210240939_arm64.deb + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/arm64/linux-headers-5.19.17-051917-generic_5.19.17-051917.202210240939_arm64.deb + # https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.19.17/arm64/linux-modules-5.19.17-051917-generic_5.19.17-051917.202210240939_arm64.deb + + + getLatestUbuntuKernelVersion + + linuxKernelToInstallVersionFull=${ubuntuKernelVersion} + + mkdir -p ${userHomePath}/${linuxKernelToInstallVersionFull} + cd ${userHomePath}/${linuxKernelToInstallVersionFull} + + + for file in "${ubuntuKernelDownloadUrlArray[@]}"; do + downloadFile ${ubuntuDownloadUrl}/${file} + done + + elif [ "${linuxKernelByUser}" = "cx9208" ]; then + + linuxKernelToInstallVersionFull="4.14.129-bbrplus" + + mkdir -p ${userHomePath}/${linuxKernelToInstallVersionFull} + cd ${userHomePath}/${linuxKernelToInstallVersionFull} + + # https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/bbrplus/debian-ubuntu/x64/linux-headers-4.14.129-bbrplus.deb + # https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/bbrplus/debian-ubuntu/x64/linux-image-4.14.129-bbrplus.deb + + # https://github.com/cx9208/Linux-NetSpeed/raw/master/bbrplus/debian-ubuntu/x64/linux-headers-4.14.129-bbrplus.deb + # https://github.com/cx9208/Linux-NetSpeed/raw/master/bbrplus/debian-ubuntu/x64/linux-image-4.14.129-bbrplus.deb + + # https://raw.githubusercontent.com/cx9208/Linux-NetSpeed/master/bbrplus/debian-ubuntu/x64/linux-headers-4.14.129-bbrplus.deb + # https://raw.githubusercontent.com/cx9208/Linux-NetSpeed/master/bbrplus/debian-ubuntu/x64/linux-image-4.14.129-bbrplus.deb + + bbrplusDownloadUrl="https://raw.githubusercontent.com/cx9208/Linux-NetSpeed/master/bbrplus/debian-ubuntu/x64" + + downloadFile ${bbrplusDownloadUrl}/linux-image-${linuxKernelToInstallVersionFull}.deb + downloadFile ${bbrplusDownloadUrl}/linux-headers-${linuxKernelToInstallVersionFull}.deb + + elif [ "${linuxKernelByUser}" = "UJX6N" ]; then + + linuxKernelToInstallVersionFull="${bbrplusKernelVersion}-bbrplus" + + mkdir -p ${userHomePath}/${linuxKernelToInstallVersionFull} + cd ${userHomePath}/${linuxKernelToInstallVersionFull} + + if [ "${linuxKernelToInstallVersion}" = "6.7" ]; then + bbrplusDownloadUrl="https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/${linuxKernelToInstallVersionFull}" + + elif [ "${linuxKernelToInstallVersion}" = "4.14" ]; then + bbrplusDownloadUrl="https://github.com/UJX6N/bbrplus/releases/download/${linuxKernelToInstallVersionFull}" + + else + bbrplusDownloadUrl="https://github.com/UJX6N/bbrplus-${linuxKernelToInstallVersion}/releases/download/${linuxKernelToInstallVersionFull}" + fi + + + # https://github.com/UJX6N/bbrplus-5.9/releases/download/5.9.16-bbrplus/Debian-Ubuntu_Required_linux-image-5.9.16-bbrplus_5.9.16-bbrplus-1_amd64.deb + # https://github.com/UJX6N/bbrplus-5.4/releases/download/5.4.228-bbrplus/Debian-Ubuntu_Required_linux-headers-5.4.228-bbrplus_5.4.228-bbrplus-1_amd64.deb + # https://github.com/UJX6N/bbrplus-5.4/releases/download/5.4.228-bbrplus/Debian-Ubuntu_Required_linux-image-5.4.228-bbrplus_5.4.228-bbrplus-1_amd64.deb + + # https://github.com/UJX6N/bbrplus-4.19/releases/download/4.19.269-bbrplus/Debian-Ubuntu_Required_linux-image-4.19.269-bbrplus_4.19.269-bbrplus-1_amd64.deb + # https://github.com/UJX6N/bbrplus/releases/download/4.14.302-bbrplus/Debian-Ubuntu_Required_linux-headers-4.14.302-bbrplus_4.14.302-bbrplus-1_amd64.deb + # https://github.com/UJX6N/bbrplus-4.9/releases/download/4.9.337-bbrplus/Debian-Ubuntu_Required_linux-image-4.9.337-bbrplus_4.9.337-bbrplus-1_amd64.deb + + + if [[ "${linuxKernelToInstallVersion}" == "5.10" || "${linuxKernelToInstallVersion}" == "5.15" || "${linuxKernelToInstallVersion}" == "6.1" || "${linuxKernelToInstallVersion}" == "6.6" || "${linuxKernelToInstallVersion}" == "6.7" ]]; then + # https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/6.4.3-bbrplus/Debian-Ubuntu_Required_linux-image-6.4.3-bbrplus_6.4.3-1_amd64.deb + # https://github.com/UJX6N/bbrplus-6.x_stable/releases/download/6.4.3-bbrplus/Debian-Ubuntu_Optional_linux-headers-6.4.3-bbrplus_6.4.3-1_amd64.deb + + # https://github.com/UJX6N/bbrplus-6.1/releases/download/6.1.38-bbrplus/Debian-Ubuntu_Required_linux-image-6.1.38-bbrplus_6.1.38-bbrplus-1_amd64.deb + + # https://github.com/UJX6N/bbrplus-5.15/releases/download/5.15.120-bbrplus/Debian-Ubuntu_Required_linux-image-5.15.120-bbrplus_5.15.120-bbrplus-1_amd64.deb + + # https://github.com/UJX6N/bbrplus-5.10/releases/download/5.10.162-bbrplus/Debian-Ubuntu_Required_linux-image-5.10.162-bbrplus_5.10.162-bbrplus-1_amd64.deb + # https://github.com/UJX6N/bbrplus-5.15/releases/download/5.15.86-bbrplus/Debian-Ubuntu_Optional_linux-headers-5.15.86-bbrplus_5.15.86-bbrplus-1_amd64.deb + + downloadFile ${bbrplusDownloadUrl}/Debian-Ubuntu_Required_linux-image-${bbrplusKernelVersion}-bbrplus_${bbrplusKernelVersion}-bbrplus-1_amd64.deb + downloadFile ${bbrplusDownloadUrl}/Debian-Ubuntu_Optional_linux-headers-${bbrplusKernelVersion}-bbrplus_${bbrplusKernelVersion}-bbrplus-1_amd64.deb + else + downloadFile ${bbrplusDownloadUrl}/Debian-Ubuntu_Required_linux-image-${bbrplusKernelVersion}-bbrplus_${bbrplusKernelVersion}-1_amd64.deb + downloadFile ${bbrplusDownloadUrl}/Debian-Ubuntu_Optional_linux-headers-${bbrplusKernelVersion}-bbrplus_${bbrplusKernelVersion}-1_amd64.deb + fi + + fi + + + removeDebianKernelMulti + echo + green " ==================================================" + green " 开始安装 linux 内核版本: ${linuxKernelToInstallVersionFull}" + echo + ${sudoCmd} dpkg -i ./*.deb + + updateGrubConfig + + fi + + echo + green " ==================================================" + green " 安装 linux 内核 ${linuxKernelToInstallVersionFull} 成功! " + red " 请根据以下信息 检查新内核是否安装成功,无新内核不要重启! " + green " ==================================================" + echo + + showLinuxKernelInfo + removeDebianKernelMulti "linux-image" + listInstalledLinuxKernel + rebootSystem + +} + + + + +function removeDebianKernelMulti(){ + listInstalledLinuxKernel + + echo + if [ -z $1 ]; then + red "===== 开始准备删除 linux-headers linux-modules 内核, 建议删除 " + else + red "===== 开始准备删除 linux-image 内核, 建议删除 " + fi + + red " 注意: 删除内核有风险, 可能会导致VPS无法启动, 请先做好备份! " + read -p "是否删除内核? 直接回车默认删除内核, 请输入[Y/n]:" isContinueDelKernelInput + isContinueDelKernelInput=${isContinueDelKernelInput:-Y} + echo + + if [[ $isContinueDelKernelInput == [Yy] ]]; then + + if [ -z $1 ]; then + removeDebianKernel "linux-modules-extra" + removeDebianKernel "linux-modules" + removeDebianKernel "linux-headers" + removeDebianKernel "linux-image" + # removeDebianKernel "linux-kbuild" + # removeDebianKernel "linux-compiler" + # removeDebianKernel "linux-libc" + else + removeDebianKernel "linux-image" + removeDebianKernel "linux-modules-extra" + removeDebianKernel "linux-modules" + removeDebianKernel "linux-headers" + # ${sudoCmd} apt -y --purge autoremove + fi + + fi + echo +} + +function removeDebianKernel(){ + + removeKernelNameText="linux-image" + removeKernelNameText=$1 + grepExcludelinuxKernelVersion=$(echo ${linuxKernelToInstallVersionFull} | cut -d- -f1) + + + # echo "dpkg --get-selections | grep ${removeKernelNameText} | grep -Ev '${grepExcludelinuxKernelVersion}|${removeKernelNameText}-amd64' | awk '{print \$1}' " + rpmOldKernelNumber=$(dpkg --get-selections | grep "${removeKernelNameText}" | grep -Ev "${grepExcludelinuxKernelVersion}|${removeKernelNameText}-amd64" | wc -l) + rpmOLdKernelNameList=$(dpkg --get-selections | grep "${removeKernelNameText}" | grep -Ev "${grepExcludelinuxKernelVersion}|${removeKernelNameText}-amd64" | awk '{print $1}' ) + # echo "$rpmOLdKernelNameList" + + # https://stackoverflow.com/questions/16212656/grep-exclude-multiple-strings + # https://stackoverflow.com/questions/29269259/extract-value-of-column-from-a-line-variable + + # https://askubuntu.com/questions/187888/what-is-the-correct-way-to-completely-remove-an-application + + if [ "${rpmOldKernelNumber}" -gt "0" ]; then + yellow "========== 准备开始删除旧内核 ${removeKernelNameText} ${osKernelVersionBackup}, 当前要安装新内核版本为: ${grepExcludelinuxKernelVersion}" + red " 当前系统的旧内核 ${removeKernelNameText} ${osKernelVersionBackup} 有 ${rpmOldKernelNumber} 个需要删除" + echo + for((integer = 1; integer <= ${rpmOldKernelNumber}; integer++)); do + rpmOLdKernelName=$(awk "NR==${integer}" <<< "${rpmOLdKernelNameList}") + green "+++++ 开始卸载第 ${integer} 个内核: ${rpmOLdKernelName}. 命令: apt remove --purge ${rpmOLdKernelName}" + ${sudoCmd} apt remove -y --purge ${rpmOLdKernelName} + ${sudoCmd} apt autoremove -y ${rpmOLdKernelName} + green "+++++ 已卸载第 ${integer} 个内核 ${rpmOLdKernelName} +++++" + echo + done + yellow "========== 共 ${rpmOldKernelNumber} 个旧内核 ${removeKernelNameText} ${osKernelVersionBackup} 已经卸载完成" + echo + else + red " 当前需要卸载的系统旧内核 ${removeKernelNameText} ${osKernelVersionBackup} 数量为0 !" + fi + + echo +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +function installWARP(){ + # wget -qN --no-check-certificate -O ./nf.sh https://raw.githubusercontent.com/jinwyp/SimpleNetflix/dev/nf.sh && chmod +x ./nf.sh + # wget -qN --no-check-certificate -O ./warp-go.sh https://raw.githubusercontent.com/fscarmen/warp/main/warp-go.sh && chmod +x ./warp-go.sh && ./warp-go.sh + # wget -qN --no-check-certificate -O ./warp-go.sh https://gitlab.com/fscarmen/warp/-/raw/main/warp-go.sh && chmod +x ./warp-go.sh && ./warp-go.sh + wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh && bash menu.sh +} + +function installWARPGO(){ + # wget -qN --no-check-certificate -O ./nf.sh https://raw.githubusercontent.com/jinwyp/SimpleNetflix/dev/nf.sh && chmod +x ./nf.sh + # wget -qN --no-check-certificate -O ./warp-go.sh https://raw.githubusercontent.com/fscarmen/warp/main/warp-go.sh && chmod +x ./warp-go.sh && ./warp-go.sh + wget -qN --no-check-certificate -O ./warp-go.sh https://gitlab.com/fscarmen/warp/-/raw/main/warp-go.sh && chmod +x ./warp-go.sh && ./warp-go.sh +} + +function vps_netflix_auto(){ + # wget -qN --no-check-certificate -O ./nf.sh https://raw.githubusercontent.com/jinwyp/SimpleNetflix/dev/nf.sh && chmod +x ./nf.sh + # bash <(curl -sSL https://raw.githubusercontent.com/fscarmen/warp_unlock/main/unlock.sh) + bash <(curl -sSL https://gitlab.com/fscarmen/warp_unlock/-/raw/main/unlock.sh) +} + +function vps_netflix_jin(){ + # wget -qN --no-check-certificate -O ./nf.sh https://raw.githubusercontent.com/jinwyp/SimpleNetflix/dev/nf.sh && chmod +x ./nf.sh + wget -qN --no-check-certificate -O ./nf.sh https://raw.githubusercontent.com/jinwyp/one_click_script/master/netflix_check.sh && chmod +x ./nf.sh && ./nf.sh +} + +function vps_netflix_jin_auto(){ + # wget -qN --no-check-certificate -O ./nf.sh https://raw.githubusercontent.com/jinwyp/SimpleNetflix/dev/nf.sh && chmod +x ./nf.sh + cd ${HOME} + wget -qN --no-check-certificate -O ./nf.sh https://raw.githubusercontent.com/jinwyp/one_click_script/master/netflix_check.sh && chmod +x ./nf.sh + + echo + green " ==================================================" + green " 通过Cron定时任务 每天自动检测Netflix是否解锁非自制剧" + green " 如果检测到Netflix没有解锁 会自动刷新 WARP IP, 默认尝试刷新20次" + green " 刷新日志 log 在 /root/warp_refresh.log" + green " Auto refresh Cloudflare WARP IP to unlock Netflix non-self produced drama" + green " ==================================================" + echo + (crontab -l ; echo "10 5 * * 0,1,2,3,4,5,6 /root/nf.sh auto >> /root/warp_refresh.log ") | sort - | uniq - | crontab - + echo + + ./nf.sh auto +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +function getGithubLatestReleaseVersion(){ + # https://github.com/p4gefau1t/trojan-go/issues/63 + wget --no-check-certificate -qO- https://api.github.com/repos/$1/tags | grep 'name' | cut -d\" -f4 | head -1 | cut -b 2- +} + + + + + + + + + +# https://unix.stackexchange.com/questions/8656/usr-bin-vs-usr-local-bin-on-linux + +versionWgcf="2.2.11" +downloadFilenameWgcf="wgcf_${versionWgcf}_linux_amd64" +configWgcfBinPath="/usr/local/bin" +configWgcfConfigFolderPath="${HOME}/wireguard" +configWgcfAccountFilePath="${configWgcfConfigFolderPath}/wgcf-account.toml" +configWgcfProfileFilePath="${configWgcfConfigFolderPath}/wgcf-profile.conf" +configWARPPortFilePath="${configWgcfConfigFolderPath}/warp-port" +configWireGuardConfigFileFolder="/etc/wireguard" +configWireGuardConfigFilePath="/etc/wireguard/wgcf.conf" +configWireGuardDNSBackupFilePath="/etc/resolv_warp_bak.conf" + + +configWarpPort="40000" + + + +function installWARPClient(){ + + # https://developers.cloudflare.com/warp-client/setting-up/linux + + echo + green " ==================================================" + green " Prepare to install Cloudflare WARP Official client " + green " Cloudflare WARP Official client only support Debian 10/11、Ubuntu 20.04/16.04、CentOS 8" + green " ==================================================" + echo + + if [[ "${osRelease}" == "debian" || "${osRelease}" == "ubuntu" ]]; then + ${sudoCmd} apt-key del 835b8acb + ${sudoCmd} apt-key del 8e5f9a5d + + ${sudoCmd} apt install -y gnupg + ${sudoCmd} apt install -y apt-transport-https + + # Add cloudflare gpg key + sudo mkdir -p --mode=0755 /usr/share/keyrings + curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null + + # Add this repo to your apt repositories + echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $osReleaseVersionCodeName main" | ${sudoCmd} tee /etc/apt/sources.list.d/cloudflared.list + + # install cloudflared + + ${sudoCmd} apt-get update + ${sudoCmd} apt install -y cloudflare-warp + ${sudoCmd} apt-get install cloudflared + + elif [[ "${osRelease}" == "centos" ]]; then + ${sudoCmd} rpm -e gpg-pubkey-835b8acb-* + ${sudoCmd} rpm -e gpg-pubkey-8e5f9a5d-* + + if [ "${osReleaseVersionNoShort}" -eq 7 ]; then + # red "Cloudflare WARP Official client is not supported on Centos 7" + + # This requires yum config-manager + ${sudoCmd} yum install yum-utils + + # Add cloudflared.repo to config-manager + ${sudoCmd} yum-config-manager --add-repo https://pkg.cloudflare.com/cloudflared-ascii.repo + + # install cloudflared + ${sudoCmd} yum install cloudflared + else + # This requires dnf config-manager + # Add cloudflared.repo to config-manager + ${sudoCmd} dnf config-manager --add-repo https://pkg.cloudflare.com/cloudflared-ascii.repo + + # install cloudflared + ${sudoCmd} dnf install cloudflared + fi + + ${sudoCmd} yum install -y cloudflare-warp + fi + + if [[ ! -f "/bin/warp-cli" ]]; then + green " ==================================================" + red " ${osInfo}${osReleaseVersionNoShort} ${osReleaseVersionCodeName} is not supported ! " + green " ==================================================" + exit + fi + + echo + echo + read -p "是否生成随机的WARP SOCKS5 端口号? 默认随机端口, 输入N为设置固定端口号40000, 请输入[Y/n]:" isWarpPortInput + isWarpPortInput=${isWarpPortInput:-y} + + if [[ $isWarpPortInput == [Nn] ]]; then + echo + else + configWarpPort="$(($RANDOM + 10000))" + fi + + mkdir -p ${configWgcfConfigFolderPath} + echo "${configWarpPort}" > "${configWARPPortFilePath}" + + ${sudoCmd} systemctl enable warp-svc + + yes | warp-cli register + echo + echo "warp-cli set-mode proxy" + warp-cli set-mode proxy + echo + echo "warp-cli --accept-tos set-proxy-port ${configWarpPort}" + warp-cli --accept-tos set-proxy-port ${configWarpPort} + echo + echo "warp-cli --accept-tos connect" + warp-cli --accept-tos connect + echo + echo "warp-cli --accept-tos enable-always-on" + warp-cli --accept-tos enable-always-on + + echo + checkWarpClientStatus + + + # (crontab -l ; echo "10 6 * * 0,1,2,3,4,5,6 warp-cli disable-always-on ") | sort - | uniq - | crontab - + # (crontab -l ; echo "11 6 * * 0,1,2,3,4,5,6 warp-cli disconnect ") | sort - | uniq - | crontab - + (crontab -l ; echo "12 6 * * 1,4 systemctl restart warp-svc ") | sort - | uniq - | crontab - + # (crontab -l ; echo "16 6 * * 0,1,2,3,4,5,6 warp-cli connect ") | sort - | uniq - | crontab - + # (crontab -l ; echo "17 6 * * 0,1,2,3,4,5,6 warp-cli enable-always-on ") | sort - | uniq - | crontab - + + + + echo + green " ================================================== " + green " Cloudflare 官方 WARP Client 安装成功 !" + green " WARP SOCKS5 端口号 ${configWarpPort} " + echo + green " WARP 停止命令: warp-cli disconnect , 停止Always-On命令: warp-cli disable-always-on " + green " WARP 启动命令: warp-cli connect , 开启Always-On命令(保持一直连接WARP): warp-cli enable-always-on " + green " WARP 查看日志: journalctl -n 100 -u warp-svc" + green " WARP 查看运行状态: warp-cli status" + green " WARP 查看连接信息: warp-cli warp-stats" + green " WARP 查看设置信息: warp-cli settings" + green " WARP 查看账户信息: warp-cli account" + echo + green " 用本脚本安装v2ray或xray 可以选择是否 解锁 Netflix 限制 和 避免弹出 Google reCAPTCHA 人机验证 !" + echo + green " 其他脚本安装的v2ray或xray 请自行替换 v2ray或xray 配置文件!" + green " ================================================== " + +} + +function installWireguard(){ + + + + if [[ -f "${configWireGuardConfigFilePath}" ]]; then + green " ==================================================" + green " 已安装过 Wireguard, 如需重装 可以选择卸载 Wireguard 后重新安装! " + green " ==================================================" + exit + fi + + + green " ==================================================" + green " 准备安装 WireGuard " + echo + red " 安装前建议用本脚本升级linux内核到5.6以上 例如5.10 LTS内核. 也可以不升级内核, 具体请看下面说明" + red " 如果是新的干净的没有换过内核的系统(例如没有安装过BBR Plus内核), 可以不用退出安装其他内核, 直接继续安装 WireGuard" + red " 如果安装过其他内核(例如安装过BBR Plus内核), 建议先安装高于5.6以上的内核, 低于5.6的内核也可以继续安装, 但有几率无法启动 WireGuard" + red " 如遇到 WireGuard 启动失败, 建议重做新系统后, 升级系统到5.10内核, 然后安装WireGuard. 或者重做新系统后不要更换其他内核, 直接安装WireGuard" + green " ==================================================" + echo + + isKernelSupportWireGuardVersion="5.6" + isKernelBuildInWireGuardModule="no" + + if versionCompareWithOp "${isKernelSupportWireGuardVersion}" "${osKernelVersionShort}" ">"; then + red " 当前系统内核为 ${osKernelVersionShort}, 低于5.6的系统内核没有内置 WireGuard Module !" + isKernelBuildInWireGuardModule="no" + else + green " 当前系统内核为 ${osKernelVersionShort}, 系统内核已内置 WireGuard Module" + isKernelBuildInWireGuardModule="yes" + fi + + + read -p "是否继续操作? 请确认linux内核已正确安装 直接回车默认继续操作, 请输入[Y/n]:" isContinueInput + isContinueInput=${isContinueInput:-Y} + + if [[ ${isContinueInput} == [Yy] ]]; then + echo + green " ==================================================" + green " 开始安装 WireGuard " + green " ==================================================" + else + green " 建议请先用本脚本安装 linux kernel 5.6 以上的内核 !" + exit + fi + + echo + echo + + if [[ "${osRelease}" == "debian" || "${osRelease}" == "ubuntu" ]]; then + ${sudoCmd} apt --fix-broken install -y + ${sudoCmd} apt-get update + ${sudoCmd} apt install -y openresolv + # ${sudoCmd} apt install -y resolvconf + ${sudoCmd} apt install -y net-tools iproute2 dnsutils + echo + if [[ ${isKernelBuildInWireGuardModule} == "yes" ]]; then + green " 当前系统内核版本高于5.6, 直接安装 wireguard-tools " + echo + ${sudoCmd} apt install -y wireguard-tools + else + # 安装 wireguard-dkms 后 ubuntu 20 系统 会同时安装 5.4.0-71 内核 + green " 当前系统内核版本低于5.6, 直接安装 wireguard wireguard" + echo + ${sudoCmd} apt install -y wireguard + # ${sudoCmd} apt install -y wireguard-tools + fi + + # if [[ ! -L "/usr/local/bin/resolvconf" ]]; then + # ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf + # fi + + ${sudoCmd} systemctl enable systemd-resolved.service + ${sudoCmd} systemctl start systemd-resolved.service + + elif [[ "${osRelease}" == "centos" ]]; then + ${sudoCmd} yum install -y epel-release elrepo-release + ${sudoCmd} yum install -y net-tools + ${sudoCmd} yum install -y iproute + + echo + if [[ ${isKernelBuildInWireGuardModule} == "yes" ]]; then + + green " 当前系统内核版本高于5.6, 直接安装 wireguard-tools " + echo + if [ "${osReleaseVersionNoShort}" -eq 7 ]; then + ${sudoCmd} yum install -y yum-plugin-elrepo + fi + + ${sudoCmd} yum install -y wireguard-tools + else + + if [ "${osReleaseVersionNoShort}" -eq 7 ]; then + if [[ ${osKernelVersionBackup} == *"3.10."* ]]; then + green " 当前系统内核版本为原版Centos 7 ${osKernelVersionBackup} , 直接安装 kmod-wireguard " + ${sudoCmd} yum install -y yum-plugin-elrepo + ${sudoCmd} yum install -y kmod-wireguard wireguard-tools + else + green " 当前系统内核版本低于5.6, 安装 wireguard-dkms " + ${sudoCmd} yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm + ${sudoCmd} curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo + ${sudoCmd} yum install -y wireguard-dkms wireguard-tools + fi + else + if [[ ${osKernelVersionBackup} == *"4.18."* ]]; then + green " 当前系统内核版本为原版Centos 8 ${osKernelVersionBackup} , 直接安装 kmod-wireguard " + ${sudoCmd} yum install -y kmod-wireguard wireguard-tools + else + green " 当前系统内核版本低于5.6, 安装 wireguard-dkms " + ${sudoCmd} yum config-manager --set-enabled PowerTools + ${sudoCmd} yum copr enable jdoss/wireguard + ${sudoCmd} yum install -y wireguard-dkms wireguard-tools + fi + + fi + fi + fi + + green " ================================================== " + green " Wireguard 安装成功 !" + green " ================================================== " + + installWGCF +} + +function installWGCF(){ + + versionWgcf=$(getGithubLatestReleaseVersion "ViRb3/wgcf") + downloadFilenameWgcf="wgcf_${versionWgcf}_linux_amd64" + + echo + green " ==================================================" + green " 开始安装 Cloudflare WARP 命令行工具 Wgcf ${versionWgcf}" + green " ==================================================" + echo + + mkdir -p ${configWgcfConfigFolderPath} + mkdir -p ${configWgcfBinPath} + mkdir -p ${configWireGuardConfigFileFolder} + + cd ${configWgcfConfigFolderPath} + + # https://github.com/ViRb3/wgcf/releases/download/v2.2.10/wgcf_2.2.10_linux_amd64 + wget -O ${configWgcfConfigFolderPath}/wgcf --no-check-certificate "https://github.com/ViRb3/wgcf/releases/download/v${versionWgcf}/${downloadFilenameWgcf}" + + + if [[ -f ${configWgcfConfigFolderPath}/wgcf ]]; then + green " Cloudflare WARP 命令行工具 Wgcf ${versionWgcf} 下载成功!" + echo + else + red " Wgcf ${versionWgcf} 下载失败!" + exit 255 + fi + + ${sudoCmd} chmod +x ${configWgcfConfigFolderPath}/wgcf + cp ${configWgcfConfigFolderPath}/wgcf ${configWgcfBinPath} + + # ${configWgcfConfigFolderPath}/wgcf register --config "${configWgcfAccountFilePath}" + + if [[ -f ${configWgcfAccountFilePath} ]]; then + echo + else + yes | ${configWgcfConfigFolderPath}/wgcf register + fi + + echo + echo + green " ==================================================" + yellow " 没有购买过WARP+ 订阅请直接按回车跳过此步, Press enter to continue without WARP+" + echo + yellow " 如已购买过 WARP+ subscription 订阅, 可以填入 license key 启用WARP+" + green " 查看方法: 手机打开 open Cloudflare 1.1.1.1 app, 点击右上菜单 click hamburger menu button on the top-right corner " + green " Navigate to: Account > Key, 选择 Account 菜单里的key 就是 license key" + echo + + read -p "请填写 license key? 直接回车默认跳过此步, 请输入:" isWARPLicenseKeyInput + isWARPLicenseKeyInput=${isWARPLicenseKeyInput:-n} + + if [[ ${isWARPLicenseKeyInput} == [Nn] ]]; then + echo + else + sed -i "s/license_key =.*/license_key = \"${isWARPLicenseKeyInput}\"/g" ${configWgcfAccountFilePath} + WGCF_LICENSE_KEY="${isWARPLicenseKeyInput}" wgcf update + fi + + if [[ -f ${configWgcfProfileFilePath} ]]; then + echo + else + yes | ${configWgcfConfigFolderPath}/wgcf generate + fi + + + cp ${configWgcfProfileFilePath} ${configWireGuardConfigFilePath} + + enableWireguardIPV6OrIPV4 + + echo + green " 开始临时启动 Wireguard, 用于测试是否启动正常, 运行命令: wg-quick up wgcf" + ${sudoCmd} wg-quick up wgcf + + echo + green " 开始验证 Wireguard 是否启动正常, 检测是否使用 Cloudflare 的 ipv6 访问 !" + echo + echo "curl -6 ip.p3terx.com" + curl -6 ip.p3terx.com + echo + isWireguardIpv6Working=$(curl -6 ip.p3terx.com | grep CLOUDFLARENET ) + echo + + if [[ -n "$isWireguardIpv6Working" ]]; then + green " Wireguard 启动正常, 已成功通过 Cloudflare WARP 提供的 IPv6 访问网络! " + else + green " ================================================== " + red " Wireguard 通过 curl -6 ip.p3terx.com, 检测使用CLOUDFLARENET的IPV6 访问失败" + red " 请检查linux 内核安装是否正确" + red " 安装会继续运行, 也有可能安装成功, 只是IPV6 没有使用" + red " 检查 WireGuard 是否启动成功, 可运行查看运行状态命令: systemctl status wg-quick@wgcf" + red " 如果 WireGuard 启动失败, 可运行查看日志命令 寻找原因: journalctl -n 50 -u wg-quick@wgcf" + red " 如遇到 WireGuard 启动失败, 建议重做新系统后, 不要更换其他内核, 直接安装WireGuard" + green " ================================================== " + fi + + echo + green " 关闭临时启动用于测试的 Wireguard, 运行命令: wg-quick down wgcf " + ${sudoCmd} wg-quick down wgcf + echo + + ${sudoCmd} systemctl daemon-reload + + # 设置开机启动 + ${sudoCmd} systemctl enable wg-quick@wgcf + + # 启用守护进程 + ${sudoCmd} systemctl start wg-quick@wgcf + + # (crontab -l ; echo "12 6 * * 1 systemctl restart wg-quick@wgcf ") | sort - | uniq - | crontab - + + checkWireguardBootStatus + + echo + green " ================================================== " + green " Wireguard 和 Cloudflare WARP 命令行工具 Wgcf ${versionWgcf} 安装成功 !" + green " Cloudflare WARP 申请的账户配置文件路径: ${configWgcfAccountFilePath} " + green " Cloudflare WARP 生成的 Wireguard 配置文件路径: ${configWireGuardConfigFilePath} " + echo + green " Wireguard 停止命令: systemctl stop wg-quick@wgcf 启动命令: systemctl start wg-quick@wgcf 重启命令: systemctl restart wg-quick@wgcf" + green " Wireguard 查看日志: journalctl -n 50 -u wg-quick@wgcf" + green " Wireguard 查看运行状态: systemctl status wg-quick@wgcf" + echo + green " 用本脚本安装v2ray或xray 可以选择是否 解锁 Netflix 限制 和 避免弹出 Google reCAPTCHA 人机验证 !" + echo + green " 其他脚本安装的v2ray或xray 请自行替换 v2ray或xray 配置文件!" + green " 可参考 如何使用 IPv6 访问 Netflix 的教程 https://ybfl.xyz/111.html 或 https://toutyrater.github.io/app/netflix.html" + green " ================================================== " + +} + + + + +function enableWireguardIPV6OrIPV4(){ + # https://p3terx.com/archives/use-cloudflare-warp-to-add-extra-ipv4-or-ipv6-network-support-to-vps-servers-for-free.html + + + ${sudoCmd} systemctl stop wg-quick@wgcf + + cp /etc/resolv.conf ${configWireGuardDNSBackupFilePath} + + sed -i '/nameserver 2a00\:1098\:2b\:\:1/d' /etc/resolv.conf + + sed -i '/nameserver 8\.8/d' /etc/resolv.conf + sed -i '/nameserver 9\.9/d' /etc/resolv.conf + sed -i '/nameserver 1\.1\.1\.1/d' /etc/resolv.conf + + echo + green " ================================================== " + yellow " 请选择为服务器添加 IPv6 网络 还是 IPv4 网络支持: " + echo + green " 1 添加 IPv6 网络 (用于解锁 Netflix 限制 和避免弹出 Google reCAPTCHA 人机验证)" + green " 2 添加 IPv4 网络 (用于给只有 IPv6 的 VPS主机添加 IPv4 网络支持)" + echo + read -p "请选择添加 IPv6 还是 IPv4 网络支持? 直接回车默认选1 , 请输入[1/2]:" isAddNetworkIPv6Input + isAddNetworkIPv6Input=${isAddNetworkIPv6Input:-1} + + if [[ ${isAddNetworkIPv6Input} == [2] ]]; then + + # 为 IPv6 Only 服务器添加 IPv4 网络支持 + + sed -i 's/^AllowedIPs = \:\:\/0/# AllowedIPs = \:\:\/0/g' ${configWireGuardConfigFilePath} + sed -i 's/# AllowedIPs = 0\.0\.0\.0/AllowedIPs = 0\.0\.0\.0/g' ${configWireGuardConfigFilePath} + + sed -i 's/engage\.cloudflareclient\.com/\[2606\:4700\:d0\:\:a29f\:c001\]/g' ${configWireGuardConfigFilePath} + sed -i 's/162\.159\.192\.1/\[2606\:4700\:d0\:\:a29f\:c001\]/g' ${configWireGuardConfigFilePath} + + sed -i 's/^DNS = 1\.1\.1\.1/DNS = 2620:fe\:\:10,2001\:4860\:4860\:\:8888,2606\:4700\:4700\:\:1111/g' ${configWireGuardConfigFilePath} + sed -i 's/^DNS = 8\.8\.8\.8,8\.8\.4\.4,1\.1\.1\.1,9\.9\.9\.10/DNS = 2620:fe\:\:10,2001\:4860\:4860\:\:8888,2606\:4700\:4700\:\:1111/g' ${configWireGuardConfigFilePath} + + echo "nameserver 2a00:1098:2b::1" >> /etc/resolv.conf + + echo + green " Wireguard 已成功切换到 对VPS服务器的 IPv4 网络支持" + + else + + # 为 IPv4 Only 服务器添加 IPv6 网络支持 + sed -i 's/^AllowedIPs = 0\.0\.0\.0/# AllowedIPs = 0\.0\.0\.0/g' ${configWireGuardConfigFilePath} + sed -i 's/# AllowedIPs = \:\:\/0/AllowedIPs = \:\:\/0/g' ${configWireGuardConfigFilePath} + + sed -i 's/engage\.cloudflareclient\.com/162\.159\.192\.1/g' ${configWireGuardConfigFilePath} + sed -i 's/\[2606\:4700\:d0\:\:a29f\:c001\]/162\.159\.192\.1/g' ${configWireGuardConfigFilePath} + + sed -i 's/^DNS = 1\.1\.1\.1/DNS = 8\.8\.8\.8,8\.8\.4\.4,1\.1\.1\.1,9\.9\.9\.10/g' ${configWireGuardConfigFilePath} + sed -i 's/^DNS = 2620:fe\:\:10,2001\:4860\:4860\:\:8888,2606\:4700\:4700\:\:1111/DNS = 8\.8\.8\.8,1\.1\.1\.1,9\.9\.9\.10/g' ${configWireGuardConfigFilePath} + + echo "nameserver 8.8.8.8" >> /etc/resolv.conf + echo "nameserver 8.8.4.4" >> /etc/resolv.conf + echo "nameserver 1.1.1.1" >> /etc/resolv.conf + #echo "nameserver 9.9.9.9" >> /etc/resolv.conf + echo "nameserver 9.9.9.10" >> /etc/resolv.conf + + echo + green " Wireguard 已成功切换到 对VPS服务器的 IPv6 网络支持" + fi + + green " ================================================== " + echo + green " Wireguard 配置信息如下 配置文件路径: ${configWireGuardConfigFilePath} " + cat ${configWireGuardConfigFilePath} + green " ================================================== " + echo + + # -n 不为空 + if [[ -n $1 ]]; then + ${sudoCmd} systemctl start wg-quick@wgcf + else + preferIPV4 + fi +} + + + + +function preferIPV4(){ + + if [[ -f "/etc/gai.conf" ]]; then + sed -i '/^precedence \:\:ffff\:0\:0/d' /etc/gai.conf + sed -i '/^label 2002\:\:\/16/d' /etc/gai.conf + fi + + # -z 为空 + if [[ -z $1 ]]; then + + echo "precedence ::ffff:0:0/96 100" >> /etc/gai.conf + + echo + green " VPS服务器已成功设置为 IPv4 优先访问网络" + + else + + green " ================================================== " + yellow " 请为服务器设置 IPv4 还是 IPv6 优先访问: " + echo + green " 1 优先 IPv4 访问网络 (用于 给只有 IPv6 的 VPS主机添加 IPv4 网络支持)" + green " 2 优先 IPv6 访问网络 (用于 解锁 Netflix 限制 和避免弹出 Google reCAPTCHA 人机验证)" + green " 3 删除 IPv4 或 IPv6 优先访问的设置, 还原为系统默认配置" + echo + red " 注意: 选2后 优先使用 IPv6 访问网络 可能造成无法访问某些不支持IPv6的网站! " + red " 注意: 解锁Netflix限制和避免弹出Google人机验证 一般不需要选择2设置IPv6优先访问, 可以在V2ray的配置中单独设置对Netfile和Google使用IPv6访问 " + red " 注意: 由于 trojan 或 trojan-go 不支持配置 使用IPv6优先访问Netfile和Google, 可以选择2 开启服务器优先IPv6访问, 解决 trojan-go 解锁Netfile和Google人机验证问题" + echo + read -p "请选择 IPv4 还是 IPv6 优先访问? 直接回车默认选1, 请输入[1/2/3]:" isPreferIPv4Input + isPreferIPv4Input=${isPreferIPv4Input:-1} + + if [[ ${isPreferIPv4Input} == [2] ]]; then + + # 设置 IPv6 优先 + echo "label 2002::/16 2" >> /etc/gai.conf + + echo + green " VPS服务器已成功设置为 IPv6 优先访问网络 " + elif [[ ${isPreferIPv4Input} == [3] ]]; then + + echo + green " VPS服务器 已删除 IPv4 或 IPv6 优先访问的设置, 还原为系统默认配置 " + else + # 设置 IPv4 优先 + echo "precedence ::ffff:0:0/96 100" >> /etc/gai.conf + + echo + green " VPS服务器已成功设置为 IPv4 优先访问网络 " + fi + + green " ================================================== " + echo + yellow " 验证 IPv4 或 IPv6 访问网络优先级测试, 命令: curl ip.p3terx.com " + echo + curl ip.p3terx.com + echo + green " 上面信息显示 如果是IPv4地址 则VPS服务器已设置为 IPv4优先访问. 如果是IPv6地址则已设置为 IPv6优先访问 " + green " ================================================== " + + fi + echo + +} + +function removeWireguard(){ + green " ================================================== " + red " 准备卸载 Wireguard 和 Cloudflare WARP 命令行工具 Wgcf " + green " ================================================== " + + if [[ -f "${configWgcfBinPath}/wgcf" || -f "${configWgcfConfigFolderPath}/wgcf" || -f "/wgcf" ]]; then + ${sudoCmd} systemctl stop wg-quick@wgcf.service + ${sudoCmd} systemctl disable wg-quick@wgcf.service + + ${sudoCmd} wg-quick down wgcf + ${sudoCmd} wg-quick disable wgcf + + + if [[ "${osRelease}" == "debian" || "${osRelease}" == "ubuntu" ]]; then + + $osSystemPackage -y remove wireguard-tools + $osSystemPackage -y remove wireguard + + elif [[ "${osRelease}" == "centos" ]]; then + $osSystemPackage -y remove kmod-wireguard + $osSystemPackage -y remove wireguard-dkms + $osSystemPackage -y remove wireguard-tools + fi + + echo + read -p "是否删除Wgcf申请的账号文件, 默认不删除, 方便以后不用在重新注册, 请输入[y/N]:" isWgcfAccountFileRemoveInput + isWgcfAccountFileRemoveInput=${isWgcfAccountFileRemoveInput:-n} + + echo + if [[ $isWgcfAccountFileRemoveInput == [Yy] ]]; then + rm -rf "${configWgcfConfigFolderPath}" + green " Wgcf申请的账号信息文件 ${configWgcfAccountFilePath} 已删除!" + + else + rm -f "${configWgcfProfileFilePath}" + green " Wgcf申请的账号信息文件 ${configWgcfAccountFilePath} 已保留! " + fi + + + rm -f ${configWgcfBinPath}/wgcf + rm -rf ${configWireGuardConfigFileFolder} + rm -f ${osSystemMdPath}wg-quick@wgcf.service + + rm -f /usr/bin/wg + rm -f /usr/bin/wg-quick + rm -f /usr/share/man/man8/wg.8 + rm -f /usr/share/man/man8/wg-quick.8 + + [ -d "/etc/wireguard" ] && ("rm -rf /etc/wireguard") + + + sleep 2 + modprobe -r wireguard + + cp -f ${configWireGuardDNSBackupFilePath} /etc/resolv.conf + + green " ================================================== " + green " Wireguard 和 Cloudflare WARP 命令行工具 Wgcf 卸载完毕 !" + green " ================================================== " + + else + red " 系统没有安装 Wireguard 和 Wgcf, 退出卸载" + echo + fi + + + +} + +function removeWARP(){ + green " ================================================== " + red " 准备卸载 Cloudflare WARP 官方 linux client " + green " ================================================== " + + if [[ -f "/usr/bin/warp-cli" ]]; then + ${sudoCmd} warp-cli disable-always-on + ${sudoCmd} warp-cli disconnect + ${sudoCmd} systemctl stop warp-svc + sleep 5s + + if [[ "${osRelease}" == "debian" || "${osRelease}" == "ubuntu" ]]; then + + ${sudoCmd} apt purge -y cloudflare-warp + rm -f /etc/apt/sources.list.d/cloudflare-client.list + + elif [[ "${osRelease}" == "centos" ]]; then + yum remove -y cloudflare-warp + fi + + rm -f ${configWARPPortFilePath} + + crontab -l | grep -v 'warp-cli' | crontab - + crontab -l | grep -v 'warp-svc' | crontab - + + green " ================================================== " + green " Cloudflare WARP linux client 卸载完毕 !" + green " ================================================== " + else + red " 系统没有安装 Cloudflare WARP linux client, 退出卸载" + echo + fi + +} + +function checkWireguardBootStatus(){ + echo + green " ================================================== " + isWireguardBootSuccess=$(systemctl status wg-quick@wgcf | grep -E "Active: active") + if [[ -z "${isWireguardBootSuccess}" ]]; then + green " 状态显示-- Wireguard 已启动${Red_font_prefix}失败${Green_font_prefix}! 请查看 Wireguard 运行日志, 寻找错误后重启 Wireguard " + else + green " 状态显示-- Wireguard 已启动成功! " + echo + echo "wgcf trace" + echo + wgcf trace + echo + fi + green " ================================================== " + echo +} + +cloudflare_Trace_URL='https://www.cloudflare.com/cdn-cgi/trace' +function checkWarpClientStatus(){ + + if [[ -f "${configWARPPortFilePath}" ]]; then + configWarpPort=$(cat ${configWARPPortFilePath}) + fi + + echo + green " ================================================== " + sleep 2s + isWarpClientBootSuccess=$(systemctl is-active warp-svc | grep -E "inactive") + if [[ -z "${isWarpClientBootSuccess}" ]]; then + green " 状态显示-- WARP 已启动成功! " + echo + + isWarpClientMode=$(curl -sx "socks5h://127.0.0.1:${configWarpPort}" ${cloudflare_Trace_URL} --connect-timeout 20 | grep warp | cut -d= -f2) + sleep 3s + case ${isWarpClientMode} in + on) + green " 状态显示-- WARP SOCKS5 代理已启动成功, 端口号 ${configWarpPort} ! " + ;; + plus) + green " 状态显示-- WARP+ SOCKS5 代理已启动成功, 端口号 ${configWarpPort} ! " + ;; + *) + green " 状态显示-- WARP SOCKS5 代理启动${Red_font_prefix}失败${Green_font_prefix}! " + ;; + esac + + green " ================================================== " + echo + echo "curl -x 'socks5h://127.0.0.1:${configWarpPort}' ${cloudflare_Trace_URL}" + echo + curl -x "socks5h://127.0.0.1:${configWarpPort}" ${cloudflare_Trace_URL} + else + green " 状态显示-- WARP 已启动${Red_font_prefix}失败${Green_font_prefix}! 请查看 WARP 运行日志, 寻找错误后重启 WARP " + fi + green " ================================================== " + echo +} + + +function restartWireguard(){ + echo + echo "systemctl restart wg-quick@wgcf" + systemctl restart wg-quick@wgcf + green " Wireguard 已重启 !" + echo +} +function startWARP(){ + echo + echo "systemctl start warp-svc" + systemctl start warp-svc + echo + echo "warp-cli connect" + warp-cli connect + echo + echo "warp-cli enable-always-on" + warp-cli enable-always-on + green " WARP SOCKS5 代理 已启动 !" +} +function stopWARP(){ + echo + echo "warp-cli disable-always-on" + warp-cli disable-always-on + echo + echo "warp-cli disconnect" + warp-cli disconnect + echo + echo "systemctl stop warp-svc" + systemctl stop warp-svc + green " WARP SOCKS5 代理 已停止 !" +} +function restartWARP(){ + echo + echo "warp-cli disable-always-on" + warp-cli disable-always-on + echo + echo "warp-cli disconnect" + warp-cli disconnect + echo + echo "systemctl restart warp-svc" + systemctl restart warp-svc + sleep 5s + echo + read -p "Press enter to continue" + echo + echo "warp-cli connect" + warp-cli connect + echo + echo "warp-cli enable-always-on" + warp-cli enable-always-on + echo + green " WARP SOCKS5 代理 已重启 !" + echo +} + +function checkWireguard(){ + echo + green " ==================================================" + echo + green " 1. 查看当前系统内核版本, 检查是否因为装了多个版本内核导致 Wireguard 启动失败" + echo + green " 2. 查看 Wireguard 和 WARP SOCKS5 代理运行状态" + echo + green " 3. 查看 Wireguard 运行日志, 如果 Wireguard 启动失败 请用此项查找问题" + green " 4. 启动 Wireguard " + green " 5. 停止 Wireguard " + green " 6. 重启 Wireguard " + green " 7. 查看 Wireguard 和 WARP 运行状态 wgcf status " + green " 8. 查看 Wireguard 配置文件 ${configWireGuardConfigFilePath} " + green " 9. 用VI 编辑 Wireguard 配置文件 ${configWireGuardConfigFilePath} " + echo + green " 11. 查看 WARP SOCKS5 运行日志, 如果 WARP 启动失败 请用此项查找问题" + green " 12. 启动 WARP SOCKS5 代理" + green " 13. 停止 WARP SOCKS5 代理" + green " 14. 重启 WARP SOCKS5 代理" + echo + green " 15. 查看 WARP SOCKS5 运行状态 warp-cli status" + green " 16. 查看 WARP SOCKS5 连接信息 warp-cli warp-stats" + green " 17. 查看 WARP SOCKS5 设置信息 warp-cli settings" + green " 18. 查看 WARP SOCKS5 账户信息 warp-cli account" + + green " ==================================================" + green " 0. 退出脚本" + echo + read -p "请输入数字:" menuNumberInput + case "$menuNumberInput" in + 1 ) + showLinuxKernelInfo + listInstalledLinuxKernel + ;; + 2 ) + echo + #echo "systemctl status wg-quick@wgcf" + #systemctl status wg-quick@wgcf + #red " 请查看上面 Active: 一行信息, 如果文字是绿色 active 则为启动正常, 否则启动失败" + checkWireguardBootStatus + checkWarpClientStatus + ;; + 3 ) + echo + echo "journalctl -n 100 -u wg-quick@wgcf" + journalctl -n 100 -u wg-quick@wgcf + red " 请查看上面包含 Error 的信息行, 查找启动失败的原因 " + ;; + 4 ) + echo + echo "systemctl start wg-quick@wgcf" + systemctl start wg-quick@wgcf + echo + green " Wireguard 已启动 !" + checkWireguardBootStatus + ;; + 5 ) + echo + echo "systemctl stop wg-quick@wgcf" + systemctl stop wg-quick@wgcf + echo + green " Wireguard 已停止 !" + checkWireguardBootStatus + ;; + 6 ) + restartWireguard + checkWireguardBootStatus + ;; + 7 ) + echo + green "Running command 'wgcf status' to check device status :" + echo + wgcf status + echo + echo + green "Running command 'wgcf trace' to verify WARP/WARP+ works :" + echo + wgcf trace + echo + ;; + 8 ) + echo + echo "cat ${configWireGuardConfigFilePath}" + cat ${configWireGuardConfigFilePath} + ;; + 9 ) + echo + echo "vi ${configWireGuardConfigFilePath}" + vi ${configWireGuardConfigFilePath} + ;; + 11 ) + echo + echo "journalctl --no-pager -u warp-svc " + journalctl --no-pager -u warp-svc + red " 请查看上面包含 Error 的信息行, 查找启动失败的原因 " + ;; + 12 ) + startWARP + checkWarpClientStatus + ;; + 13 ) + stopWARP + checkWarpClientStatus + ;; + 14 ) + restartWARP + checkWarpClientStatus + ;; + 15 ) + echo + echo "warp-cli status" + warp-cli status + ;; + 16 ) + echo + echo "warp-cli warp-stats" + warp-cli warp-stats + ;; + 17 ) + echo + echo "warp-cli settings" + warp-cli settings + ;; + 18 ) + echo + echo "warp-cli account" + warp-cli account + ;; + 0 ) + exit 1 + ;; + * ) + clear + red "请输入正确数字 !" + sleep 2s + checkWireguard + ;; + esac + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +function start_menu(){ + clear + + if [[ $1 == "first" ]] ; then + getLinuxOSRelease + installSoftDownload + fi + showLinuxKernelInfoNoDisplay + + if [[ ${configLanguage} == "cn" ]] ; then + green " ==================================================" + green " Linux 内核 一键安装脚本 | 2024-09-25 | 系统支持:centos7+ / debian10+ / ubuntu16.04+" + green " Linux 内核 4.9 以上都支持开启BBR, 如要开启BBR Plus 则需要安装支持BBR Plus的内核 " + red " 在任何生产环境中请谨慎使用此脚本, 升级内核有风险, 请做好备份!在某些VPS会导致无法启动! " + green " ==================================================" + if [[ -z ${osKernelBBRStatus} ]]; then + echo -e " 当前系统内核: ${osKernelVersionBackup} (${virtual}) ${Red_font_prefix}未安装 BBR 或 BBR Plus ${Font_color_suffix} 加速内核, 请先安装4.9以上内核 " + else + if [ ${systemBBRRunningStatus} = "no" ]; then + echo -e " 当前系统内核: ${osKernelVersionBackup} (${virtual}) ${Green_font_prefix}已安装 ${osKernelBBRStatus}${Font_color_suffix} 加速内核, ${Red_font_prefix}${systemBBRRunningStatusText}${Font_color_suffix} " + else + echo -e " 当前系统内核: ${osKernelVersionBackup} (${virtual}) ${Green_font_prefix}已安装 ${osKernelBBRStatus}${Font_color_suffix} 加速内核, ${Green_font_prefix}${systemBBRRunningStatusText}${Font_color_suffix} " + fi + fi + echo -e " 当前拥塞控制算法: ${Green_font_prefix}${net_congestion_control}${Font_color_suffix} ECN: ${Green_font_prefix}${systemECNStatusText}${Font_color_suffix} 当前队列算法: ${Green_font_prefix}${net_qdisc}${Font_color_suffix} " + + echo + green " 1. 查看当前系统内核版本, 检查是否支持BBR / BBR2 / BBR Plus" + green " 2. 开启 BBR 或 BBR2 加速, 开启 BBR2 需要安装 XanMod 内核" + green " 3. 开启 BBR Plus 加速" + green " 4. 优化 系统网络配置" + red " 5. 删除 系统网络优化配置" + echo + green " 6. 查看 Wireguard 运行状态" + green " 7. 重启 Wireguard " + green " 8. 查看 WARP SOCKS5 代理运行状态" + green " 9. 重启 WARP SOCKS5" + green " 10. 查看 WireGuard 和 WARP SOCKS5 运行状态, 错误日志, 如果WireGuard启动失败 请选该项排查错误" + echo + green " 11. 安装官方 Cloudflare WARP Client 启动SOCKS5代理, 用于解锁 Netflix 限制" + green " 12. 安装 WireGuard 和 Cloudflare WARP 工具 Wgcf, 启动 IPv4或IPv6, 用于避免弹出Google人机验证" + green " 13. 同时安装 官方 Cloudflare WARP Client, WireGuard 和 命令行工具 Wgcf, 不推荐 " + red " 14. 卸载 WireGuard 和 Cloudflare WARP linux client" + green " 15. 切换 WireGuard 对VPS服务器的 IPv6 和 IPv4 的网络支持" + green " 16. 设置 VPS 服务器 IPv4 还是 IPv6 网络优先访问" + + green " 21. 安装 warp 脚本 by fscarmen" + green " 22. 安装 warp-go 脚本 by fscarmen" + green " 23. 自动刷新WARP IP 直到支持 Netflix 非自制剧解锁 " + # green " 22. 测试 VPS 是否支持 Netflix 非自制剧解锁 支持 WARP SOCKS5 测试 强烈推荐使用 " + + echo + + if [[ "${osRelease}" == "centos" ]]; then + green " 31. 安装 最新版本内核 6.1, 通过elrepo源安装" + green " 32. 安装 LTS内核 5.4 LTS, 通过elrepo源安装" + green " 33. 安装 内核 4.14 LTS, 从 altarch网站 下载安装" + green " 34. 安装 内核 4.19 LTS, 从 altarch网站 下载安装" + green " 35. 安装 内核 5.4 LTS, 从 elrepo网站 下载安装" + echo + green " 36. 安装 内核 5.10 LTS, Teddysun 编译 推荐安装" + green " 37. 安装 内核 5.15 LTS, Teddysun 编译 推荐安装" + green " 38. 安装 内核 6.1 LTS, Teddysun 编译 下载安装. " + green " 39. 安装 内核 6.6 LTS, Teddysun 编译 下载安装. " + green " 40. 安装 内核 6.11 , elrepo 官方编译. " + + else + if [[ "${osRelease}" == "debian" ]]; then + + if [[ "${osReleaseVersion}" == "10" ]]; then + green " 41. 安装 LTS内核 5.10 LTS, 通过 Debian 官方源安装" + fi + if [[ "${osReleaseVersion}" == "11" ]]; then + green " 41. 安装 LTS内核 5.10 LTS, 通过 Debian 官方源安装" + green " 42. 安装 内核 5.19, 通过 Debian 官方源安装" + green " 43. 安装 最新版本内核 6.1 或更高, 通过 Debian 官方源安装" + fi + if [[ "${osReleaseVersion}" == "12" ]]; then + green " 43. 安装 LTS内核 6.1 LTS, 通过 Debian 官方源安装" + fi + echo + fi + + green " 44. 安装 内核 4.19 LTS, 通过 Ubuntu kernel mainline 安装" + green " 45. 安装 内核 5.4 LTS, 通过 Ubuntu kernel mainline 安装" + green " 46. 安装 内核 5.10 LTS, 通过 Ubuntu kernel mainline 安装" + green " 47. 安装 内核 5.15, 通过 Ubuntu kernel mainline 安装" + green " 48. 安装 内核 5.19, 通过 Ubuntu kernel mainline 安装" + green " 49. 安装 最新版本内核 6.1, 通过 Ubuntu kernel mainline 安装" + echo + green " 51. 安装 XanMod Kernel 内核 6.6 LTS, 官方源安装 " + green " 52. 安装 XanMod Kernel 内核 6.11, 官方源安装 " + + fi + + echo + green " 61. 安装 BBR Plus 内核 4.14.129 LTS, cx9208 编译的 dog250 原版, 推荐使用" + green " 62. 安装 BBR Plus 内核 4.14 LTS, UJX6N 编译" + green " 63. 安装 BBR Plus 内核 4.19 LTS, UJX6N 编译" + green " 64. 安装 BBR Plus 内核 5.10 LTS, UJX6N 编译" + green " 65. 安装 BBR Plus 内核 5.15 LTS, UJX6N 编译" + green " 66. 安装 BBR Plus 内核 6.1 LTS, UJX6N 编译" + green " 67. 安装 BBR Plus 内核 6.6 LTS, UJX6N 编译" + green " 68. 安装 BBR Plus 最新版内核 6.7 或更高版本, UJX6N 编译" + + echo + green " 0. 退出脚本" + + + else + + green " ==================================================" + green " Linux kernel install script | 2024-09-25 | OS support:centos7+ / debian10+ / ubuntu16.04+" + green " Enable bbr require linux kernel higher than 4.9. Enable bbr plus require special bbr plus kernel " + red " Please use this script with caution in production. Backup your data first! Upgrade linux kernel will cause VPS unable to boot sometimes." + green " ==================================================" + if [[ -z ${osKernelBBRStatus} ]]; then + echo -e " Current Kernel: ${osKernelVersionBackup} (${virtual}) ${Red_font_prefix}Not install BBR / BBR Plus ${Font_color_suffix} , Please install kernel which is higher than 4.9" + else + if [ ${systemBBRRunningStatus} = "no" ]; then + echo -e " Current Kernel: ${osKernelVersionBackup} (${virtual}) ${Green_font_prefix}installed ${osKernelBBRStatus}${Font_color_suffix} kernel, ${Red_font_prefix}${systemBBRRunningStatusText}${Font_color_suffix} " + else + echo -e " Current Kernel: ${osKernelVersionBackup} (${virtual}) ${Green_font_prefix}installed ${osKernelBBRStatus}${Font_color_suffix} kernel, ${Green_font_prefix}${systemBBRRunningStatusText}${Font_color_suffix} " + fi + fi + echo -e " Congestion Control Algorithm: ${Green_font_prefix}${net_congestion_control}${Font_color_suffix} ECN: ${Green_font_prefix}${systemECNStatusText}${Font_color_suffix} Network Queue Algorithm: ${Green_font_prefix}${net_qdisc}${Font_color_suffix} " + + echo + green " 1. Show current linux kernel version, check supoort BBR / BBR2 / BBR Plus or not" + green " 2. enable bbr / bbr2 acceleration, (bbr2 require XanMod kernel)" + green " 3. enable bbr plus acceleration" + green " 4. Optimize system network configuration" + red " 5. Remove system network optimization configuration" + echo + green " 6. Show Wireguard working status" + green " 7. restart Wireguard " + green " 8. Show WARP SOCKS5 proxy working status" + green " 9. restart WARP SOCKS5 proxy" + green " 10. Show WireGuard and WARP SOCKS5 working status, error log, etc." + echo + green " 11. Install official Cloudflare WARP linux client SOCKS5 proxy, in order to unlock Netflix geo restriction " + green " 12. Install WireGuard and Cloudflare WARP tool Wgcf, enable IPv4 or IPv6, avoid Google reCAPTCHA" + green " 13. Install official Cloudflare WARP linux client, WireGuard and WARP toll Wgcf, not recommended " + red " 14. Remove WireGuard 和 Cloudflare WARP linux client" + green " 15. Switch WireGuard using IPv6 or IPv4 for your VPS" + green " 16. Set VPS using IPv4 or IPv6 firstly to access network" + + green " 21. Install warp by fscarmen. Enable IPv6, avoid Google reCAPTCHA and unlock Netflix geo restriction " + green " 22. Install warp-go by fscarmen. Enable IPv6, avoid Google reCAPTCHA and unlock Netflix geo restriction " + green " 23. Auto refresh Cloudflare WARP IP to unlock Netflix non-self produced drama" + echo + + if [[ "${osRelease}" == "centos" ]]; then + green " 31. Install latest linux kernel, 6.1, from elrepo yum repository" + green " 32. Install LTS linux kernel, 5.4 LTS, from elrepo yum repository" + green " 33. Install linux kernel 4.14 LTS, download and install from altarch website" + green " 34. Install linux kernel 4.19 LTS, download and install from altarch website" + green " 35. Install linux kernel 5.4 LTS, download and install from elrepo website" + echo + green " 36. Install linux kernel 5.10 LTS, compile by Teddysun. Recommended" + green " 37. Install linux kernel 5.15 LTS, compile by Teddysun. Recommended" + green " 38. Install linux kernel 6.1 LTS compile by Teddysun. Recommended" + green " 39. Install linux kernel 6.6 LTS compile by Teddysun. Recommended" + green " 40. Install linux kernel 6.11, compile by elrepo " + else + if [[ "${osRelease}" == "debian" ]]; then + if [[ "${osReleaseVersion}" == "10" ]]; then + green " 41. Install LTS linux kernel, 5.10 LTS, from Debian repository source" + fi + + if [[ "${osReleaseVersion}" == "11" ]]; then + green " 41. Install LTS linux kernel, 5.10 LTS, from Debian repository source" + green " 42. Install linux kernel, 5.19, from Debian repository source" + green " 43. Install latest linux kernel, 6.1 or higher, from Debian repository source" + fi + if [[ "${osReleaseVersion}" == "12" ]]; then + green " 43. Install LTS linux kernel, 6.1 LTS, from Debian repository source" + fi + echo + fi + + green " 44. Install linux kernel 4.19 LTS, download and install from Ubuntu kernel mainline" + green " 45. Install linux kernel 5.4 LTS, download and install from Ubuntu kernel mainline" + green " 46. Install linux kernel 5.10 LTS, download and install from Ubuntu kernel mainline" + green " 47. Install linux kernel 5.15, download and install from Ubuntu kernel mainline" + green " 48. Install linux kernel 5.19, download and install from Ubuntu kernel mainline" + green " 49. Install latest linux kernel 6.1, download and install from Ubuntu kernel mainline" + echo + green " 51. Install XanMod kernel 6.6 LTS, from XanMod repository source " + green " 52. Install XanMod kernel 6.11, from XanMod repository source " + fi + + echo + green " 61. Install BBR Plus kernel 4.14.129 LTS, compile by cx9208 from original dog250 source code. Recommended" + green " 62. Install BBR Plus kernel 4.14 LTS, compile by UJX6N" + green " 63. Install BBR Plus kernel 4.19 LTS, compile by UJX6N" + green " 64. Install BBR Plus kernel 5.10 LTS, compile by UJX6N" + green " 65. Install BBR Plus kernel 5.15 LTS, compile by UJX6N" + green " 66. Install BBR Plus kernel 6.1 LTS, compile by UJX6N" + green " 67. Install BBR Plus kernel 6.6 LTS, compile by UJX6N" + green " 68. Install BBR Plus latest kernel 6.7 or higher, compile by UJX6N" + echo + green " 0. exit" + + fi + + echo + read -r -p "Please input number:" menuNumberInput + case "$menuNumberInput" in + 1 ) + showLinuxKernelInfo + listInstalledLinuxKernel + ;; + 2 ) + enableBBRSysctlConfig "bbr" + ;; + 3 ) + enableBBRSysctlConfig "bbrplus" + ;; + 4 ) + addOptimizingSystemConfig + ;; + 5 ) + removeOptimizingSystemConfig + sysctl -p + ;; + 6 ) + checkWireguardBootStatus + ;; + 7 ) + restartWireguard + checkWireguardBootStatus + ;; + 8 ) + checkWarpClientStatus + ;; + 9 ) + restartWARP + checkWarpClientStatus + ;; + 10 ) + checkWireguard + ;; + 11 ) + installWARPClient + ;; + 12 ) + installWireguard + ;; + 13 ) + installWireguard + installWARPClient + ;; + 14 ) + removeWireguard + removeWARP + ;; + 15 ) + enableWireguardIPV6OrIPV4 "redo" + ;; + 16 ) + preferIPV4 "redo" + ;; + + 21 ) + installWARP + ;; + 22 ) + installWARPGO + ;; + 23 ) + vps_netflix_auto + ;; + 24 ) + vps_netflix_jin + ;; + 25 ) + vps_netflix_jin_auto + ;; + 31 ) + linuxKernelToInstallVersion="5.19" + isInstallFromRepo="yes" + installKernel + ;; + 32 ) + linuxKernelToInstallVersion="5.4" + isInstallFromRepo="yes" + installKernel + ;; + 33 ) + linuxKernelToInstallVersion="4.14" + installKernel + ;; + 34 ) + linuxKernelToInstallVersion="4.19" + installKernel + ;; + 35 ) + linuxKernelToInstallVersion="5.4" + installKernel + ;; + 36 ) + linuxKernelToInstallVersion="5.10" + installKernel + ;; + 37 ) + linuxKernelToInstallVersion="5.15" + installKernel + ;; + 38 ) + linuxKernelToInstallVersion="6.1" + installKernel + ;; + 39 ) + linuxKernelToInstallVersion="6.6" + installKernel + ;; + 40 ) + linuxKernelToInstallVersion="6.11" + installKernel + ;; + 41 ) + linuxKernelToInstallVersion="5.10" + isInstallFromRepo="yes" + installKernel + ;; + 42 ) + linuxKernelToInstallVersion="5.19" + isInstallFromRepo="yes" + installKernel + ;; + 43 ) + linuxKernelToInstallVersion="6.1" + isInstallFromRepo="yes" + installKernel + ;; + 44 ) + linuxKernelToInstallVersion="4.19" + installKernel + ;; + 45 ) + linuxKernelToInstallVersion="5.4" + installKernel + ;; + 46 ) + linuxKernelToInstallVersion="5.10.118" + installKernel + ;; + 47 ) + linuxKernelToInstallVersion="5.15" + installKernel + ;; + 48 ) + linuxKernelToInstallVersion="5.19" + installKernel + ;; + 49 ) + linuxKernelToInstallVersion="6.1" + installKernel + ;; + 51 ) + linuxKernelToInstallVersion="6.6" + linuxKernelToBBRType="xanmod" + isInstallFromRepo="yes" + installKernel + ;; + 52 ) + linuxKernelToInstallVersion="6.11" + linuxKernelToBBRType="xanmod" + isInstallFromRepo="yes" + installKernel + ;; + 61 ) + linuxKernelToInstallVersion="4.14.129" + linuxKernelToBBRType="bbrplus" + installKernel + ;; + 62 ) + linuxKernelToInstallVersion="4.14" + linuxKernelToBBRType="bbrplus" + installKernel + ;; + 63 ) + linuxKernelToInstallVersion="4.19" + linuxKernelToBBRType="bbrplus" + installKernel + ;; + 64 ) + linuxKernelToInstallVersion="5.10" + linuxKernelToBBRType="bbrplus" + installKernel + ;; + 65 ) + linuxKernelToInstallVersion="5.15" + linuxKernelToBBRType="bbrplus" + installKernel + ;; + 66 ) + linuxKernelToInstallVersion="6.1" + linuxKernelToBBRType="bbrplus" + installKernel + ;; + 67 ) + linuxKernelToInstallVersion="6.6" + linuxKernelToBBRType="bbrplus" + installKernel + ;; + 68 ) + linuxKernelToInstallVersion="6.7" + linuxKernelToBBRType="bbrplus" + installKernel + ;; + 87 ) + getLatestUbuntuKernelVersion + getLatestCentosKernelVersion + getLatestCentosKernelVersion "manual" + ;; + 88 ) + upgradeScript + ;; + 89 ) + virt_check + ;; + + 0 ) + exit 1 + ;; + * ) + clear + red "请输入正确数字 !" + sleep 2s + start_menu + ;; + esac +} + + + +function setLanguage(){ + echo + green " ==================================================" + green " Please choose your language" + green " 1. English" + green " 2. 中文" + echo + read -r -p "Please input your language:" languageInput + + case "${languageInput}" in + 1 ) + echo "en" > ${configLanguageFilePath} + showMenu + ;; + 2 ) + echo "cn" > ${configLanguageFilePath} + showMenu + ;; + * ) + red " Please input the correct number !" + setLanguage + ;; + esac +} + +configLanguageFilePath="${HOME}/language_setting_v2ray_trojan.md" +configLanguage="cn" + +function showMenu(){ + + if [ -f "${configLanguageFilePath}" ]; then + configLanguage=$(cat ${configLanguageFilePath}) + + case "${configLanguage}" in + cn ) + start_menu "first" + ;; + en ) + start_menu "first" + ;; + * ) + setLanguage + ;; + esac + else + setLanguage + fi +} + +showMenu \ No newline at end of file