在系统启动时,systemd-sysctl
会根据以下的配置文件读取sysctl
内核参数:
配置文件的格式是一系列"KEY=VALUE"行(每行一对)。
空格和以"#“或”;"开头的行都会被忽略。
在KEY内部,可以使用"/“或”.“作为分隔符。如果第一个分隔符是”/",那么其余的分隔符将保持原样;
如果第一个分隔符是".",那么互换所有的"/“与”.";
例如,kernel.domainname=foo
等价于kernel/domainname=foo
,都会将foo
写入/proc/sys/kernel/domainname
参数中。
同样的,net.ipv4.conf.enp3s0/200.forwarding
等价于net/ipv4/conf/enp3s0.200/forwarding
,都是指/proc/sys/net/ipv4/conf/enp3s0.200/forwarding
参数。
配置文件依次从/etc/,/run/,/usr/lib
目录中读取,配置文件的名称必须符合filename.conf
格式。对于不同目录下的同名配置文件,仅以优先级最高的目录中的那一个为准。
具体说来,就是/etc/
的优先级最高,/run/
的优先级居中,/usr/lib
的优先级最低。
sysctl命令
被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys
中。
它包含一些TCP/IP堆栈和虚拟内存系统的高级选项。
语法如下:
sysctl [options] [variable[=value]] [...]
sysctl -p [file or regexp] [...]
参数与选项:
variable:要读取其值的变量,比如"kernel.ostype",也可以用"/"代替;
variable=value:要设置变量及其相应的值,必须使用变量-w
选项;如果值中含有特殊意义的shell字符或引号,使用双引号进行界定;
-n, --values:显示变量值的同时不显示变量名;
-e, --ignore:忽略不正确的变量名而不报错;
-N, --names:仅显示变量名,常用于脚本中;
-q, --quiet:不在stdout上显示变量值;
-w, --write:修改变量值时使用;
-p[FILE], --load[=FILE]:从指定文件(默认/etc/sysctl.conf)中加载已经设置好的一系列变量值;
如果使用-
作为文件名,那么表示从stdin中读取配置;FILE还可以是一个正则表达式,匹配多个文件;
-a, --all:显示所有当前的变量名;
–deprecated:在–all的输出包含已被反对使用的参数;
-b, --binary:打印值时不添加换行标记;
-r, --pattern:仅应用与正则表达式匹配的文件中的设置;
-h, --help:查看帮助信息;
-V, --version:查看版本信息;
查看所有可读变量:
# sysctl -a
读一个指定的变量,如vm.vfs_cache_pressure
:
# sysctl vm.vfs_cache_pressure
vm.vfs_cache_pressure = 100
要设置一个指定的变量,直接用variable=value
这样的语法:
# sysctl vm.vfs_cache_pressure=200
vm.vfs_cache_pressure = 200
可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。
sysctl变量的设置通常是字符串、数字或者布尔型(布尔型有1
来表示yes
,用0
来表示no
)。
sysctl -w kernel.sysrq=0
sysctl -w kernel.core_uses_pid=1
sysctl -w net.ipv4.conf.default.accept_redirects=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.conf.default.rp_filter=1
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_synack_retries=2
sysctl -w net.ipv4.tcp_keepalive_time=3600
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_sack=1