美文网首页Linux
Linux系统内核参数的添加方法

Linux系统内核参数的添加方法

作者: Allenkevin | 来源:发表于2017-04-24 21:21 被阅读193次

    在Linux系统下,使用sysctl命令可以查看和修改系统参数,但是如果想要添加一个系统参数应该怎么办呢?这篇博客的目的就是要来说这个事的。添加一个系统参数是一件很麻烦的事,大多时候是用来做测试用。

    在ctl_table中注册内核参数

    在source/net/ipv4/sysctl_net_ipv4.c文件中有这样一个结构体数组

    static struct ctl_table ipv4-table[] = {
        ......
    },
    {
        ......
    }
    ......
    

    在目录/proc/sys/net/ipv4/下面所有的系统参数都得先到这里注册,下面给出一个具体例子。

    图1

    这两个参数是拥塞控制算法Vegas在拥塞控制阶段调节cwnd用的,相信很多人都不陌生。
    这里是struct ctl_table的具体定义。

    /* 结构位置:include/linux/sysctl.h */
    struct ctl_table
    {
        const char    *procname;    /* Text ID for /proc/sys, or zero */
        void          *data;
        int           maxlen;
        umode_t       mode;
        struct        ctl_table *child;  /* Deprecated */
        proc_handler  *proc_handler;     /* Callback for text formatting */
        struct ctl_tabel_poll *poll;
        void *extral;
        void *extra2;
    };
    

    现在简单介绍一下这些结构体成员变量。
    *procname 表示在/proc/sys/下显示的文件名称,
    *data 表示对应于内核中的变量名称,
    maxlen 表示允许的最大长度,
    mode 表示访问权限,
    proc_handler表示回调函数,有一些常用取值:
    porc_dointvec 读写包含一个或多个整数的数组,
    proc_dostring 读写一个字符串,
    proc_dointvec_minmax 写的整数必须在min~max范围内。

    声明内核参数

    用于TCP的内核参数在source/include/net/tcp.h声明。

    /* 进入tcp.h文件可以看到大量的变量声明,这里只列出上文提及到的两个变量 */
    ...
    extern int sysctl_tcp_vegas_alpha;
    extern int sysctl_tcp_vegas_beta
    ...
    

    定义内核参数

    内核参数的定义可能在不同的文件中,这个根据内核参数的用途而定。
    systcl_tcp_vegas_alpha和sysctl_tcp_vegas_beta这两个变量的定义位置:
    source/net/ipv4/tcp_retrans.c

    int sysctl_tcp_vegas_alpha = 2;
    int sysctl_tcp_vegas_beta = 4;
    

    经过上面这些步奏,内核参数就添加成功了,但我们编译重启系统后,就会发现在目录:/proc/sys/net/ipv4/下有两个文件分别是tcp_vegas_alpha和tcp_vegas_beta,以后就可以通过echo命令动态修改这两个值了。

    相关文章

      网友评论

        本文标题:Linux系统内核参数的添加方法

        本文链接:https://www.haomeiwen.com/subject/pzxmzttx.html