在Linux系统下,使用sysctl命令可以查看和修改系统参数,但是如果想要添加一个系统参数应该怎么办呢?这篇博客的目的就是要来说这个事的。添加一个系统参数是一件很麻烦的事,大多时候是用来做测试用。
在ctl_table中注册内核参数
在source/net/ipv4/sysctl_net_ipv4.c文件中有这样一个结构体数组
static struct ctl_table ipv4-table[] = {
......
},
{
......
}
......
在目录/proc/sys/net/ipv4/下面所有的系统参数都得先到这里注册,下面给出一个具体例子。
这两个参数是拥塞控制算法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命令动态修改这两个值了。