Linux開啟最新內核並一鍵安裝BBR腳本

該腳本由網友秋水逸冰製作,作者本人已經刪除原文,本文僅複製備份。
該腳本託管在Github上仍保留了master分支,所以腳本依然可用。

Google 開源了其 TCP BBR 擁塞控制算法,並提交到了 Linux 內核,從 4.9 開始,Linux 內核已經用上了該算法。根據以往的傳統,Google 總是先在自家的生產環境上線運用後,才會將代碼開源,此次也不例外。根據實地測試,在部署了最新版內核並開啟了 TCP BBR 的機器上,網速甚至可以提升好幾個數量級。

腳本適用環境

  • 系統支持:CentOS 6+,Debian 7+,Ubuntu 12+
  • 虛擬技術:OpenVZ 以外的,比如 KVM、Xen、VMware 等
  • 內存要求:≥128M
  • 日期  :2018 年 12 月 14 日

關於本腳本

  • 本腳本已在 Vultr 上的 VPS 全部測試通過。
  • 當腳本檢測到 VPS 的虛擬方式為 OpenVZ 時,會提示錯誤,並自動退出安裝。
  • 腳本運行完重啟發現開不了機的,打開 VPS 後台控制面板的 VNC, 開機卡在 grub 引導, 手動選擇內核即可。
  • 由於是使用最新版系統內核,最好請勿在生產環境安裝,以免產生不可預測之後果。

使用方法

使用root用戶登錄,運行以下命令:

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh

安裝完成後,腳本會提示需要重啟 VPS,輸入 y 並回車後重啟。重啟完成後,進入 VPS,驗證一下是否成功安裝最新內核並開啟 TCP BBR,輸入以下命令:

uname -r

查看內核版本,顯示為最新版就表示 OK 了

sysctl net.ipv4.tcp_available_congestion_control

返回值一般為:
net.ipv4.tcp_available_congestion_control = bbr cubic reno
或者為:
net.ipv4.tcp_available_congestion_control = 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 模塊即說明 bbr 已啟動。注意:並不是所有的 VPS 都會有此返回值,若沒有也屬正常。

CentOS 下最新版內核 headers 安裝方法

本來打算在腳本里直接安裝 kernel-ml-headers,但會出現和原版內核 headers 衝突的問題。因此在這裡添加一個腳本執行完後,手動安裝最新版內核 headers 之教程。
執行以下命令

yum --enablerepo=elrepo-kernel -y install kernel-ml-headers

根據 CentOS 版本的不同,此時一般會出現類似於以下的錯誤提示:

Error: kernel-ml-headers conflicts with kernel-headers-2.6.32-696.20.1.el6.x86_64
Error: kernel-ml-headers conflicts with kernel-headers-3.10.0-693.17.1.el7.x86_64

因此需要先卸載原版內核 headers ,然後再安裝最新版內核 headers。執行命令:

yum remove kernel-headers

確認無誤後,輸入 y,回車開始卸載。注意,有時候這麼操作還會卸載一些對內核 headers 依賴的安裝包,比如 gcc、gcc-c++ 之類的。不過不要緊,我們可以在安裝完最新版內核 headers 後再重新安裝回來即可。
卸載完成後,再次執行上面給出的安裝命令。

yum --enablerepo=elrepo-kernel -y install kernel-ml-headers

成功安裝後,再把那些之前對內核 headers 依賴的安裝包,比如 gcc、gcc-c++ 之類的再安裝一次即可。 為什麼要安裝最新版內核 headers 呢?這是因為 shadowsocks-libev 版有個 tcp fast open 功能,如果不安裝的話,這個功能是無法開啟的。

內核升級方法

如果是 CentOS 系統,執行如下命令即可升級內核:

yum -y install kernel-ml kernel-ml-devel

如果你還手動安裝了新版內核 headers ,那麼還需要以下命令來升級 headers :

yum -y install kernel-ml-headers

CentOS 6 的話,執行命令:

sed -i 's/^default=.*/default=0/g' /boot/grub/grub.conf

CentOS 7 的話,執行命令:

grub2-set-default 0

如果是 Debian/Ubuntu 系統,則需要手動下載最新版內核來安裝升級。
這裡下載最新版的內核 deb 安裝包。
如果系統是 64 位,則下載 amd64 的 linux-image 中含有 generic 這個 deb 包;
如果系統是 32 位,則下載 i386 的 linux-image 中含有 generic 這個 deb 包;
安裝的命令如下(以最新版的 64 位 4.12.4 舉例而已,請替換為下載好的 deb 包):

dpkg -i linux-image-4.12.4-041204-generic_4.12.4-041204.201707271932_amd64.deb

安裝完成後,再執行命令:

/usr/sbin/update-grub

最後,重啟 VPS 即可。

特別說明

如果你使用的是 Google Cloud Platform (GCP)更換內核,有時會遇到重啟後,整個磁盤變為只讀的情況。只需執行以下命令即可恢復:

mount -o remount rw /

更新日誌

2018 年 12 月 14 日:

  • 修正:在 CentOS 6 系統下 kernel-ml 及 kernel-ml-devel 無法安裝的問題。原因是 elrepo 官方最近取消了 kernel-ml 及 kernel-ml-devel 的 rpm 資源。腳本已改為下載 rpm 來安裝的方式。版本 4.18.20 將會是 CentOS 6 下最新的內核,目測以後也不會再有升級了,請儘快遷移到 CentOS 7 系統。

2018 年 06 月 09 日:

  • 修正:在 CentOS 系統下將 elrepo-kernel 默認啟用,以解決在安裝新內核後執行 yum update 再次安裝舊內核的問題。

2018 年 05 月 12 日:

  • 修正:在 Ubuntu 或 Debian 系統中某些情況下獲取不到某個編譯失敗的安裝包導致退出安裝的問題。並且現在可以手動選擇安裝從 4.14 到最新版本的內核。

2018 年 02 月 24 日:

  • 新增:手動安裝最新版內核 headers 的教程。

2017 年 10 月 28 日:

  • 更新:自動判斷內核版本。如果內核版本已經大於或等於 4.9 且沒有開啟 BBR,腳本會直接設置好 BBR;
  • 新增:腳本執行時會在當前目錄下創建日誌(install_bbr.log),方便查看及排錯。

2017 年 02 月 22 日:

  • 更新:自動獲取最新版 4.10 內核。

2017 年 01 月 20 日:

  • 新增:自動獲取並下載安裝最新版內核的功能。

2017 年 01 月 13 日:

  • 更新:內核到 4.9.3。

2017 年 01 月 09 日

  • 更新:內核到 4.9.1。

參考鏈接

  • https://github.com/google/bbr/blob/master/Documentation/bbr-quick-start.md
  • http://elrepo.org/tiki/tiki-index.php
  • http://kernel.ubuntu.com/~kernel-ppa/mainline/