Total Pageviews

Saturday 13 May 2017

比锐速还强的 TCP拥塞控制技术 —— TCP-BBR 测试及开启教程

BBR和锐速都属于TCP拥塞控制技术,虽然这类技术不少,不过我都不是很了解。 本文章仅为我个人的测试,各地区测试情况不一样,而且BBR还处于开发初期并且开源,而锐速则已经停止开发了。


注意:TCP-BBR和锐速一样,不支持Openvz,查看本教程之前,请先确定你的VPS的虚拟化技术!
注意:本教程涉及到VPS更换内核,所以如果步骤错误,或者VPS不兼容最新的内核,
会导致无法开机等错误,请勿用于生产环境!!!!

BBR 简单介绍

BBR 是一个由谷歌社区开发的 TCP拥塞控制技术,目前处于开发初期,但是前景很棒,大家可以持续关注,同时BBR是集成与Linux最新版本的内核中的。
具体什么是TCP拥塞控制技术,详细的我也不懂,我就用通俗的解释一下,不一定准确,看一看理解一下就好了。
原始的TCP流量传输技术,流量管理很乱,我们把 TCP流量比喻成 公路上的汽车流量,而TCP传输隧道就是 公路,那么:
在原始的TCP流量传输中,一条十字路口公路,很多车流量,但是却没有红绿灯和交警,导致大家左挤右挤的堵车了,这就是没有合理的管理导致的。
而BBR和锐速等TCP流量控制技术,就是红绿灯+交警,他们就是在无人管理的十字路口,去合理指挥分配车流量,然后最大化的利用车流量,保证路面畅通。
大概就是这样解释了,有什么错误请指出。

启动步骤

首先是教程,本人喜欢Debian,所以我先使用 Debian 7 / 8 x64 系统来做测试。Ubuntu随后考虑加上。
每一个步骤,我都会加上VPS中执行后的提示,本教程以64位为例。但是各个系统可能会存在差异,所以仅为参考。
在 2016-12-05 21:00 更新的 4.9.0-rc8 内核已经支持了TCP-BBR,最新内核看这里
注意:TCP-BBR必须是 2016-12-05 21:00 更新的 4.9.0-rc8 内核及以后的版本 才能开启,而锐速并不支持这个最新的内核版本,所以TCP-BBR和锐速是不能共存的。

更换内核需要ROOT权限的账号,所以如果你是普通用户 的话,需要切换到ROOT账号,如果你是ROOT账号,那就忽略这个步骤:
  1. sudo su
输入并回车后,会提示让你输入当前用户账号的密码,输入并回车后就可以继续下面的步骤了。

  1. uname -m
使用这个命令会返回你的系统位数,如果是 x86_64 那就是64位,如果是 i386 或 386 那就是32位,如果是 i686 或 686,那么不支持

下载内核文件(64位系统)

  1. wget -O linux-image-4.10.1-amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.1/linux-image-4.10.1-041001-generic_4.10.1-041001.201702260735_amd64.deb

下载内核文件(32位系统)

  1. wget -O linux-image-4.10.1-i386.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.1/linux-image-4.10.1-041001-generic_4.10.1-041001.201702260735_i386.deb
  1. # VPS提示(64位)
  2.  
  3. root@bbr1:~# wget -O linux-image-4.10.1-amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.1/linux-image-4.10.1-041001-generic_4.10.1-041001.201702260735_amd64.deb
  4. converted 'http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.1/linux-image-4.10.1-041001-generic_4.10.1-041001.201702260735_amd64.deb' (ANSI_X3.4-1968) -> 'http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9-rc8/linux-image-4.10.1-040900rc8-generic_4.10.1-040900rc8.201612051443_amd64.deb' (UTF-8)
  5. --2016-12-08 15:31:16-- http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-image-4.10.1-040900-generic_4.10.1-040900.201612111631_amd64.deb
  6. Resolving kernel.ubuntu.com (kernel.ubuntu.com)... 91.189.94.216
  7. Connecting to kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:80... connected.
  8. HTTP request sent, awaiting response... 200 OK
  9. Length: 60489324 (58M) [application/x-debian-package]
  10. Saving to: 'linux-image-4.10.1-amd64.deb'
  11.  
  12. linux-image-4.10.1-040900 100%[=====================================>] 57.69M 3.02MB/s in 14s
  13.  
  14. 2016-12-08 15:31:31 (4.05 MB/s) - 'linux-image-4.10.1-amd64.deb' saved [60489324/60489324]

安装内核(64位)

  1. dpkg -i linux-image-4.10.1-amd64.deb

安装内核(32位)

  1. dpkg -i linux-image-4.10.1-i386.deb
  1. # VPS提示
  2.  
  3. root@bbr1:~# dpkg -i linux-image-4.10.1-amd64.deb
  4. Selecting previously unselected package linux-image-4.10.1-040900rc8-generic.
  5. (Reading database ... 25141 files and directories currently installed.)
  6. Preparing to unpack linux-image-4.10.1-040900rc8-generic_4.10.1-040900rc8.201612051443_amd64.deb ...
  7. Done.
  8. Unpacking linux-image-4.10.1-040900rc8-generic (4.10.1-040900rc8.201612051443) ...
  9. Setting up linux-image-4.10.1-040900rc8-generic (4.10.1-040900rc8.201612051443) ...
  10. Running depmod.
  11. update-initramfs: deferring update (hook will be called later)
  12. Examining /etc/kernel/postinst.d.
  13. run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.10.1-040900rc8-generic /boot/vmlinuz-4.10.1-040900rc8-generic
  14. run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.10.1-040900rc8-generic /boot/vmlinuz-4.10.1-040900rc8-generic
  15. update-initramfs: Generating /boot/initrd.img-4.10.1-040900rc8-generic
  16. run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.10.1-040900rc8-generic /boot/vmlinuz-4.10.1-040900rc8-generic
  17. Generating grub configuration file ...
  18. Found linux image: /boot/vmlinuz-4.10.1-040900rc8-generic
  19. Found initrd image: /boot/initrd.img-4.10.1-040900rc8-generic
  20. Found linux image: /boot/vmlinuz-3.16.0-4-amd64
  21. Found initrd image: /boot/initrd.img-3.16.0-4-amd64
  22. done

列出并删除旧内核

列出VPS 除了刚才安装的内核以外的 所有内核名称:
注意:这个代码是排除了刚才安装的内核,所以不会显示刚才安装的那个内核。删除了多余的内核后,就会什么都不显示!
  1. dpkg -l|grep linux-image | awk '{print $2}' | grep -v 'linux-image-[4-9].[0-9]*.'
  1. root@bbr1:~# dpkg -l|grep linux-image | awk '{print $2}' | grep -v 'linux-image-[4-9].[0-9]*.'
  2. linux-image-3.16.0-4-amd64
  3. linux-image-amd64
我使用的VPS是 3.16.0-4-amd64 内核的,所以删除这两个内核: linux-image-3.16.0-4-amd64、linux-image-amd64
删除旧内核:
  1. apt-get purge 旧内核名称
  1. # !!!!示例!!!!
  2. # 比如我是有这两个内核,所以我把这两个删掉,不要照着我的这个步骤做,自己换成你VPS的内核名称!!!
  3. apt-get purge linux-image-3.16.0-4-amd64
  4. apt-get purge linux-image-amd64
  5. # !!!!示例!!!!
