Skip to content

Instantly share code, notes, and snippets.

@ComeBey
Created October 31, 2019 06:56
Show Gist options
  • Save ComeBey/cd988df239bfe5060744619b73843852 to your computer and use it in GitHub Desktop.
Save ComeBey/cd988df239bfe5060744619b73843852 to your computer and use it in GitHub Desktop.
BEST FOR BBR
#!/bin/bash
Green_font="\033[32m" && Yellow_font="\033[33m" && Red_font="\033[31m" && Font_suffix="\033[0m"
Info="${Green_font}[Info]${Font_suffix}"
Error="${Red_font}[Error]${Font_suffix}"
reboot="${Yellow_font}重启${Font_suffix}"
echo -e "${Green_font}
#=======================================
# Project: tcp_nanqinlang general
# Platform: --Debian --KVM
# Branch: --fool
# Version: 1.3.0
# Author: nanqinlang
# SNS: https://linktr.ee/wangtao.lm
# Github: https://github.com/nanqinlang
#=======================================
${Font_suffix}"
check_system(){
[[ -z "`cat /etc/issue | grep -iE "debian"`" ]] && echo -e "${Error} only support Debian !" && exit 1
}
check_root(){
[[ "`id -u`" != "0" ]] && echo -e "${Error} must be root user !" && exit 1
}
check_kvm(){
apt-get update
apt-get install -y virt-what
apt-get install -y ca-certificates
[[ "`virt-what`" != "kvm" ]] && echo -e "${Error} only support KVM !" && exit 1
}
directory(){
[[ ! -d /home/tcp_nanqinlang ]] && mkdir -p /home/tcp_nanqinlang
cd /home/tcp_nanqinlang
}
get_url(){
bit=`uname -m`
if [[ "${bit}" = "x86_64" ]]; then
image_name=`wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.2/ | grep "linux-image" | grep "lowlatency" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1`
image_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.2/${image_name}"
elif [[ "${bit}" = "i386" ]]; then
image_name=`wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.2/ | grep "linux-image" | grep "lowlatency" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1`
image_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.2/${image_name}"
else
echo -e "${Error} not support bit !" && exit 1
fi
}
delete_surplus_image(){
for((integer = 1; integer <= ${surplus_total_image}; integer++))
do
surplus_sort_image=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "4.10.2" | head -${integer}`
apt-get purge -y ${surplus_sort_image}
done
apt-get autoremove -y
if [[ "${surplus_total_image}" = "0" ]]; then
echo -e "${Info} uninstall all surplus images successfully, continuing"
fi
}
delete_surplus_headers(){
for((integer = 1; integer <= ${surplus_total_headers}; integer++))
do
surplus_sort_headers=`dpkg -l|grep linux-headers | awk '{print $2}' | grep -v "4.10.2" | head -${integer}`
apt-get purge -y ${surplus_sort_headers}
done
apt-get autoremove -y
if [[ "${surplus_total_headers}" = "0" ]]; then
echo -e "${Info} uninstall all surplus headers successfully, continuing"
fi
}
install_image(){
if [[ -f "${image_name}" ]]; then
echo -e "${Info} deb file exist"
else echo -e "${Info} downloading image" && wget ${image_url}
fi
if [[ -f "${image_name}" ]]; then
echo -e "${Info} installing image" && dpkg -i ${image_name}
else echo -e "${Error} image download failed, please check !" && exit 1
fi
}
#check/install required version and remove surplus kernel
check_kernel(){
get_url
#when kernel version = required version, response required version number.
digit_ver_image=`dpkg -l | grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep "4.10.2"`
#total digit of kernel without required version
surplus_total_image=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "4.10.2" | wc -l`
surplus_total_headers=`dpkg -l|grep linux-headers | awk '{print $2}' | grep -v "4.10.2" | wc -l`
if [[ -z "${digit_ver_image}" ]]; then
echo -e "${Info} installing required image" && install_image
else echo -e "${Info} image already installed a required version"
fi
if [[ "${surplus_total_image}" != "0" ]]; then
echo -e "${Info} removing surplus image" && delete_surplus_image
else echo -e "${Info} no surplus image need to remove"
fi
if [[ "${surplus_total_headers}" != "0" ]]; then
echo -e "${Info} removing surplus headers" && delete_surplus_headers
else echo -e "${Info} no surplus headers need to remove"
fi
update-grub
}
dpkg_list(){
echo -e "${Info} 这是当前已安装的所有内核的列表:"
dpkg -l |grep linux-image | awk '{print $2}'
dpkg -l |grep linux-headers | awk '{print $2}'
echo -e "${Info} 这是需要安装的所有内核的列表:\nlinux-image-4.10.2-lowlatency"
echo -e "${Info} 请确保上下两个列表完全一致!"
}
# (1)while kernel is 4.10.2
ver_4.10.2(){
#[[ ! -f /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko ]] && echo -e "${Info} loading mod" && cd /lib/modules/`uname -r`/kernel/net/ipv4 && wget -O tcp_nanqinlang.ko "https://raw.githubusercontent.com/tcp-nanqinlang/general/master/General/Debian/mod/tcp_nanqinlang-for-v4.10.2.ko" && insmod tcp_nanqinlang.ko && depmod -a
#[[ ! -f /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko ]] && echo -e "${Error} download mod failed,please check !" && exit 1
#download
[[ ! -f /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko ]] && echo -e "${Info} loading mod" && cd /lib/modules/`uname -r`/kernel/net/ipv4 && wget -O tcp_nanqinlang.ko "https://raw.githubusercontent.com/tcp-nanqinlang/general/master/General/Debian/mod/tcp_nanqinlang-for-v4.10.2.ko"
#check and install
if [[ -f /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko ]]; then
insmod /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko
depmod -a
else
echo -e "${Error} failed download mod, please check !" && exit 1
fi
}
check_status(){
#status_sysctl=`sysctl net.ipv4.tcp_congestion_control | awk '{print $3}'`
#status_lsmod=`lsmod | grep nanqinlang`
if [[ "`lsmod | grep nanqinlang`" != "" ]]; then
echo -e "${Info} tcp_nanqinlang is installed !"
if [[ "`sysctl net.ipv4.tcp_congestion_control | awk '{print $3}'`" = "nanqinlang" ]]; then
echo -e "${Info} tcp_nanqinlang is running !"
else echo -e "${Error} tcp_nanqinlang is installed but not running !"
fi
else
echo -e "${Error} tcp_nanqinlang not installed !"
fi
}
install(){
check_system
check_root
check_kvm
directory
check_kernel
dpkg_list
echo -e "${Info} 确认内核安装无误后, ${reboot}你的VPS, 开机后再次运行该脚本的第二项!"
}
start(){
check_system
check_root
check_kvm
directory
ver_4.10.2
sed -i '/net\.core\.default_qdisc/d' /etc/sysctl.conf
sed -i '/net\.ipv4\.tcp_congestion_control/d' /etc/sysctl.conf
echo -e "\nnet.core.default_qdisc=fq" >> /etc/sysctl.conf
echo -e "net.ipv4.tcp_congestion_control=nanqinlang\c" >> /etc/sysctl.conf
sysctl -p
check_status
rm -rf /home/tcp_nanqinlang
}
status(){
check_status
}
uninstall(){
check_root
sed -i '/net\.core\.default_qdisc=/d' /etc/sysctl.conf
sed -i '/net\.ipv4\.tcp_congestion_control=/d' /etc/sysctl.conf
sysctl -p
rm /lib/modules/`uname -r`/kernel/net/ipv4/tcp_nanqinlang.ko
echo -e "${Info} please remember ${reboot} to stop tcp_nanqinlang !"
}
echo -e "${Info} 选择你要使用的功能: "
echo -e "1.安装内核\n2.安装并开启算法\n3.检查算法运行状态\n4.卸载算法"
read -p "输入数字以选择:" function
while [[ ! "${function}" =~ ^[1-4]$ ]]
do
echo -e "${Error} 无效输入"
echo -e "${Info} 请重新选择" && read -p "输入数字以选择:" function
done
if [[ "${function}" == "1" ]]; then
install
elif [[ "${function}" == "2" ]]; then
start
elif [[ "${function}" == "3" ]]; then
status
else
uninstall
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment