# BBR & BBRv2 安裝手冊 - ( 適用VMware workstation player Pro 17 - Ubuntu 22.04 )
## **VM參數配備:**
CPU : 4 Core
RAM : 8 GB
DISK : 40GB
NET : NAT module
OS : ubuntu-22.04.2-desktop-amd64
Linux Kernel : 5.19.0-50-generic
VM Release : workstation player 17 pro
Update Linux Kernel : 5.13.12
Congestion control : reno cubic BBR BBRv2
## 1.安裝相依套件
#### 進入系統,先關掉惱人的螢幕保護程式


#### 安裝需要的套件
```
sudo apt install build-essential libncurses5-dev git screen -y
sudo apt build-dep linux -y
```
#### -------------------------------- 錯誤code解決方式 --------------------------------
#### 執行第二段code,出現了下圖的錯誤

#### 就跑這兩段code,就可以解決了。
```
sudo sed -i 's/#deb-src/deb-src/g' /etc/apt/sources.list
sudo sed -i 's/# deb-src/deb-src/g' /etc/apt/sources.list
```
#### 再跑一下更新。
```
sudo apt update && sudo apt upgrade -y
```
#### ------------------------------ 錯誤code解決方式-END -----------------------------
#### 再重新跑一次剛剛沒跑成功的code
```
sudo apt build-dep linux -y
```
## 2.下載BBRv2
#### 在安裝BBRv2的原始code下來,這邊示範以/home文件夾下進行
###### 由於在~$test底下使用,所以要打下面那行指令,才可以進入 /home (test為此次範例的使用者名稱)
```
cd ..
```

#### 接著,在安裝BBRv2的原始code下來
```
sudo git clone -o google-bbr -b v2alpha https://github.com/google/bbr.git
```
#### 出現有顯示三個done就代表下載完成

#### 再來進去原始code的資料夾裡面,並查看是否有檔案

## 3.編譯kernel
#### 接著執行下面的code,來開始編譯我們BBRv2的核心 (Kernel)
```
sudo make menuconfig
```
#### 就會看到這個介面,請用上下按鍵移動至圖上的位置,並用左右按鍵選取下方的控制按鍵,選取到<select>並按Enter進入

#### 進到這裡請選取 Networking optinos ---> 一樣選取到<select>並按Enter

#### 再往下找,找到 TCP: advanced congestion control,一樣選取到<select>並按Enter

#### 選取到BBR TCP 和 BBR2 TCP ,即是這次要安裝的BBR與BBRv2。
#### 在對著目標按"兩下"空白鍵,看到 " * " 星星字號即可。

#### 選取到 Default TCP congestion control (cubic),選取到<select>並按Enter。

#### 選取到這次要安裝的BBR2,並按Enter,即可選取成功 。

#### 接著請按右方向鍵至 < save > ,進入儲存畫面 。

#### 按Enter。

#### 看到右邊有 ( 100% ),代表OK了,在按Enter離開,就儲存完成了!!

#### 接著一直選取 < Exit > ,回到終端機 ( cmd )即可。

#### 回到這個畫面就代表已經離開編譯的config檔案裡了。

#### 再來輸入這兩行code,來關閉原始code的簽名檔。
##### ( 這兩行打完是不會有反應的~ 請放心)
```
sudo scripts/config --disable MODULE_SIG
sudo scripts/config --disable DEBUG_INFO
```

## 4.製作更改kernel所需的檔案
##### (小提醒:j1後面的數字是CPU的核心數,建議先用1核心就可以了)
```
sudo make -j1 deb-pkg
```
#### 接著你就會看到他噴出錯誤資訊哈哈哈哈哈

#### 這時候~ 請先去安裝vim,安裝時請按Y
```
sudo apt install vim
```

#### 再用vim編輯 .config 文件
##### ( 小提醒 : 開啟時,請一定要在root模式開啟,不然會有問題。)
##### vim小教學 : i=輸入 ?=搜尋 : = 輸入指令 w = 儲存 q = 離開 ! = 強制執行 舉例:要強制儲存離開,要打 :wq!
```
vim .config
```
#### 修改CONFIG_SYSTEM_TRUSTED_KEYS
```
CONFIG_SYSTEM_TRUSTED_KEYS = "debian/canonical-certs.pem"
改成
CONFIG_SYSTEM_TRUSTED_KEYS = ""
```
#### 修改CONFIG_SYSTEM_REVOCATION_KEYS
```
CONFIG_SYSTEM_REVOCATION_KEYS = "debian/canonical-revoked-certs.pem"
改成
CONFIG_SYSTEM_REVOCATION_KEYS = ""
```
#### 修改前

