sysctl 讀取 / 修改 Kernel 變數

Linux 下的 sysctl 指令可以用作檢視及修改執行中的 Kernel 變數, 例如想其中一個變數的數值, 指令是這樣:

# sysctl kernel.ostype

回傳結果類似這樣:

kernel.ostype = Linux

在 sysctl 後面加上 -a 參數, 會列出所有變數的數值:

# sysctl -a

由於變數很多, 配合 grep 可以更有效找到想要的變數, 例如以下會列出有 “tcp_timeout” 關鍵字的變數:

# sysctl -a | grep tcp_timeout

回傳結果:

net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300

那麼要修改這些 Kernel 的變數, 要在 sysctl 後面加上 -w 參數, 及修改的變數的數值, 例如要開啟 IPv4 的 packet forwading, 便要將 net.ipv4.ip_forward 設定成 1, 指令如下:


# sysctl -w net.ipv4.ip_forward=1

用 sysctl 設定的每個變數, 在重新開機後便會失效, 而只要將變數設定寫入 /etc/sysctl.conf 則可以設定在開機時自動載入 Kernel 變數, 以上面的例子, 開啟 /etc/sysctl.conf:

# vi /etc/sysctl.conf

加入以下一行:

net.ipv4.ip_forward=1

但放在 /etc/sysctl.conf 的設定需要重新啟動系統才會生效, 可以執行以下指令重新載入 /etc/sysctl.conf 的設定:

上面兩個指令的分別是, “sysctl -p” 只會重新載入 /etc/sysctl.conf 的設定, 而 “sysctl –system” 則會重新載入以下所有檔案:

/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf


Leave a Reply