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

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

在ctl_table中注册内核参数

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

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

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

Linux系统内核参数的添加方法_第1张图片
图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系统内核参数的添加方法)