#### 修改後

#### 在儲存返回即可~
#### 再重新編譯一次,這次我就會用4核心來跑~ (編譯過程中可能約三小時左右,請耐心等候)
```
sudo make -j4 deb-pkg
```
##### 如果安裝過程中有看到這個,請一直按ENTER繼續下去即可。

#### 看到這個畫面,代表編譯完成。

#### 這時請回到 /home 來查看有沒有Kernel的安裝包。
```
cd..
ls
```
#### 此時會看到帶有header & image檔名的檔案,就是要安裝的檔案。
##### ( 小提醒 : image檔案就是kernel的核心 )

#### 接著打入這四行指令,來打開編譯完後副檔名deb的壓縮檔。
##### ( 小提醒 : 由於bbrv2的kernel(內核)會升級,所以這檔案的版本也會不一樣,所以請依照編譯完出來的版本為主,來修改下面兩行有.deb副檔名的code 。 此範例為5.13.12版本。)
```
sudo dpkg -i linux-headers-5.13.12_5.13.12-1_amd64.deb
sudo dpkg -i linux-image-5.13.12_5.13.12-1_amd64.deb
sudo dpkg -l|grep linux-headers | awk '{print $2}'
sudo dpkg -l|grep linux-image | awk '{print $2}'
```
#### 完成後就會長這樣~

## 5.替換成 BBRv2 Kernel
#### 執行下面兩行code,更改fq以及 congestion_control,來開啟BBRv2
```
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr2" >> /etc/sysctl.conf
```
#### 查看一下是否有更改成功
##### ( 小提醒 : congestion_control那行沒成功是正常,要更換kernel才會啟動 )
```
sysctl -p
```

#### 檢查一下電腦有幾個 image 檔案,並請記得舊的kernel版本。 ( 此範例版本為 linux-image-5.19.0-50-generic以及其他兩個版本)
```
dpkg --get-selections | grep linux-image
```

#### 順便確認現在使用的kernel版本
```
uname -r
```

#### 可以先重新啟動~
```
reboot
```
#### 重新開機完後,請刪除現在的kernel版本(如果不記得剛剛舊的版本,可以回去看上三行指令再看一次。[ 記得加sudo進入管理員權限 ] )
```
sudo apt-get purge linux-image-5.19.0-50-generic
```
#### 請打 " Y "

#### 這畫面是問是否保留,請點選 < NO >

#### 刪除完後長這樣

#### 再確認一下是否還有別的kernel~ ( 向這邊就還有,請一併刪除~ )
```
dpkg --get-selections | grep linux-image
```

#### 刪除完後只會有自己編譯完後的kernel ( 此範例版本為 linux-image-5.13.12 )

#### Kernel刪除完後,讓它安裝新的kernel,並重新啟動~
```
update-grub
reboot
```

#### 再次重新開機後,請打下面的code來查看BBRv2是否有安裝成功且開啟。
```
sysctl net.ipv4.tcp_congestion_control
```
```
sysctl net.ipv4.tcp_available_congestion_control
```

#### 有看到 bbr 和 bbr2。
#### 順便檢查kernel版本,確定是要安裝的版本~
```
uname -r
```

#### 這樣就安裝成功拉~
## 6. 開啟 ECN
#### 輸入下面三行code,開啟ECN (請先進入root再輸入下面兩行)
```
sudo su
```
```
echo "net.ipv4.tcp_ecn = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_ecn_fallback = 1" >> /etc/sysctl.conf
```
#### 查看ECN 狀態
```
sysctl -p
```
#### 看到顯示這個就代表成功瞜~

## 參考網址:
1. Google TCP BBR V2从编译到食用完全指南 - https://ca-design.xyz/open-bbrv2/
2. 内核错误: No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘ - https://blog.csdn.net/qq_36393978/article/details/118157426
3. Ubuntu 移除舊版本 Linux 核心 -
https://www.arthurtoday.com/2013/05/ubuntu-remove-all-older-linux-kernels.html