删除旧内核的过程中会提示你是否继续,选择 Y ,然后还会提示你是否终止删除内核的行为,选择 NO

  1. # VPS提示
  2.  
  3. root@bbr1:~# apt-get purge linux-image-3.16.0-4-amd64
  4. Reading package lists... Done
  5. Building dependency tree
  6. Reading state information... Done
  7. The following packages were automatically installed and are no longer required:
  8. libuuid-perl linux-base
  9. Use 'apt-get autoremove' to remove them.
  10. The following packages will be REMOVED:
  11. linux-image-3.16.0-4-amd64* linux-image-amd64*
  12. 0 upgraded, 0 newly installed, 2 to remove and 7 not upgraded.
  13. After this operation, 164 MB disk space will be freed.
  14. Do you want to continue? [Y/n] y
  15. (Reading database ... 31152 files and directories currently installed.)
  16. Removing linux-image-3.16.0-4-amd64 (3.16.36-1+deb8u2) ...
  17. Ok, proceeding with removing running kernel image.
  18. /etc/kernel/postrm.d/initramfs-tools:
  19. update-initramfs: Deleting /boot/initrd.img-3.16.0-4-amd64
  20. /etc/kernel/postrm.d/zz-update-grub:
  21. Generating grub configuration file ...
  22. Found linux image: /boot/vmlinuz-4.10.1-040900rc8-generic
  23. Found initrd image: /boot/initrd.img-4.10.1-040900rc8-generic
  24. done
  25. The link /vmlinuz.old is a damaged link
  26. Removing symbolic link vmlinuz.old
  27. You may need to re-run your boot loader
  28. The link /initrd.img.old is a damaged link
  29. Removing symbolic link initrd.img.old
  30. You may need to re-run your boot loader
  31. Purging configuration files for linux-image-3.16.0-4-amd64 (3.16.36-1+deb8u2) ...
  32.  
  33. # ================================================
  34.  
  35. root@bbr1:~# apt-get purge linux-image-amd64
  36. Reading package lists... Done
  37. Building dependency tree
  38. Reading state information... Done
  39. The following packages were automatically installed and are no longer required:
  40. libuuid-perl linux-base
  41. Use 'apt-get autoremove' to remove them.
  42. The following packages will be REMOVED:
  43. linux-image-amd64*
  44. 0 upgraded, 0 newly installed, 1 to remove and 7 not upgraded.
  45. After this operation, 164 MB disk space will be freed.
  46. Do you want to continue? [Y/n] y
  47. (Reading database ... 31152 files and directories currently installed.)
  48. Removing linux-image-amd64 (3.16.36-1+deb8u2) ...
  49. Ok, proceeding with removing running kernel image.
  50. /etc/kernel/postrm.d/initramfs-tools:
  51. update-initramfs: Deleting /boot/initrd.img-amd64
  52. /etc/kernel/postrm.d/zz-update-grub:
  53. Generating grub configuration file ...
  54. Found linux image: /boot/vmlinuz-4.10.1-040900rc8-generic
  55. Found initrd image: /boot/initrd.img-4.10.1-040900rc8-generic
  56. done
  57. The link /vmlinuz.old is a damaged link
  58. Removing symbolic link vmlinuz.old
  59. You may need to re-run your boot loader
  60. The link /initrd.img.old is a damaged link
  61. Removing symbolic link initrd.img.old
  62. You may need to re-run your boot loader
  63. Purging configuration files for linux-image-amd64 (3.16.36-1+deb8u2) ...
  64.  
  65. # ================================================
  66. # 最后在看一下内核是否只剩下教程安装的内核。
  67. root@bbr1:~# dpkg -l|grep linux-image | awk '{print $2}'
  68. linux-image-4.10.1-040900-generic

更新 grub 系统引导文件并重启VPS

  1. # 更新系统引导文件
  2. update-grub
  3. # 重启VPS,执行后SSH链接会断开,等十几秒再重新连接继续执行下面的启动命令。
  4. reboot
  1. # VPS提示
  2.  
  3. root@bbr1:~# update-grub
  4. Generating grub configuration file ...
  5. Found linux image: /boot/vmlinuz-4.10.1-040900rc8-generic
  6. Found initrd image: /boot/initrd.img-4.10.1-040900rc8-generic
  7. done

开启bbr

  1. echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
  2. echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
执行这个保存生效更改。
  1. sysctl -p
  1. # VPS提示
  2.  
  3. root@bbr1:~# sysctl -p
  4. net.ipv6.conf.all.accept_ra = 2
  5. net.core.default_qdisc = fq
  6. net.ipv4.tcp_congestion_control = bbr

关闭bbr

  1. sed -i '/net\.core\.default_qdisc=fq/d' /etc/sysctl.conf && sed -i '/net\.ipv4\.tcp_congestion_control=bbr/d' /etc/sysctl.conf
  2. sysctl -p
执行完上面的代码,就使用reboot重启VPS后才能关闭bbr,重启后再用下面的查看bbr状态代码,查看是否关闭了。
  1. reboot

查看bbr是否开启

执行下面命令,如果结果中有bbr,即证明你的内核已开启bbr。
  1. sysctl net.ipv4.tcp_available_congestion_control
执行下面命令,看到有 tcp_bbr 模块,即说明bbr已启动
  1. lsmod | grep bbr
  1. # VPS提示
  2. root@bbr1:~# sysctl net.ipv4.tcp_available_congestion_control
  3. net.ipv4.tcp_available_congestion_control = bbr cubic reno
  4.  
  5. # ================================================
  6.  
  7. root@bbr1:~# lsmod | grep bbr
  8. tcp_bbr 20480 0

卸载BBR

BBR集成于内核中,所以卸载BBR=更换内核,教程:
“Debian更换内核教程 —— 4.10.x(BBR) 降低内核版本为 支持锐速的内核”

裸 SS/锐速+SS/BBR+SS 速度对比

本人的测试环境是:晚上23:00点,联通运营商,美国渣渣VPS。
各个地区和运营商都存在差别,我的测试 速度对比仅供参考。
因为是半夜测试的,再加上用的美国垃圾小鸡,所以 裸SS的速度感人。
使用 锐速+SS 后,单线程下载测速,翻了十倍,Youtube 也能看 1080P流畅 了。
换成 BBR+SS 后,单线程又在 锐速+SS 的基础上翻了一倍,Youtube 速度有上升了一个档次 1440P 倒是勉强,1080P可以随便拖拉了。
虽然 Youtube 的数值不是很准,但是还是有点用的,数值太低同样也代表速度不行。

总其以上,锐速(ServerSpeed)的技术已经成熟、定型,加速效果还是不错的,但是不再更新和维护了。
而 TCP-BBR 属于新生的技术,处于开发初期,买没有完善成熟,未来的潜力相信还好更好。
所以总的来说:非折腾党,还是建议先使用锐速观望 TCP-BBR 一段时间,这是最稳妥的办法。

裸 SS



锐速+SS



BBR+SS



本文章安装步骤来自:https://github.com/iMeiji/shadowsocks_install/wiki/开启TCP-BBR拥塞控制算法
-------------

Debian更换内核教程 —— 4.10.x(BBR) 降低内核版本为 支持锐速的内核

前段时间BBR出世后,很多人都去尝鲜了,有的人觉得比锐速加速效果好,有的觉得不如锐速,总之加速效果不同因素影响都不同。
而因为BBR是集成于内核中的一个功能,所以 卸载BBR=更换内核 ,但是很多人不知道怎么更换,一般都是直接重装系统,以回到支持安装锐速的内核版本,今天有人问我了,于是我就简单研究研究写个手动教程好,并不难。

测试环境

Debian 7 x64 系统,当前内核为 v4.10.1 (支持BBR的最新稳定版内核) 测试通过,Debian 8 暂时没测试(应该差不多的)。
至于其他系统,步骤就完全不一样了,所以不做测试。
OpenVZ不支持更换内核,不支持 锐速和BBR,所以请不要尝试下面的步骤,否则后果自负!

更换步骤

准备工作

添加软件包源 并更新:
  1. echo -e "\ndeb http://ftp.debian.org/debian/ wheezy-backports main" >> /etc/apt/sources.list
  2. apt-get update

安装内核

查询可用内核列表:
  1. aptitude search linux-image | awk '{print $2}'
