1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
| #!/usr/bin/env bash # # Auto install latest kernel for TCP BBR # # System Required: CentOS 6+, Debian7+, Ubuntu12+ # # Copyright (C) 2016-2017 Teddysun <i@teddysun.com> # # URL: https://teddysun.com/489.html #
red='\033[0;31m' green='\033[0;32m' yellow='\033[0;33m' plain='\033[0m'
[[ $EUID -ne 0 ]] && echo -e "${red}Error:${plain} This script must be run as root!" && exit 1
[[ -d "/proc/vz" ]] && echo -e "${red}Error:${plain} Your VPS is based on OpenVZ, not be supported." && exit 1
if [ -f /etc/redhat-release ]; then release="centos" elif cat /etc/issue | grep -Eqi "debian"; then release="debian" elif cat /etc/issue | grep -Eqi "ubuntu"; then release="ubuntu" elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then release="centos" elif cat /proc/version | grep -Eqi "debian"; then release="debian" elif cat /proc/version | grep -Eqi "ubuntu"; then release="ubuntu" elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then release="centos" fi
get_latest_version() {
latest_version=$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/ | awk -F'\"v' '/v[4-9]./{print $2}' | cut -d/ -f1 | grep -v - | sort -V | tail -1)
[ -z ${latest_version} ] && return 1
if [[ `getconf WORD_BIT` == "32" && `getconf LONG_BIT` == "64" ]]; then deb_name=$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1) deb_kernel_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/${deb_name}" deb_kernel_name="linux-image-${latest_version}-amd64.deb" else deb_name=$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1) deb_kernel_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/${deb_name}" deb_kernel_name="linux-image-${latest_version}-i386.deb" fi
[ ! -z ${deb_name} ] && return 0 || return 1 }
get_opsy() { [ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return }
opsy=$( get_opsy ) arch=$( uname -m ) lbit=$( getconf LONG_BIT ) kern=$( uname -r )
get_char() { SAVEDSTTY=`stty -g` stty -echo stty cbreak dd if=/dev/tty bs=1 count=1 2> /dev/null stty -raw stty echo stty $SAVEDSTTY }
getversion() { if [[ -s /etc/redhat-release ]]; then grep -oE "[0-9.]+" /etc/redhat-release else grep -oE "[0-9.]+" /etc/issue fi }
centosversion() { if [ "${release}" == "centos" ]; then local code=$1 local version="$(getversion)" local main_ver=${version%%.*} if [ "$main_ver" == "$code" ]; then return 0 else return 1 fi else return 1 fi }
check_bbr_status() { local param=$(sysctl net.ipv4.tcp_available_congestion_control | awk '{print $3}') if uname -r | grep -Eqi "4.10."; then if [[ "${param}" == "bbr" ]]; then return 0 else return 1 fi else return 1 fi }
install_elrepo() {
if centosversion 5; then echo -e "${red}Error:${plain} not supported CentOS 5." exit 1 fi
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
if centosversion 6; then rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm elif centosversion 7; then rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm fi
if [ ! -f /etc/yum.repos.d/elrepo.repo ]; then echo -e "${red}Error:${plain} Install elrepo failed, please check it." exit 1 fi }
install_config() { if [[ "${release}" == "centos" ]]; then if centosversion 6; then if [ ! -f "/boot/grub/grub.conf" ]; then echo -e "${red}Error:${plain} /boot/grub/grub.conf not found, please check it." exit 1 fi sed -i 's/^default=.*/default=0/g' /boot/grub/grub.conf elif centosversion 7; then if [ ! -f "/boot/grub2/grub.cfg" ]; then echo -e "${red}Error:${plain} /boot/grub2/grub.cfg not found, please check it." exit 1 fi grub2-set-default 0 fi elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then /usr/sbin/update-grub fi
sed -i '/net.core.default_qdisc/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_congestion_control/d' /etc/sysctl.conf echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf sysctl -p >/dev/null 2>&1 }
install_bbr() { check_bbr_status if [ $? -eq 0 ]; then echo echo -e "${green}Info:${plain} TCP BBR has been successfully installed. nothing to do..." exit fi
if [[ "${release}" == "centos" ]]; then install_elrepo yum --enablerepo=elrepo-kernel -y install kernel-ml kernel-ml-devel if [ $? -ne 0 ]; then echo -e "${red}Error:${plain} Install latest kernel failed, please check it." exit 1 fi elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then [[ ! -e "/usr/bin/wget" ]] && apt-get -y update && apt-get -y install wget get_latest_version [ $? -ne 0 ] && echo -e "${red}Error:${plain} Get latest kernel version failed." && exit 1 wget -c -t3 -T60 -O ${deb_kernel_name} ${deb_kernel_url} if [ $? -ne 0 ]; then echo -e "${red}Error:${plain} Download ${deb_kernel_name} failed, please check it." exit 1 fi dpkg -i ${deb_kernel_name} rm -fv ${deb_kernel_name} else echo -e "${red}Error:${plain} OS is not be supported, please change to CentOS/Debian/Ubuntu and try again." exit 1 fi
install_config }
clear echo "---------- System Information ----------" echo " OS : $opsy" echo " Arch : $arch ($lbit Bit)" echo " Kernel : $kern" echo "----------------------------------------" echo " Auto install latest kernel for TCP BBR" echo echo " URL: https://teddysun.com/489.html" echo "----------------------------------------" echo echo "Press any key to start...or Press Ctrl+C to cancel" char=`get_char`
install_bbr
echo read -p "Info: The system needs to be restart. Do you want to reboot? [y/n]" is_reboot if [[ ${is_reboot} == "y" || ${is_reboot} == "Y" ]]; then reboot else exit fi
|