在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命令動態修改這兩個值了。