本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
sysctl.d — 在启动时配置内核参数
/etc/sysctl.d/*.conf
/run/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
配置文件的格式是
一系列"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
参数。
sysctl.d/
中的设置将在系统启动的早期被应用。
针对网络接口的配置,
则会在对应的网络接口出现的时候被应用,
具体说来就是 net.ipv4.conf.*
,
net.ipv6.conf.*
,
net.ipv4.neigh.*
,
net.ipv6.neigh.*
参数。
许多 sysctl 参数仅在加载相应的内核模块之后才可用。 因为内核模块是按需动态加载的 (例如在插入新硬件或启动网络时), 所以在系统启动早期运行的 systemd-sysctl.service(8) 无法设置那些依赖于特定内核模块的参数。 对于这些参数, 首选的方法是通过 udev(7) 规则来设置, 次选的方法是将这些模块添加到 modules-load.d(5) 中, 因为 modules-load.d(5) 中的模块会在运行 systemd-sysctl.service(8) 前被无条件的静态加载(参见"例子"小节)。
配置文件依次从
/etc/
, /run/
, /usr/lib/
目录中读取。
配置文件的名称必须符合
格式。
对于不同目录下的同名配置文件,仅以优先级最高的目录中的那一个为准。
具体说来就是:
filename
.conf/etc/
的优先级最高、
/run/
的优先级居中、
/usr/lib/
的优先级最低。
软件包应该将自带的配置文件安装在
/usr/lib/
目录中。
/etc/
目录仅供系统管理员使用。
所有的配置文件(无论位于哪个目录中),
统一按照文件名的字典顺序处理。
如果在多个配置文件中设置了同一个选项,
那么仅以文件名最靠后(字典顺序)的那一个为准。
为了便于排序,建议给所有配置文件
都加上两位十进制数字的文件名前缀。
如果系统管理员想要屏蔽 /usr/lib/
目录中的某个配置文件,
那么最佳做法是在 /etc/
目录中
创建一个指向 /dev/null
的同名符号链接,
即可彻底屏蔽 /usr/lib/
目录中的同名文件。
如果软件包自带的某个配置文件位于 initrd 镜像中,
那么还必须重新生成 initrd 镜像。
例 2. 利用udev规则设置动态内核模块的参数(方法一)
/etc/udev/rules.d/99-bridge.rules
:
ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", \ RUN+="/usr/lib/systemd/systemd-sysctl --prefix=/net/bridge"
/etc/sysctl.d/bridge.conf
:
net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
因为此方法在加载模块的同时设置模块的参数,
所以仅在加载 br_netfilter
模块之后才能过滤桥接包,
若不想过滤桥接包,
只要不加载 br_netfilter
模块即可。
例 3. 利用 modules-load.d 目录设置动态内核模块的参数(方法二)
/etc/modules-load.d/bridge.conf
:
br_netfilter
/etc/sysctl.d/bridge.conf
:
net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
因为此方法总是无条件的加载
br_netfilter
模块,
并且总是无条件的设置模块的参数,
所以总是无条件的过滤桥接包,若不想过滤桥接包,
必须主动卸载 br_netfilter
模块。