执行代码后可以看到很多内核版本,我们选择支持锐速的 linux-image-3.2.0-4-amd64 内核,这个内核大部分Debian7 系统都是使用的这个,完美支持锐速和LotServer。
锐速支持的内核看这里:传送门
  1. # VPS提示示例/64位 #
  2. # Debian 7 和 8 可能不一样,还有 64位和32位 内容也不一样。
  3.  
  4. root@debian:~# aptitude search linux-image | awk '{print $2}'
  5. linux-image
  6. linux-image-2.6-amd64
  7. linux-image-3.16.0-0.bpo.4-amd64
  8. linux-image-3.16.0-0.bpo.4-amd64-dbg
  9. linux-image-3.2.0-4-amd64
  10. linux-image-3.2.0-4-amd64-dbg
  11. linux-image-3.2.0-4-rt-amd64
  12. linux-image-3.2.0-4-rt-amd64-dbg
  13. linux-image-4.10.1-041001-generic
  14. linux-image-amd64
  15. linux-image-amd64-dbg
  16. linux-image-rt-amd64
安装内核:
  1. # 示例 #
  2. apt-get -t wheezy-backports install linux-image-3.2.0-4-amd64
  3. # 示例 #
注意:安装内核中,会提示你是否继续 Do you want to continue [Y/n]?  输入 y 并回车继续。
  1. # VPS提示示例/64位 #
  2. # Debian 7 和 8 可能不一样,还有 64位和32位 内容也不一样。
  3.  
  4. root@debian:~# apt-get -t wheezy-backports install linux-image-3.2.0-4-amd64
  5. Reading package lists... Done
  6. Building dependency tree
  7. Reading state information... Done
  8. The following extra packages will be installed:
  9. firmware-linux-free
  10. Suggested packages:
  11. linux-doc-3.2 debian-kernel-handbook
  12. The following NEW packages will be installed:
  13. firmware-linux-free linux-image-3.2.0-4-amd64
  14. 0 upgraded, 2 newly installed, 0 to remove and 85 not upgraded.
  15. Need to get 23.5 MB of archives.
  16. After this operation, 106 MB of additional disk space will be used.
  17. Do you want to continue [Y/n]? y
  18. Get:1 http://sfo1.mirrors.digitalocean.com/debian/ wheezy/main firmware-linux-free all 3.2 [20.7 kB]
  19. Get:2 http://security.debian.org/ wheezy/updates/main linux-image-3.2.0-4-amd64 amd64 3.2.86-1 [23.5 MB]
  20. Fetched 23.5 MB in 5s (4,546 kB/s)
  21. Preconfiguring packages ...
  22. Selecting previously unselected package linux-image-3.2.0-4-amd64.
  23. (Reading database ... 28911 files and directories currently installed.)
  24. Unpacking linux-image-3.2.0-4-amd64 (from .../linux-image-3.2.0-4-amd64_3.2.86-1_amd64.deb) ...
  25. Selecting previously unselected package firmware-linux-free.
  26. Unpacking firmware-linux-free (from .../firmware-linux-free_3.2_all.deb) ...
  27. Setting up linux-image-3.2.0-4-amd64 (3.2.86-1) ...
  28. Running depmod.
  29. Examining /etc/kernel/postinst.d.
  30. run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.2.0-4-amd64 /boot/vmlinuz-3.2.0-4-amd64
  31. update-initramfs: Generating /boot/initrd.img-3.2.0-4-amd64
  32. run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.2.0-4-amd64 /boot/vmlinuz-3.2.0-4-amd64
  33. Generating grub.cfg ...
  34. Found linux image: /boot/vmlinuz-4.10.1-041001-generic
  35. Found initrd image: /boot/initrd.img-4.10.1-041001-generic
  36. Found linux image: /boot/vmlinuz-3.2.0-4-amd64
  37. Found initrd image: /boot/initrd.img-3.2.0-4-amd64
  38. done
  39. Setting up firmware-linux-free (3.2) ...
  40. update-initramfs: deferring update (trigger activated)
  41. Processing triggers for initramfs-tools ...
  42. update-initramfs: Generating /boot/initrd.img-4.10.1-041001-generic

卸载内核

安装内核后,查看当前系统所有内核:
  1. dpkg -l|grep linux-image | awk '{print $2}'
  1. # VPS提示示例/64位 #
  2. # Debian 7 和 8 可能不一样,还有 64位和32位 内容也不一样。
  3.  
  4. root@debian:~# dpkg -l|grep linux-image | awk '{print $2}'
  5. linux-image-3.2.0-4-amd64
  6. linux-image-4.10.1-041001-generic
卸载其余内核:
  1. apt-get purge 其余内核名称
从上面示例中可以看到,除了刚才安装的 linux-image-3.2.0-4-amd64 内核
还有一个内核 linux-image-4.10.1-041001-generic ,我们需要卸载这个内核:
注意:卸载内核中会提示你是否继续 Do you want to continue [Y/n]?  输入 y 并回车继续。
  1. # 示例 #
  2. apt-get purge linux-image-4.10.1-041001-generic
  3. # 示例 #
  1. # VPS提示示例/64位 #
  2. # Debian 7 和 8 可能不一样,还有 64位和32位 内容也不一样。
  3.  
  4. root@debian:~# apt-get purge linux-image-4.10.1-041001-generic
  5. Reading package lists... Done
  6. Building dependency tree
  7. Reading state information... Done
  8. The following packages will be REMOVED:
  9. linux-image-4.10.1-041001-generic*
  10. 0 upgraded, 0 newly installed, 1 to remove and 68 not upgraded.
  11. After this operation, 220 MB disk space will be freed.
  12. Do you want to continue [Y/n]? y
  13. (Reading database ... 32396 files and directories currently installed.)
  14. Removing linux-image-4.10.1-041001-generic ...
  15. WARN: Proceeding with removing running kernel image.
  16. Examining /etc/kernel/postrm.d .
  17. run-parts: executing /etc/kernel/postrm.d/initramfs-tools 4.10.1-041001-generic /boot/vmlinuz-4.10.1-041001-generic
  18. update-initramfs: Deleting /boot/initrd.img-4.10.1-041001-generic
  19. run-parts: executing /etc/kernel/postrm.d/zz-update-grub 4.10.1-041001-generic /boot/vmlinuz-4.10.1-041001-generic
  20. Generating grub.cfg ...
  21. Found linux image: /boot/vmlinuz-3.2.0-4-amd64
  22. Found initrd image: /boot/initrd.img-3.2.0-4-amd64
  23. done
  24. The link /vmlinuz.old is a damaged link
  25. Removing symbolic link vmlinuz.old
  26. you may need to re-run your boot loader[grub]
  27. The link /initrd.img.old is a damaged link
  28. Removing symbolic link initrd.img.old
  29. you may need to re-run your boot loader[grub]
  30. Purging configuration files for linux-image-4.10.1-041001-generic ...
  31. Examining /etc/kernel/postrm.d .
  32. run-parts: executing /etc/kernel/postrm.d/initramfs-tools 4.10.1-041001-generic /boot/vmlinuz-4.10.1-041001-generic
  33. run-parts: executing /etc/kernel/postrm.d/zz-update-grub 4.10.1-041001-generic /boot/vmlinuz-4.10.1-041001-generic

结尾工作

清除上面添加的 软件包源:
  1. sed -i '/wheezy-backports/d' /etc/apt/sources.list
关闭 BBR:
  1. sed -i '/net\.core\.default_qdisc=fq/d' /etc/sysctl.conf && sed -i '/net\.ipv4\.tcp_congestion_control=bbr/d' /etc/sysctl.conf
  2. sysctl -p
  3. # 清除BBR启动代码并保存,执行并不会提示任何信息。
