在Linux系統(tǒng)下,使用sysctl命令可以查看和修改系統(tǒng)參數(shù)桃笙,但是如果想要添加一個系統(tǒng)參數(shù)應該怎么辦呢彻采?這篇博客的目的就是要來說這個事的。添加一個系統(tǒng)參數(shù)是一件很麻煩的事瘫拣,大多時候是用來做測試用亿絮。
在ctl_table中注冊內核參數(shù)
在source/net/ipv4/sysctl_net_ipv4.c文件中有這樣一個結構體數(shù)組
static struct ctl_table ipv4-table[] = {
......
},
{
......
}
......
在目錄/proc/sys/net/ipv4/下面所有的系統(tǒng)參數(shù)都得先到這里注冊,下面給出一個具體例子麸拄。
這兩個參數(shù)是擁塞控制算法Vegas在擁塞控制階段調節(jié)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;
};
現(xiàn)在簡單介紹一下這些結構體成員變量蒂萎。
*procname 表示在/proc/sys/下顯示的文件名稱,
*data 表示對應于內核中的變量名稱淮椰,
maxlen 表示允許的最大長度五慈,
mode 表示訪問權限帮毁,
proc_handler表示回調函數(shù),有一些常用取值:
porc_dointvec 讀寫包含一個或多個整數(shù)的數(shù)組豺撑,
proc_dostring 讀寫一個字符串烈疚,
proc_dointvec_minmax 寫的整數(shù)必須在min~max范圍內。
聲明內核參數(shù)
用于TCP的內核參數(shù)在source/include/net/tcp.h聲明聪轿。
/* 進入tcp.h文件可以看到大量的變量聲明爷肝,這里只列出上文提及到的兩個變量 */
...
extern int sysctl_tcp_vegas_alpha;
extern int sysctl_tcp_vegas_beta
...
定義內核參數(shù)
內核參數(shù)的定義可能在不同的文件中,這個根據(jù)內核參數(shù)的用途而定陆错。
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;
經過上面這些步奏灯抛,內核參數(shù)就添加成功了,但我們編譯重啟系統(tǒng)后音瓷,就會發(fā)現(xiàn)在目錄:/proc/sys/net/ipv4/下有兩個文件分別是tcp_vegas_alpha和tcp_vegas_beta对嚼,以后就可以通過echo命令動態(tài)修改這兩個值了。