one_click_script/install_kernel.sh
zhao 1609a31a09 添加 install_kernel.sh
Signed-off-by: zhao <zj18139624826@gmail.com>
2024-12-21 09:22:48 +08:00

3773 lines
145 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 <version>", 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 的修改。
# PSbbr 是一直在修改的,比如说 5.0 内核的 bbr4.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 supportcentos7+ / 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