更新 grub 系统引导文件并重启VPS
  1. update-grub
  2. # reboot是重启代码
  3. reboot
  1. # VPS提示示例/64位 #
  2. # Debian 7 和 8 可能不一样,还有 64位和32位 内容也不一样。
  3.  
  4. root@debian:~# update-grub
  5. Generating grub.cfg ...
  6. Found linux image: /boot/vmlinuz-3.2.0-4-amd64
  7. Found initrd image: /boot/initrd.img-3.2.0-4-amd64
  8. done
 --------------------

『原创』Debian/Ubuntu TCP拥塞控制技术 ——TCP-BBR 一键安装脚本

注意:TCP-BBR和锐速一样,不支持Openvz,查看本教程之前,请先确定你的VPS的虚拟化技术!
注意:本教程涉及到VPS更换内核,所以如果步骤错误,或者VPS不兼容最新的内核,会导致无法开机等错误,请勿用于生产环境!!!!

BBR 简单介绍

BBR 是一个由谷歌社区开发的 TCP拥塞控制技术,目前处于开发初期,但是前景很棒,大家可以持续关注,同时BBR是集成与Linux最新版本的内核中的。
具体什么是TCP拥塞控制技术,详细的我也不懂,我就用通俗一点的话解释一下,不一定准确,看一看理解一下就好了.
原始的TCP流量传输技术,流量管理很乱,我们把 TCP流量比喻成 公路上的汽车流量,而TCP传输隧道就是 公路,那么:
在原始的TCP流量传输中,一条十字路口公路,很多车流量,但是却没有红绿灯和交警,导致大家左挤右挤的堵车了,这就是没有合理的管理导致的。
而BBR和锐速等TCP流量控制技术,就是红绿灯+交警,他们就是在无人管理的十字路口,去合理指挥分配车流量,然后最大化的利用车流量,保证路面畅通.

系统要求

Debian / Ubuntu 14.04 +
本脚本只在 Debian 7 / Debian 8 / Ubuntu 14.04 / Ubuntu 16.04 (均 x64位) 这几个系统中测试过脚本可以正常运行(Vultr)!
强烈推荐 Debian 7 x64,这个是我一直使用的系统,我的脚本在这个系统上面出错率最低。
至于为什么不支持 CentOS 等系统,主要是我不怎么用其他的系统,就不做支持了。

脚本版本

Ver: 1.0.11

安装步骤

更换内核需要ROOT权限,所以如果你是普通用户 的话,需要ROOT账号权限,如果你是ROOT账号,那就忽略这个步骤
  1. sudo su
输入并回车后,会提示让你输入当前账号的密码,输入并回车后就可以继续下面的步骤了:
  1. wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/bbr.sh && chmod +x bbr.sh && bash bbr.sh
下载并运行脚本后,会自动检测并开始安装,首先会提示你输入要下载的内核版本,可以安装自定义版本的内核,也可以直接回车安装最新版本的内核内核版本获取)!
  1. 请输入 要下载安装的Linux内核版本(BBR) [ 格式: x.xx.xx ,例如: 4.10.12 ]
  2. [注意]内核版本列表请去这里获取:[ http://kernel.ubuntu.com/~kernel-ppa/mainline/ ]
  3. (默认回车,自动获取最新版本):4.10.10
注意:在Debian系统中,删除旧内核时,会提示你是否终止删除内核的行为(如下图),这个需要你选择 <No> (键盘方向键 选择,回车键 确认)。
如果没有出错,内核更换完毕后,会提示是否立即重启VPS,直接回车或者输入 Y
  1. 需要重启VPS后,才能开启BBR,是否现在重启 ? [Y/n] : y
  2. [注意] 重启VPS后,请重新运行脚本开启BBR: bash bbr.sh start
  3.  
  4. [信息] VPS 重启中...
等待十几秒,VPS启动后,重新通过SSH连接VPS,进入 bbr.sh 脚本的目录,然后执行下面这个命令开启BBR。
  1. bash bbr.sh start
然后就会自动开启BBR。
如果重启VPS后,无法连接,说明内核安装或与系统存在兼容性问题,无法正常启动,代表你的VPS当前系统无法使用BBR,请更换其他系统!

使用方法

  1. # 启动BBR,更换/升级内核并重启后,需要执行这个开启BBR!
  2. bash bbr.sh start
  3.  
  4. # 关闭BBR
  5. bash bbr.sh stop
  6.  
  7. # 查看BBR状态
  8. bash bbr.sh status
  9.  
  10. # 升级BBR
  11. bash bbr.sh
  12. # 因为BBR是集成于内核中的,只是内核中的一部分,所以不一定要更新最新的内核,因为内核升级不一定是BBR升级。
注意:关闭BBR,需要重启VPS,所以脚本会提醒是否立即重启VPS。

卸载BBR

BBR集成于内核中,所以卸载BBR=更换内核.

其他说明

注意:TCP-BBR必须是 2016-12-05 21:00 更新的 4.9.0-rc8 内核及以后的版本 
才能开启,而锐速并不支持这个最新的内核版本,
所以TCP-BBR和锐速是不可能共存的。
 

更换内核后重启服务器无法启动 的问题

如果重启VPS后,无法连接,说明内核安装有问题 或 内核与系统存在兼容性问题,无法正常启动。
这代表你的VPS当前系统不支持最新的内核版本,无法开启BBR,请更换其他系统尝试!

更新日志

2017年05月07日,版本 v1.0.11

1.新增 支持内核 4.11.x 后的版本
—— 已知BUG:获取的版本号是 4.11 ,而安装后本地查到的版本号是 4.11.0 会无法匹配,提示不是最新版本,无视就好。

2017年04月25日,版本 v1.0.10

1.新增 安装内核时 可安装自定义内核版本(可升级/降级)

2017年02月27日,版本 v1.0.9

1.新增 支持内核 4.1x.x 后的版本

2017年01月27日,版本 v1.0.8

1.新增 自动检测最新内核版本功能,
不需要每次内核一更新,脚本也要更新,自动检测代码来自泰迪的BBR脚本:https://teddysun.com/489.html
--------------------

CentOS/Debian/Ubuntu系统 TCP-BBR 一键安装脚本

本脚本适用环境

系统支持:CentOS 6+,Debian 7+,Ubuntu 12+
虚拟技术:OpenVZ 以外的(KVM、Xen、VMware等)
内存要求:≥128M
日期  :2017 年 01 月 13 日

关于本脚本

  1. 本脚本已在 Vultr 上的 VPS 全部测试通过。
  2. 当脚本检测到 VPS 的虚拟方式为 OpenVZ 时,会提示错误,并自动退出安装。
  3. 某些服务商(如 Linode、DigitalOcean)可能需要首先将 VPS 配置为可自定义内核,然后 grub2 的配置才会生效。
  4. 脚本运行完重启发现开不了机的,打开 VPS 后台控制面板的 VNC, 开机卡在 grub 引导, 手动选择内核即可。
  5. 由于是使用最新版系统内核,最好请勿在生产环境安装,以免产生不可预测之后果。

使用方法

使用root用户登录,运行以下命令:
  1. wget -N --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && bash bbr.sh
安装完成后,脚本会提示需要重启 VPS,输入 y 并回车后重启。
重启完成后,进入 VPS,验证一下是否成功安装最新内核并开启 TCP BBR,输入以下命令:
  1. uname -r
  2. # 查看内核版本,含有 4.9.0 就表示 OK 了
  3. # ————————————
  4. sysctl net.ipv4.tcp_available_congestion_control
  5. # 返回值一般为:
  6. # net.ipv4.tcp_available_congestion_control = bbr cubic reno
  7. # ————————————
  8. sysctl net.ipv4.tcp_congestion_control
  9. # 返回值一般为:
  10. # net.ipv4.tcp_congestion_control = bbr
  11. # ————————————
  12. sysctl net.core.default_qdisc
  13. # 返回值一般为:
  14. # net.core.default_qdisc = fq
  15. # ————————————
  16. lsmod | grep bbr
  17. # 返回值有 tcp_bbr 模块即说明bbr已启动。

参考链接:

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/v4.9/

from https://teddysun.com/489.html
---------------

开启TCP BBR拥塞控制算法

注意:不支持OpenVZ vps.

BBR 目的是要尽量跑满带宽, 并且尽量不要有排队的情况, 效果并不比锐速差。
Linux kernel 4.9+ 已支持 tcp_bbr .
下面简单讲述基于KVM架构的VPS如何开启TCP BBR。

Debian 8 / Ubuntu 14

  • 下载最新内核,最新内核查看这里
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.9/linux-image-4.10.9-041009-generic_4.10.9-041009.201704080516_amd64.deb
  • 安装内核
dpkg -i linux-image-4.*.deb
  • 删除旧内核(可选)
dpkg -l|grep linux-image 
apt-get purge 旧内核
  • 更新 grub 系统引导文件并重启
update-grub
reboot

CentOS 6

  • 下载更换内核
    最新内核查看这里
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml -y
  • 查看内核是否安装成功
rpm -qa | grep kernel
  • 删除旧内核(可选)
rpm -ev 旧内核  
  • 更新 grub 系统引导文件并重启
sed -i 's:default=.*:default=0:g' /etc/grub.conf
reboot
开不了机的打开vps后台控制面板的vnc, 开机卡在 grub 引导, 只需要手动选择内核就可以了

CentOS 7

  • 下载更换内核
    最新内核查看这里
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml -y
  • 查看内核是否安装成功
rpm -qa | grep kernel
  • 删除旧内核(可选)
rpm -ev 旧内核  
  • 更新 grub 系统引导文件并重启
egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
grub2-set-default 0  #default 0表示第一个内核设置为默认运行, 选择最新内核就对了
reboot
  • 注意,某些服务商(如Digital Ocean)可能需要首先将VPS配置为可自定义内核,然后grub2的配置才会生效。

开启bbr

开机后 uname -r 看看是不是内核4.9、4.10或4.11
执行 lsmod | grep bbr,如果结果中没有 tcp_bbr 的话就先执行
modprobe tcp_bbr
echo "tcp_bbr" >> /etc/modules-load.d/modules.conf
执行
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
保存生效
sysctl -p
执行
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
如果结果都有bbr, 则证明你的内核已开启bbr.
执行 lsmod | grep bbr, 看到有 tcp_bbr 模块即说明 bbr 已启动 .

from https://github.com/iMeiji/shadowsocks_install/wiki/%E5%BC%80%E5%90%AF-TCP-BBR-%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E7%AE%97%E6%B3%95


开源地址

https://github.com/google/bbr
注意这不是Google官方的产品。

使用必读

不支持OpenVZ虚拟!
安装前需要备份重要数据,安装完可能会导致系统无法启动!
系统无法修改请尝试修改引导!或者重装系统!

安装方式

Debian8/Ubuntu14

  • 下载最新内核,最新内核查看这里
  • 安装内核
  • 删除其余内核
  • 更新 grub 系统引导文件并重启
  • 开启bbr
保存生效 sysctl -p
执行 sysctl net.ipv4.tcp_available_congestion_control
如果结果中有bbr, 则证明你的内核已开启bbr
执行lsmod | grep bbr, 看到有 tcp_bbr 模块即说明bbr已启动。

CentOS7

评论有人已经成功。
1)RMP安装(推荐)
先更新到7.3,安装elrepo官方4.9正式版
YUM 更新
查看内核版本
安装RPM
修改elrepo让yum update可用
把enabled=0改成enabled=1
然后保存之后yum update -y,就会更新到elrepo正式版4.9内核。

开启bbr
加两行:
保存生效 sysctl -p


然后修改系统启动引导文件:
需要修改Grub引导顺序,让新安装的内核作为默认内核。
或者执行:
然后重启
重启后,查看内核是否安装成功。
开启bbr
保存生效 sysctl -p
执行 sysctl net.ipv4.tcp_available_congestion_control
如果结果中有bbr, 则证明你的内核已开启bbr
执行lsmod | grep bbr, 看到有 tcp_bbr 模块即说明bbr已启动。


CentOS6


1)一键安装(推荐)
安装脚本(开源地址:https://github.com/52fancy/GooGle-BBR)
之后重启服务器即可
验证是否安装成功
如果结果显示bbr安装成功。
如果失败,请尝试RMP安装。


2)RMP安装
RMP 地址:https://elrepo.org/linux/kernel

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install -y https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-4.9.0-1.el7.elrepo.x86_64.rpm

安装完成,修改启动引导:
nano  /etc/grub.conf
修改成 default=0
保存然后重启
重启后,查看内核是否安装成功。
开启bbr
据人反馈:先把/etc/sysctl.conf 文件中 关于 net.ipv4.tcp_congestion_control的配置注释掉。
保存生效 sysctl -p
执行 sysctl net.ipv4.tcp_congestion_control
如果结果中有bbr, 则证明你的内核已开启bbr.
执行lsmod | grep bbr, 看到有 tcp_bbr 模块即说明bbr已启动。

-------------


OpenVZ vps下,部署UML,启用BBR,为你单边加速 

本人在 Debian 8 64 位下的 OpenVZ 测试成功( 2.6.32-042stab116.2 内核)。

有问题的朋友请尽量移步论坛: bbs.91yun.org ,在那边你可以得到更多网友和作者的回复! 

请在部署 UML 前仔细阅读主机商的 Terms of Service 和 Acceptable Usage Policy ,以防被封禁主机,由此带来的损失由读者本人承担。 树立国人良好形象,切勿随意争议。

前言

首先要提醒一下 如果本身自己的 OpenVZ 太低配的話,那麼 user-mode linux 跑起來會很艱難:最少 512MB RAM 以上才考慮吧, ( 91yun.org小编注:评论里有访客反馈在 128M 的 NAT 上也跑起来了) 建議配置是 1G RAM 。因為現時 user-mode linux 不支援多核心處理,所以 CPU 數量一個就夠了
user-mode linux 相等放在 VPS 上開一台小小的 virtual machine ,不過不建議用這台 virtual machine 放一些重要的資料,畢竟 user-mode linux 只是設計用來測試新 kernel 的功能,論穩定度還是沒有正常系統好
先去 control panel 打開 TUN/TAP 的功能,如果是 SolusVM 的話通常 setting 就可以看到 TUN/TAP 的設定

前置安裝

apt-get install e2fsprogs uml-utilities screen
ip tuntap add tap0 mode tap
ip addr add 10.0.0.1/24 dev tap0
ip link set tap0 up
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o venet0 -j MASQUERADE

設置 packet forwarding

先留下 port 22 給自己作為 ssh 連線之用.
iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
接下來其餘的 traffic 都可以交給即將出現的子系統:

iptables -t nat -A PREROUTING -i venet0 -j DNAT --to-destination 10.0.0.2
如果不想把所有 port 都交給子系統的話,可以這樣:
iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 10000:20000 -j DNAT --to-destination 10.0.0.2
iptables -t nat -A PREROUTING -i venet0 -p udp --dport 10000:20000 -j DNAT --to-destination 10.0.0.2
把 10000 到 20000 交給子系統 其他保留給 Host
下載預先設定好的内核,然后解壓縮:
wget http://soft.91yun.org/uml/32/uml.tar.xz #32位系统下载该压缩包
wget http://soft.91yun.org/uml/64/uml.tar.xz #64位系统下载该压缩包
tar xvJf uml.tar.xz
cd uml #即最新版本解压的文件夹,注意看上一行解压缩的路径.
解压缩开的內有兩個是文件:一個是 vmlinux (kernel) ,一個是 rootfs (filesystem image) ,而整個最簡單系統就是放在 rootfs 內,這個系統為了方便,已經設定好網路設定,想要改的話只要打開 /etc/network/interfaces 就好。
因為 rootfs 一開始只有 300MB 放了系統就幾乎沒容量,先擴大 image 的容量吧:
resize2fs rootfs 5G
不一定是 5G ,可以換成你喜歡的大小。有的时候要运行下 e2fsck -f rootfs

