Linux系統內核參數的添加方法

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容