编译 Linode 内核模块小白教程,以 tcp_hybla 为例 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
interdev
V2EX    Linux

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

  •  1
     
  •   interdev 2014-05-28 23:41:04 +08:00 30823 次点击
    这是一个创建于 4154 天前的主题,其中的信息可能已经有所发展或是发生改变。
    国情原因,中美线路有时掉包率会很高,导致网站访问速度慢,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 ) ...
    第 1 条附言    2015-03-17 22:50:54 +08:00
    Linode 又开始搞促销了,点击以下链接注册新用户,可以送20$。

    https://www.linode.com/?r=96fa2f404c25f017c4a1835f4d4453694cdbfc7e
    45 条回复    2015-10-25 18:23:42 +08:00
    XXOO
        1
    XXOO  
       2014-05-28 23:45:49 +08:00
    不错。感谢。ubuntu14可以用么?
    AstroProfundis
        2
    AstroProfundis  
       2014-05-28 23:46:01 +08:00
    Mark

    不过我现在是自己打包 linux-linode 内核用了...没错我是服务器上用 Arch 的奇葩_(:з∠)_
    https://github.com/AstroProfundis/linux-linode
    interdev
        3
    interdev  
    OP
       2014-05-28 23:53:26 +08:00
    @XXOO 当然可以,注意版本号照做就能编译出来了。
    XXOO div class="fr">     4
    XXOO  
       2014-05-29 00:18:41 +08:00
    @interdev 好的。我应该用哪个版本号,谢谢
    interdev
        5
    interdev  
    OP
       2014-05-29 00:29:43 +08:00
    @XXOO uname -r 显示的就是版本号
    看得懂上面9步所有命令就照做,看不懂最好不要编译,免得搞死了机器。



    一大堆收藏通知...
    只收藏不回复,小心回家打屁股 :)
    XXOO
        6
    XXOO  
       2014-05-29 00:31:03 +08:00
    @interdev 哈哈。谢谢。看懂了。
    XXOO
        7
    XXOO  
       2014-05-29 00:58:23 +08:00
    加了这个:

    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_keepalive_time = 1200
    net.ipv4.ip_local_port_range = 10000 65000
    net.ipv4.tcp_max_syn_backlog = 8192
    net.ipv4.tcp_max_tw_buckets = 5000
    net.core.rmem_max = 67108864
    net.core.wmem_max = 67108864
    net.ipv4.tcp_rmem = 4096 87380 67108864
    net.ipv4.tcp_wmem = 4096 65536 67108864
    net.core.netdev_max_backlog = 250000
    net.ipv4.tcp_mtu_probing = 1
    net.ipv4.tcp_congestion_cOntrol= hybla
    interdev
        8
    interdev  
    OP
       2014-05-29 01:00:55 +08:00
    sysctl net.ipv4.tcp_congestion_control 显示 hybla 就成功了。
    Nin
        9
    Nin  
       2014-05-29 01:06:12 +08:00 via Android
    其实官方文档有篇pvgrub的文章,照着那样做加一句话就行了
    davidyin
        10
    davidyin  
       2014-05-29 01:06:46 +08:00
    这算是黑科技diy么?
    interdev
        11
    interdev  
    OP
       2014-05-29 01:09:12 +08:00
    @Nin 在哪,求请URL
    infong
        12
    infong  
       2014-05-29 01:15:00 +08:00 via Android
    马克,回头试试。。。
    XXOO
        13
    XXOO  
       2014-05-29 03:49:16 +08:00
    我测试了:开启前5m/s,开启后200k/s 看youtube。。。。楼下补充
    marklrh
        14
    marklrh  
       2014-05-29 06:06:26 +08:00
    @XXOO 惨...开启前5MB/S? 啥ISP啊
    rhwood
        15
    rhwood  
       2014-05-29 09:09:27 +08:00
    @Nin 官方文档重新编译ubuntu14.04有点问题的。比如默认压根没装grub,menu.lst照文档写也不对。
    @interdev 改成hybla有多大改善,我改了没什么作用,已经放弃
    zjgood
        16
    zjgood  
       2014-05-29 09:33:18 +08:00 via Android
    正需要,感谢
    pfipdaniel
        17
    pfipdaniel  
       2014-05-29 09:59:06 +08:00
    涨姿势了,第一次知道还有这样的模块,看来是我孤陋寡闻了,回去在自己的DO上试试,看看效果怎么样,话说现在DO上用ss连360p都看不了,郁闷的很。。。
    Nin
        18
    Nin  
       2014-05-29 10:00:12 +08:00
    @interdev https://library.linode.com/custom-instances/pv-grub-custom-compiled-kernel
    @rhwood 那你可以试试楼主的办法,我是在Debian 7的环境下用原内核配置文件编译的,启动一切正常,光是改一个hybla没什么用处,其他的参数也要调整。我改了之后速度大概提升了4倍左右。相反我改成htcp倒是没什么改变。
    mikj
        19
    mikj  
       2014-05-29 10:05:10 +08:00
    32个赞给楼主
    interdev
        20
    interdev  
    OP
       2014-05-29 10:06:46 +08:00   1
    @pfipdaniel DO不用编译,我do上的ubuntu官方内核自带了,用 sysctl net.ipv4.tcp_congestion_cOntrol=hybla 加载即可。
    XXOO
        21
    XXOO  
       2014-05-29 10:15:31 +08:00
    @marklrh 电信
    47jm9ozp
        22
    47jm9ozp  
       2014-05-29 11:28:34 +08:00
    ubuntu直接用官方内核就有hybla,不需要自己编译。。。。

    就是不要用linode提供的内核,用ubuntu提供的
    XXOO
        23
    XXOO  
       2014-05-29 13:00:58 +08:00
    @ooxxcc Linode 官方这么使用官方的内核,谢谢。
    niseter
        24
    niseter  
       2014-05-29 23:41:05 +08:00 via Android
    马克
    47jm9ozp
        25
    47jm9ozp  
       2014-06-14 14:24:01 +08:00
    @XXOO 我是说,ubuntu发行版带的内核有hybla,https://library.linode.com/custom-instances/pv-grub-howto
    xuyuanp
        26
    xuyuanp  
       2014-06-23 12:17:30 +08:00
    请问,archlinux没有hybla模块怎么搞,谢谢
    TrickLin
        27
    TrickLin  
       2014-07-13 13:19:44 +08:00   1
    请教...在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
        28
    interdev  
    OP
       2014-07-13 19:15:26 +08:00
    @TrickLin /lib/modules/3.12.9-x86_64-linode37


    目录不对,应该用自己的内核,不是3.12.9
    TrickLin
        29
    TrickLin  
       2014-07-14 09:24:17 +08:00
    @interdev 我用的就是3.12.9的内核...
    wwwap
        30
    wwwap  
       2014-08-03 09:36:32 +08:00
    @TrickLin
    Same here.
    quericy
        31
    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
        32
    lguan  
       2014-12-12 14:02:41 +08:00
    @TrickLin
    @wwwap
    @quericy

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

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

    弄了两个空文件,然后就没警告信息,就过去了
    magicdog20
        33
    magicdog20  
       2014-12-14 02:09:54 +08:00
    我用的debian,在/etc/modules文件中加入一行tcp_hybla,开机就可以自动载入
    20015jjw
        34
    20015jjw  
       2014-12-26 21:22:07 +08:00
    @lguan 我开机还是无法自动加载。在测试模块的时候一切正常,touch之后depmod -a也执行而没有报错,但是reboot之后输入sysctl net.ipv4.tcp_available_congestion_control依然还是不显示,需要手动加载,很奇怪。我的sysctl.conf似乎也没用。如果能解答就好了,谢谢。
    xings
        35
    xings  
       2015-02-10 14:40:56 +08:00
    @quericy 你们这个问题解决了吗?
    quericy
        36
    quericy  
       2015-02-11 00:19:38 +08:00
    @xings 木~~~~貌似也没什么影响
    jaleo
        37
    jaleo  
       2015-02-16 22:20:44 +08:00
    我测试了,vultr的centos 7系统,默认是支持hybla算法的。启用后发现youtube 4K的速度慢了很多,关闭后正常,粗略地来回测试了几次,最后决定删除net.ipv4.tcp_congestion_cOntrol= hybla这句话。到底什么原因不清楚,或许我单位的网络比较好,本身到vultr节点的质量已经够好了。
    pH
        38
    pH  
       2015-05-01 09:02:45 +08:00
    @jaleo ping一下大概多少,ttl呢?Vultr哪个节点?
    jaleo
        39
    jaleo  
       2015-05-05 09:48:06 +08:00
    @pH time=86ms TTL=45 东京的节点
    pH
        40
    pH  
       2015-05-05 10:51:41 +08:00
    @jaleo 延迟确实比较好。我发现我的也是用hybla性能反而降了。
    604542720
        41
    604542720  
       2015-06-20 19:22:09 +08:00
    @jaleo 谁说vultr centos 7 支持hybla的。。。net.ipv4.tcp_available_congestion_cOntrol= cubic reno
    ljl024
        42
    ljl024  
       2015-06-21 11:48:12 +08:00
    成功了,谢谢
    Domokira
        43
    Domokira  
       2015-10-15 15:54:41 +08:00
    大神求助啊,现在用 4.1.5 的最新内核,到 make 再生成编译模块需要的内核报错了,
    kernel/Makefile:135: *** No X.509 certificates found ***
    这是什么原因呢?要怎么解决?
    fly3949
        44
    fly3949  
       2015-10-25 18:08:52 +08:00
    同楼上。。 kernel/Makefile:135: *** No X.509 certificates found ***
    fly3949
        45
    fly3949  
       2015-10-25 18:23:42 +08:00
    @Domokira 已找到原因。需要在$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 这行前面加一个 TAB 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2713 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 09:55 PVG 17:55 LAX 02:55 JFK 05:55
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86