打開 user-mode linux

./vmlinux ubda=rootfs eth0=tuntap,tap0 mem=256m
256m 是分配給 user-mode linux 的 RAM 大小,如果要跑梯子的話,還是建議有 256m 為佳,這就是為什麼會建議有 1GB RAM 的原因,如果分配太多 RAM 給 user-mode linux ,那麼 Host 就跑不動了,但如果分配太少 RAM 給 user-mode linux ,那麼 user-mode linux 就會很容易當機。
打開後先等一下,等到出現以下的內容:
Virtual console 3 assigned device '/dev/pts/1'
Virtual console 4 assigned device '/dev/pts/2'
Virtual console 5 assigned device '/dev/pts/3'
Virtual console 6 assigned device '/dev/pts/4'
Virtual console 2 assigned device '/dev/pts/5'
Virtual console 1 assigned device '/dev/pts/6'
/dev/pts/X 就是 user-mode linux 放 virtual console 的地方,隨便記下來一個,這個 terminal 先不要關( 91yun 小编注:如果想关掉 ssh 后继续保持 uml 的运行,请看下面 tips 的第二条。
打開新的 terminal 開新的 ssh 到機器.
screen /dev/pts/1
這時應該是發現 terminal 什麼都沒有,只要按一下 Enter ,就會出現登入提示了
login 是 root
而密碼是 91yun.org
在登入之後記得要改密碼
在進入之後會發現 …. 這個系統真的什麼都沒有,連 python 都沒有!這樣連 SSR 也跑不起來呀!
不過可以先跑一下指令
sysctl net.ipv4.tcp_available_congestion_control
看到以下這段就代表有 BBR 了:
net.ipv4.tcp_available_congestion_control = bbr reno cubic highspeed
要離開的話 user-mode linux 的話:
按 ctrl-a d
就可以離開了.
要再進去的話就用
screen -r
這樣就會例出所有 Detached 的 screen
例如 :
There are several suitable screens on:
1007.pts-7.localhost (02/24/17 10:59:14) (Detached)
這時只要用:
screen -r 1007.pts-7.localhost
就可以重新進入到離開的 screen 。如果想要關掉 user-mode linux 的話,建議還是用 screen 進入到 user-mode linux ,用 shutdown now 去關掉,不建議在 host 上用 kill 把 uml process 關閉,因為這等同於 hard shutdown

tips:

1. 暫時 user-mode linux 並沒有多核心支援,所以就算 host 有多於一個核心也不會對 user-mode linux 有影響
2. 利用./vmlinux ubda=rootfs eth0=tuntap,tap0 mem=256m &可以把 user-mode linux 放到背景.
3. 一台 VZ 可以開多台 user-mode linux ,不過如果本身機器不夠強,就不要亂試了。
4. 可以為 user-mode linux 安一個 openssh ,那麼就可以由 Host 上傳文件到 user-mode linux 了, user-mode linux 也可以連回去host拿文件.

-------------

OpenVZ VPS安装User-mode Linux实现Google BBR加速

前言

为啥要装 BBR?据说适合国情。主要目的还是练习 User-mode Linux (UML)。


安装 UML

先装工具链:
sudo apt-get install build-essential libncurses5-dev
1
   
sudo apt-get install build-essential libncurses5-dev

因为需要 BBR, 先弄到超前版内核树 net-next,还有对应 UML 的内核配置
cd ~ 
git clone git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 
cd net-next 
make defconfig ARCH=um
也可以 export ARCH=um,方便一些。

配置内核使用 BBR:
make menuconfig ARCH=um

进入配置菜单,进入 Networking support → Networking options → TCP: advanced congestion control 页面,移到 BBR TCP,按两下空格直到变成 <*> BBR TCP。下方 Default TCP congestion control 回车选 BBR。一路 Exit,保存。

make ARCH=um vmlinux -j2 编译。
在 UML 中安装 Arch Linux

基本与在 Ubuntu 下安装新 Arch 一样。
先装一个只读的 rootfs

因为 UML 对 hostfs 的限制,hostfs 一定是只读的,而 OpenVZ 也没有 loop 设备,无法直接挂载磁盘镜像,故我们要先装个只读的 rootfs 来启动 UML, 在 UML 中挂镜像。(Ref:PeterCxy 的 Blog)
# 先下载 Arch 最新的 Bootstrap 包:
cd ~ 
wget http://mirror.rackspace.com/archlinux/iso/latest/archlinux-bootstrap-2016.12.01-x86_64.tar.gz 
tar xzf archlinux-bootstrap-2016.12.01-x86_64.tar.gz 
mv root.x86_64 root 
sudo nano root/etc/resolv.conf 
# 加上一行 nameserver 8.8.8.8,保存
sudo mount --rbind /proc root/proc 
sudo mount --rbind /sys root/sys 
sudo mount --rbind /dev root/dev 
sudo mount -t tmpfs tmpfs root/tmp 
sudo mount --rbind /root root/root 
sudo nano root/etc/pacman.d/mirrorlist 
# 搜索离你最近的国家镜像,去掉对应的注释
# 进入 chroot
sudo root/bin/arch-chroot root /bin/bash 
# 此时已经进入 chroot 环境
pacman-key --init 
pacman-key --populate archlinux 
# 安装基础系统
pacman -Sy base 
# 改控制台,也可以不改,通过 screen 连接 pts
systemctl enable getty@tty0 
systemctl disable getty@tty1 
# 退出 chroot
exit 
# 解除 rbind
sudo umount root/{dev,proc,sys,tmp}

   
# 先下载 Arch 最新的 Bootstrap 包:
cd ~ 
wget http://mirror.rackspace.com/archlinux/iso/latest/archlinux-bootstrap-2016.12.01-x86_64.tar.gz 
tar xzf archlinux-bootstrap-2016.12.01-x86_64.tar.gz 
mv root.x86_64 root 
sudo nano root/etc/resolv.conf 
# 加上一行 nameserver 8.8.8.8,保存
sudo mount --rbind /proc root/proc 
sudo mount --rbind /sys root/sys 
sudo mount --rbind /dev root/dev 
sudo mount -t tmpfs tmpfs root/tmp 
sudo mount --rbind /root root/root 
sudo nano root/etc/pacman.d/mirrorlist 
# 搜索离你最近的国家镜像,去掉对应的注释
# 进入 chroot
sudo root/bin/arch-chroot root /bin/bash 
# 此时已经进入 chroot 环境
pacman-key --init 
pacman-key --populate archlinux 
# 安装基础系统
pacman -Sy base 
# 改控制台,也可以不改,通过 screen 连接 pts
systemctl enable getty@tty0 
systemctl disable getty@tty1 
# 退出 chroot
exit 
# 解除 rbind
sudo umount root/{dev,proc,sys,tmp}

此时在 root 文件夹下就有了完整的 rootfs,可以启动 UML 了。
设置网络

首先在主机商的面板(SolusVM)打开 TUN/TAP 功能。一般能做 VPN(PPTP、L2TP等) 的 VPS 都有这个选项。

之后配置 TAP 设备:
sudo ip tuntap add tap0 mode tap 
sudo ip addr add 10.0.0.1/24 dev tap0 
sudo ip route add default via 10.0.0.1 dev venet0:0 
sudo ip link set tap0 up 
sudo iptables -P FORWARD ACCEPT 
sudo iptables -t nat -A POSTROUTING -o venet0:0 -j MASQUERADE

   
安装 Arch 到镜像
cd ~/net-next 
dd if=/dev/zero of=rootfs.img bs=1MB count=6000 # 创建一个 6GB 的镜像 
mount -o remount,size=2G /dev/shm # 改一下 tmpfs 大小,防止爆内存

# 启动到 UML
sudo ./vmlinux root=/dev/root rootfstype=hostfs hostfs=./root ubd0=rootfs.img eth0=tuntap,tap0 mem=256m

cd ~/net-next 
dd if=/dev/zero of=rootfs.img bs=1MB count=6000 # 创建一个 6GB 的镜像 
mount -o remount,size=2G /dev/shm # 改一下 tmpfs 大小,防止爆内存

mem 是内存大小,此处取 256M(可以根据你的内存情况修改)。
此时已经有 UML 的 shell,可以开始安装系统了。用户名 root,没有密码。
ip link set eth0 up 
ip addr add 10.0.0.2/24 dev eth0 
ip route add default via 10.0.0.1 dev eth0

# 制作文件系统
mkfs.ext4 /dev/ubda 
mount /dev/ubda /mnt 
mkdir -p /mnt/var/lib/pacman 
pacman -Sy base -r /mnt 
pacman -Sy havaged -r /mnt # entropy 生成器

mount --rbind /proc /mnt/proc 
mount --rbind /sys /mnt/sys 
mount --rbind /dev /mnt/dev 
mount -t tmpfs tmpfs /mnt/tmp 
mount --rbind /root /mnt/root

chroot /mnt /bin/bash 
nano /etc/pacman.d/mirrorlist # mirrorlist

   
ip link set eth0 up 
ip addr add 10.0.0.2/24 dev eth0 
ip route add default via 10.0.0.1 dev eth0

# 制作文件系统
mkfs.ext4 /dev/ubda 
mount /dev/ubda /mnt 
mkdir -p /mnt/var/lib/pacman 
pacman -Sy base -r /mnt 
pacman -Sy havaged -r /mnt # entropy 生成器

mount --rbind /proc /mnt/proc 
mount --rbind /sys /mnt/sys 
mount --rbind /dev /mnt/dev 
mount -t tmpfs tmpfs /mnt/tmp 
mount --rbind /root /mnt/root

chroot /mnt /bin/bash 
nano /etc/pacman.d/mirrorlist # mirrorlist

编辑网络配置:
nano /etc/systemd/network/50-static.network
1
   
nano /etc/systemd/network/50-static.network

加入
[Match]
Name=eth0

[Network]
Address=10.0.0.2/24 
Gateway=10.0.0.1

 
同上,enable 各项服务,配置 时区、locale 等:
sudo nano root/etc/resolv.conf 
# 加上一行 nameserver 8.8.8.8,保存

systemctl enable systemd-networkd 
systemctl enable getty@tty0 
systemctl disable getty@tty1

ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
sed -i 's/#en_US.UTF/en_US.UTF/' /etc/locale.gen 
locale-gen 
echo 'LANG=en_US.UTF-8' > /etc/locale.conf 
echo 'umlarch' > /etc/hostname # 配置主机名 
nano /etc/hosts # 加入 127.0.1.1 umlarch.localdomain umlarch 
mkinitcpio -p linux # 应该不需要,以防万一 
genfstab -U /mnt >> /mnt/etc/fstab # fstab 
shutdown -h 0 # 关闭 UML

sudo nano root/etc/resolv.conf 
# 加上一行 nameserver 8.8.8.8,保存

systemctl enable systemd-networkd 
systemctl enable getty@tty0 
systemctl disable getty@tty1

ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
sed -i 's/#en_US.UTF/en_US.UTF/' /etc/locale.gen 
locale-gen 
echo 'LANG=en_US.UTF-8' > /etc/locale.conf 
echo 'umlarch' > /etc/hostname # 配置主机名 
nano /etc/hosts # 加入 127.0.1.1 umlarch.localdomain umlarch 
mkinitcpio -p linux # 应该不需要,以防万一 
genfstab -U /mnt >> /mnt/etc/fstab # fstab 
shutdown -h 0 # 关闭 UML

现在配置已经基本完成,改变一下命令行,从新建的镜像启动:
sudo ./vmlinux root=/dev/ubda ubd0=rootfs.img eth0=tuntap,tap0 mem=256m 
pacman-key --init 
pacman-key --populate archlinux

  搞定。
配置端口转发

先给自己留下 SSH 端口~
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN

然后其他的端口全转发走啦:
sudo iptables -t nat -A PREROUTING -i venet0 -j DNAT --to-destination 10.0.0.2

安装 shadowsocks-go
做了 AUR 源,见 https://github.com/ProfFan/shadowsocks-go 。
Clone 后 makepkg -si 即可。

Updates

无法进入 chroot

关于unshare问题,参见 here
关于 Arch 的 chroot 环境配置,请参考官方文档

配置中无此选项

BBR 已经进入 4.9 内核树,直接 clone 官方的 master 分支(git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git)即可。

Reference

https://vincent.bernat.im/en/blog/2011-uml-network-lab.html
http://sylphy.hatenablog.jp/entry/2016/06/23/223449
https://github.com/PeterCxy/Blog/blob/master/_posts/tech/2015-12-12-user-mode-linux-in-openvz.md
https://wiki.archlinux.org/index.php/Installation_guide#Installation
https://wiki.archlinux.org/index.php/Pacman/Package_signing#Initializing_the_keyring
本文转自: https://blog.amayume.net/openvz-vps-an-zhuang-user-mode-linux-yi-shi-xian-bbr-yong-sai-kong-zhi/
---------------

OpenVZ下开启BBR拥塞控制


在OpenVZ(须TUN/TAP支持)环境中通过UML(User Mode Linux)开启BBR。
1,制作Alpine Linux镜像
在KVM的Debian 8上制作需要使用的镜像。
关于Alpine Linux,详情查看其官网
首先写一个ext4格式的空镜像,打上ROOT的标签,方便写fstab。然后挂载到alpine目录下
1
2
3
4
dd if=/dev/zero of=alpine_mini bs=1M count=150
mkfs.ext4 -L ROOT alpine_mini
mkdir alpine
mount -o loop alpine_mini alpine
这里Alpine Linux版本选择3.5,下载相应的apk tool,把基本的系统写入到空镜像中
1
2
3
4
5
6
7
8
9
10
11
REL="v3.5"
REL=${REL:-edge}
MIRROR=${MIRROR:-http://nl.alpinelinux.org/alpine}
REPO=$MIRROR/$REL/main
ARCH=$(uname -m)
ROOTFS=${ROOTFS:-alpine}
APKV=`curl -s $REPO/$ARCH/APKINDEX.tar.gz | tar -Oxz | grep -a '^P:apk-tools-static$' -A1 | tail -n1 | cut -d: -f2`
mkdir tmp
curl -s $REPO/$ARCH/apk-tools-static-${APKV}.apk | tar -xz -C tmp sbin/apk.static
tmp/sbin/apk.static --repository $REPO --update-cache --allow-untrusted --root $ROOTFS --initdb add alpine-base
printf '%s\n' $REPO > $ROOTFS/etc/apk/repositories
接下来最重要的是写分区表,将下面的东西写入到alpine/etc/fstab文件中
1
2
3
4
5
#
# /etc/fstab: static file system information
#
# <file system>   <dir> <type>    <options> <dump>    <pass>
LABEL=ROOT / auto defaults 1 1
其他的配置,都可以进入镜像后再操作。
由于宿主机里面本身就有go版本的ss了,直接从系统里面复制一下,配置里面修改个端口就行了。
1
2
3
mkdir alpine/etc/shadowsocks-go
cp /usr/local/bin/ss-goserver alpine/usr/local/bin
cp /etc/shadowsocks-go/config.json alpine/etc/shadowsocks-go
如果没有,可以直接去官网下载最新版
顺便修改下alpine/etc/sysctl.conf,配合ss优化一番。
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
# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096
# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1
#BBR
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
镜像设定完毕后,卸载掉镜像。
1
umount ./alpine
2,制作UML的可执行文件vmlinux
安装依赖
1
apt-get install build-essential libncurses5-dev bc screen
在https://www.kernel.org/上找到需要的内核。
这里以4.10.1内核为例。
1
2
3
4
5
6
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.10.1.tar.xz
tar xf linux-4.10.1.tar.xz
rm linux-4.10.1.tar.xz
cd linux-4.10.1
make defconfig ARCH=um
make menuconfig ARCH=um
在配置菜单中,除了把TCP_BBR选上,还要保证内核支持net.ipv4.tcp_syncookies和net.core.default_qdisc选项。
通过按空格来选择项目,只有*状态才是构建,下面是基本的内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UML-specific options
    ==> [*] Force a static link
Device Drivers
    ==> [*] Network device support
        ==> <*> Universal TUN/TAP device driver support
[*] Networking support
    ==> Networking options
        ==> [*] IP: TCP syncookie support
        ==> [*] TCP: advanced congestion control
            ==> <*> BBR TCP
            ==> <*> Default TCP congestion control (BBR)
        ==> [*] QoS and/or fair queueing
            ==> <*> Quick Fair Queueing scheduler (QFQ)
            ==> <*> Controlled Delay AQM (CODEL)
            ==> <*> Fair Queue Controlled Delay AQM (FQ_CODEL)
            ==> <*> Fair Queue
配置完成后开始构建以及可执行文件减肥
1
2
make ARCH=um vmlinux
strip -s vmlinux
3,在UML中配置Apline Linux
为了让Apline Linux有网可用,外部网络可穿透9000-19000端口到内部,要在宿主机上开启tap,设置iptables
1
2
3
4
5
6
7
D_I=`ip route show 0/0 sort -k 7 | head -n 1 | sed -n 's/^default.* dev \([^ ]*\).*/\1/p'`
sudo ip tuntap add tap0 mode tap 
sudo ip addr add 10.0.0.1/24 dev tap0 
sudo ip link set tap0 up 
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -o ${D_I} -j MASQUERADE
sudo iptables -t nat -A PREROUTING -i ${D_I} -p tcp --dport 9000:19000 -j DNAT --to-destination 10.0.0.2
然后,开启镜像
1
sudo ./vmlinux ubda=alpine_mini rw eth0=tuntap,tap0 mem=64m
通过screen命令来操作小虚拟机,下面的X,根据具体情况修改。
1
screen /dev/pts/X
系统默认下,root用户没有密码。系统中,可以执行setup-alpine命令来一步一步配置系统。
需要注意的是网络设定,Ip address for eth0=10.0.0.2,gateway=10.0.0.1,netmask=255.255.255.0,DNS nameserver=8.8.8.8。
其他的根据自己需要来设定。
开机自启的网络有bug,需要重新启动网络才可用。
这里选择设定开机自启动脚本来简单修复下。
1
rc-update add local default
索性加入swapfile和ss的开机自启动,先创建swapfile
1
2
dd if=/dev/zero of=/swapfile bs=1M count=64
chmod 600 /swapfile
然后用vi编辑/etc/local.d/my.start文件
1
2
3
4
5
6
7
8
9
#!/bin/sh
# swap on
/sbin/mkswap /swapfile
/sbin/swapon /swapfile
# fix net
sleep 3
/etc/init.d/networking restart
# ss
/usr/bin/nohup /usr/local/bin/ss-goserver -c /etc/shadowsocks-go/config.json > /dev/null 2>&1 &
不要忘了加上可写的权限
1
chmod +x /etc/local.d/my.start
最后,reboot一下看看配置是否都生效了。
如果需要安装其他的软件的话,例如curl,可以使用它提供的包管理软件apk
1
apk add curl
4,总结
实际上镜像和vmlinux只需要做一遍,在其他的64位linux系统上,配置好tap和转发,再次复用它们即可。
那个fix net,sleep 3可以用
rc-update add networking
不过还是得加
/etc/init.d/networking restart
from https://www.fanyueciyuan.info/jsxj/OpenVZ_BBR_UML_Alpine_Linux.html
-----------

更换内核启用 BBR


BBR 是 Google 开发的 TCP 拥塞控制算法,作为一项新技术可以在代理连接中有效地改善中国鬼畜的网络状况,并可取代过去常被使用的诸多通过暴力发包对网络公平性造成不良影响的单/双边 TCP 加速软件如 ZetaTCP(ServerSpeeder 马甲)、net-speeder、FinalSpeed 等。
BBR 自 Linux kernel 4.9 开始以 mod 的形式集成于内核中,故通常以替换内核的方式达成启用 tcp_bbr 的目的,本文以 KVM 平台下的 Ubuntu 为例说明。

替换内核

在 Ubuntu Kernel 页面下载最新版内核包,本文写作时最新非 RC 版内核为 v4.10.3:
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.3/linux-image-4.10.3-041003-generic4.10.3-041003.201703142331amd64.deb
安装内核:
$ dpkg -i linux-image-*.deb
查看旧内核并将其卸载:
$ dpkg -l | grep linux-image
$ apt purge linux-image-4.4.0-66-generic
刷新 grub 引导并重启:
$ update-grub
$ reboot

启用 tcp_bbr

SSH 连接到主机时检查是否成功更换内核,执行下面命令开启 tcp_bbr:
$ echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
$ echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
$ sysctl -p
完成后执行以下命令检查 tcp_bbr 是否正常启用:
$ sysctl net.ipv4.tcp_available_congestion_control
$ sysctl net.ipv4.tcp_congestion_control
$ lsmod | grep bbr
若均有显示 tcp_bbr 字样则表示 BBR 已经工作。
-------------------------

Google BBR是一个TCP加速优化工具,类似于锐速,可用于优化 TCP 连接。最近一下就火起来了,说明还是有牛逼的地方,咱也别落后,用起来。

GitHub 地址为:https://github.com/google/bbr

仔细看了看,GitHub 主页上有明确的说明“This is not an official Google product.” 说明这其实不是 Google 的官方项目,但是是在 Google 的 GitHub 上,比较奇怪。

为了启用 BBR,如果是 KVM 或者 XEN 架构的 VPS 可以直接更换内核,Kernel 4.9 及以后已经合并了 BBR 的代码。

由于 OpenVZ 不能更换内核,所以只能用其他方式,比如 lkl 或者 uml,可以使用我写的一键安装脚本:

OpenVZ 平台 Google BBR 一键安装脚本

更换内核属于危险操作,请不要用于生产环境,可能会造成无法开机,切记!

至于加速效果,有人反馈比锐速好,有人反馈比锐速弱。我测试后感觉效果还是不错的,由于是 Kernel 官方支持,稳定性绝对有保障。

安装 BBR

1.一键安装脚本

网上有 BBR 的一键安装脚本,来自 @秋水逸冰:

https://teddysun.com/489.html

系统支持:CentOS 6+,Debian 7+,Ubuntu 12+

2.手动安装

Ubuntu x64,可以直接到 Ubuntu 的 ppa 仓库里下载:http://kernel.ubuntu.com/~kernel-ppa/mainline/

网页拉到最后,看最新的内核,当前最新的稳定版是 v4.10.13:http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.13/

下载内核文件:

32位下载:

其他内核版本请去上面的链接寻找。

下载完成之后可以开始安装了:

安装完成之后可以删除多余的内核:

然后更新一下 grub:

请确保至少存在一个内核,要不然会无法启动!!!

重启 vps:

重启之后,查看一下当前的内核:

已经是 4.10 了,现在可以启用 BBR 了:

使配置生效。

然后可以检查一下:

结果里边已经有 BBR 了,说明启用成功。没成功的话,再重启一下 VPS。

Debian 的手动安装方法可以看这里:https://moonagic.com/try-bbr/

from http://web.archive.org/web/20211207082401/https://blog.kuoruan.com/115.html