编译 Linode 内核模块小白教程,以 tcp_hybla 为例

2014-05-28 23:41:04 +08:00
 interdev
国情原因,中美线路有时掉包率会很高,导致网站访问速度慢,Linux 机器缺省的TCP协议发包算法是cubic,如果改为hybla,在掉包率高时可以大幅提高访问速度;如果cubic只能流畅观看480p的视频,改为hybla则可以流畅观看720p的视频,效果提升是明显的,但很多朋友不会编译内核模块,写个小白教程供大家参考,照以下几步操作一遍,你会发现编译内核模块原来相当简单。

以下教程每行#后面的为需要输入的命令,操作时需要root权限,需要你会使用vi,我的系统是Ubuntu 12.04.2 LTS,其他Linux系统命令不会差别很大,请按自己的情况修改内核名称。
1. 查看你的机器内核版本:
#uname -r
3.11.6-x86_64-linode35

2. 去 https://www.kernel.org/pub/linux/kernel/v3.0/ 下载相同版本的源码到任意目录,解压
#mkdir /root/mykernel
#cd /root/mykernel
#wget https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.11.6.tar.gz
#tar xzvf linux-3.11.6.tar.gz

3. 安装内核编译工具
#apt-get update && apt-get install -y build-essential libncurses5-dev

4. 复制Linode原来的内核编译配置文件到源码根目录,在CONFIG_TCP_CONG_CUBIC=y下面增加一行 CONFIG_TCP_CONG_HYBLA=y,再生成编译模块需要的内核
#cd linux-3.11.6
#zcat /proc/config.gz > .config
#vi .config
查找CONFIG_TCP_CONG_CUBIC=y,在下面增加一行 CONFIG_TCP_CONG_HYBLA=y,保存
#make

5. 耐心等待编译内核完成,单核编译大约需15分钟,完成后,进入模块所在的目录,编写Makefile
#cd net/ipv4/
#mv Makefile Makefile.old
#vi Makefile
以下是Makefle的内容,注意要把KDIR修改为你自己的源码路径,其他则照抄就可以了

# Makefile for tcp_hybla.ko
obj-m := tcp_hybla.o
KDIR := /root/mykernel/linux-3.11.6
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

6.进入源码根目录,编译模块
#cd /root/mykernel/linux-3.11.6/
#make modules

7.进入到模块所在目录,复制生成的 tcp_hybla.ko 到加载目录,测试加载模块
#cd /root/mykernel/linux-3.11.6/net/ipv4
#cp tcp_hybla.ko /root/mykernel/
#cd /root/mykernel/
加载前
#sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno
#insmod tcp_hybla.ko
加载后
#sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno hybla
设置hybal为优先
#sysctl net.ipv4.tcp_congestion_control=hybla

8.设置开机自动加载模块,把tcp_hybla.ko 复制到 /lib/modules/3.11.6-x86_64-linode35/kernel/net/ipv4
#cd /lib/modules/3.11.6-x86_64-linode35
#mkdir -p kernel/net/ipv4
#cd kernel/net/ipv4
#cp /root/mykernel/tcp_hybla.ko ./
#cd /lib/modules/3.11.6-x86_64-linode35
#depmod -a

9.修改/etc/sysctl.conf 开机自动设置hybal为优先
#vi /etc/sysctl.conf
net.ipv4.tcp_congestion_control = hybla

用这9步就可以了,只是动态加载模块,不用更换内核,不用停机重启,不影响网站正常运营,相当方便,值得尝试,参考这个方法可以为 Linode 动态加载任何需要的内核模块,如fastopen,htcp,highspeed 等,有任何问题请到推上找我交流 @interwebdev ,转载请注明出处( http://www.fslk.net/?p=822 ) ...
30295 次点击
所在节点    Linux
45 条回复
XXOO
2014-05-29 10:15:31 +08:00
@marklrh 电信
ooxxcc
2014-05-29 11:28:34 +08:00
ubuntu直接用官方内核就有hybla,不需要自己编译。。。。

就是不要用linode提供的内核,用ubuntu提供的
XXOO
2014-05-29 13:00:58 +08:00
@ooxxcc Linode 官方这么使用官方的内核,谢谢。
niseter
2014-05-29 23:41:05 +08:00
马克
ooxxcc
2014-06-14 14:24:01 +08:00
@XXOO 我是说,ubuntu发行版带的内核有hybla,https://library.linode.com/custom-instances/pv-grub-howto
xuyuanp
2014-06-23 12:17:30 +08:00
请问,archlinux没有hybla模块怎么搞,谢谢
TrickLin
2014-07-13 13:19:44 +08:00
请教...在Ubuntu14.04下编译hybla...执行到第八步报错
root@localhost:/lib/modules/3.12.9-x86_64-linode37# depmod -a
depmod: WARNING: could not open /lib/modules/3.12.9-x86_64-linode37/modules.order: No such file or directory
depmod: WARNING: could not open /lib/modules/3.12.9-x86_64-linode37/modules.builtin: No such file or directory

什么情况...
interdev
2014-07-13 19:15:26 +08:00
@TrickLin /lib/modules/3.12.9-x86_64-linode37


目录不对,应该用自己的内核,不是3.12.9
TrickLin
2014-07-14 09:24:17 +08:00
@interdev 我用的就是3.12.9的内核...
wwwap
2014-08-03 09:36:32 +08:00
@TrickLin
Same here.
quericy
2014-12-01 13:07:13 +08:00
@interdev 我这也是 No such file or directory
用uname -r对着的版本号进的目录啊,求解~(Linode Ubuntu 14.04.1 LTS )

@wwwap @TrickLin 你们解决了吗?
lguan
2014-12-12 14:02:41 +08:00
@TrickLin
@wwwap
@quericy

这个问题我也碰到了,我就到那个目录里面

```
touch modules.order
touch modules.builtin
```

弄了两个空文件,然后就没警告信息,就过去了
magicdog20
2014-12-14 02:09:54 +08:00
我用的debian,在/etc/modules文件中加入一行tcp_hybla,开机就可以自动载入
20015jjw
2014-12-26 21:22:07 +08:00
@lguan 我开机还是无法自动加载。在测试模块的时候一切正常,touch之后depmod -a也执行而没有报错,但是reboot之后输入sysctl net.ipv4.tcp_available_congestion_control依然还是不显示,需要手动加载,很奇怪。我的sysctl.conf似乎也没用。如果能解答就好了,谢谢。
xings
2015-02-10 14:40:56 +08:00
@quericy 你们这个问题解决了吗?
quericy
2015-02-11 00:19:38 +08:00
@xings 木~~~~貌似也没什么影响
jaleo
2015-02-16 22:20:44 +08:00
我测试了,vultr的centos 7系统,默认是支持hybla算法的。启用后发现youtube 4K的速度慢了很多,关闭后正常,粗略地来回测试了几次,最后决定删除net.ipv4.tcp_congestion_control = hybla这句话。到底什么原因不清楚,或许我单位的网络比较好,本身到vultr节点的质量已经够好了。
pH
2015-05-01 09:02:45 +08:00
@jaleo ping一下大概多少,ttl呢?Vultr哪个节点?
jaleo
2015-05-05 09:48:06 +08:00
@pH time=86ms TTL=45 东京的节点
pH
2015-05-05 10:51:41 +08:00
@jaleo 延迟确实比较好。我发现我的也是用hybla性能反而降了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/114788

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX