在本系列的第13部分中,我们解释了通过向内核传递选项来修改系统行为的方法,从而在正在进行的引导过程中使用GRUB。
类似地,您可以在运行中的Linux系统中使用命令行来修改某些运行时内核参数,以进行一次性修改,或通过编辑配置文件进行永久修改。
因此,当由于系统预期操作方式的必要更改而需要时,您可以轻松地在需要时即时启用或禁用内核参数。
介绍/proc文件系统
最新的文件系统层次结构标准规范表明,/proc
代表处理进程和系统信息以及其他内核和内存信息的默认方法。特别地,/proc/sys
是您可以找到有关设备、驱动程序和一些内核特性的所有信息的位置。
/proc/sys
的实际内部结构严重依赖于正在使用的内核,但您可能会在其中找到以下目录。依次,每个目录都将包含其他子目录,其中包含维护每个参数类别值的值:
dev
:连接到机器的特定设备的参数。fs
:文件系统配置(例如配额和inode)。- kernel:内核特定配置。
net
:网络配置。vm
:使用内核的虚拟内存。
要修改内核运行时参数,我们将使用sysctl
命令。可以查看可以修改的确切参数数量:
# sysctl -a | wc -l
如果要查看完整的内核参数列表,只需执行:
# sysctl -a
由于上述命令的输出将包含很多行,我们可以使用管道后跟less来仔细检查它:
# sysctl -a | less
让我们看一下前几行。请注意,每行中的第一个字符与/proc/sys
内部目录的名称匹配:

例如,突出显示的行:
dev.cdrom.info = drive name: sr0
表示sr0
是光驱的别名。换句话说,这就是内核“看到”该驱动器并使用该名称来引用它的方式。
在接下来的部分中,我们将解释如何在Linux中更改其他“更重要”的内核运行时参数。
如何更改或修改Linux内核运行时参数
根据我们迄今为止解释的内容,很容易看出参数的名称与/proc/sys
内部目录结构匹配。
例如:
dev.cdrom.autoclose → /proc/sys/dev/cdrom/autoclose net.ipv4.ip_forward → /proc/sys/net/ipv4/ip_forward
检查Linux内核参数
我们可以使用sysctl
命令加上参数名称或读取相关文件来查看特定Linux内核参数的值:
# sysctl dev.cdrom.autoclose # cat /proc/sys/dev/cdrom/autoclose # sysctl net.ipv4.ip_forward # cat /proc/sys/net/ipv4/ip_forward

设置或修改Linux内核参数
要设置内核参数的值,我们也可以使用sysctl
,但要使用-w
选项,后跟参数的名称、等号和所需值。
另一种方法是使用echo
来覆盖与参数相关联的文件。换句话说,以下方法等效于在系统中禁用数据包转发功能(顺便说一句,这应该是当一个盒子不应该在网络之间传递流量时的默认值):
# echo 0 > /proc/sys/net/ipv4/ip_forward # sysctl -w net.ipv4.ip_forward=0
需要注意的是,使用sysctl
设置的内核参数只在当前会话期间生效,并在系统重新启动时消失。
要永久设置这些值,请编辑/etc/sysctl.conf
并输入所需的值。例如,要在/etc/sysctl.conf中禁用数据包转发,请确保该行出现在文件中:
net.ipv4.ip_forward=0
然后运行以下命令将更改应用到正在运行的配置中。
# sysctl -p
其他重要的内核运行时参数示例如下:
fs.file-max
指定内核可以为系统分配的文件句柄的最大数量。根据系统的预期用途(例如 web / 数据库 / 文件服务器),您可能希望更改此值以满足系统的需求。
打开的文件太多错误消息,甚至可能导致操作系统无法启动。
如果因为无辜的错误而陷入这种情况,请以单用户模式启动(如第13部分 – 配置和故障排除Linux Grub引导加载程序中所述)并按照之前的说明编辑/etc/sysctl.conf。要在每个用户基础上设置相同的限制,请参考本系列的第14部分 – 监视和设置Linux进程限制使用情况。
kernel.sysrq
用于启用键盘上的SysRq键(也称为打印屏幕键),以便允许在系统无响应时触发某些键组合以执行紧急操作。
默认值(16)表示系统将遵守Alt+SysRq+键
组合,并执行sysrq.c文档中列出的操作,该文档可在kernel.org找到(其中键是b-z范围内的一个字母)。例如,Alt+SysRq+b
将强制重新启动系统(如果服务器无响应,请将其用作最后手段)。
警告!请勿在虚拟机上尝试按下此组合键,因为这可能会强制使您的主机系统重新启动!
当设置为1时,net.ipv4.icmp_echo_ignore_all将忽略ping请求并在内核级别丢弃它们。如下图所示 – 请注意在设置此内核参数后ping请求丢失:

A better and easier way to set individual runtime parameters is using .conf files inside /etc/sysctl.d
, grouping them by categories.
例如,我们可以在/etc/sysctl.conf中创建一个名为net.conf
的新文件,而不是设置net.ipv4.ip_forward=0和net.ipv4.icmp_echo_ignore_all=1:
# echo "net.ipv4.ip_forward=0" > /etc/sysctl.d/net.conf # echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.d/net.conf
如果您选择使用这种方法,请不要忘记从/etc/sysctl.conf
中删除相同的行。
摘要
在本文中,我们已经解释了如何使用sysctl,/etc/sysctl.conf和/etc/sysctl.d中的文件修改内核运行时参数,无论是持久性还是非持久性的。
在sysctl文档中,您可以找到有关更多变量含义的更多信息。这些文件代表了关于可以通过sysctl设置的参数的最完整文档来源。
您觉得这篇文章有用吗?我们希望确实如此。如果您有任何问题或建议要改进,请随时告诉我们。
Source:
https://www.tecmint.com/change-modify-linux-kernel-runtime-parameters/