如何以持久性和非持久性方式更改内核运行时参数

在本系列的第13部分中,我们解释了通过向内核传递选项来修改系统行为的方法,从而在正在进行的引导过程中使用GRUB。

类似地,您可以在运行中的Linux系统中使用命令行来修改某些运行时内核参数,以进行一次性修改,或通过编辑配置文件进行永久修改。

因此,当由于系统预期操作方式的必要更改而需要时,您可以轻松地在需要时即时启用或禁用内核参数。

介绍/proc文件系统

最新的文件系统层次结构标准规范表明,/proc代表处理进程和系统信息以及其他内核和内存信息的默认方法。特别地,/proc/sys是您可以找到有关设备、驱动程序和一些内核特性的所有信息的位置。

/proc/sys的实际内部结构严重依赖于正在使用的内核,但您可能会在其中找到以下目录。依次,每个目录都将包含其他子目录,其中包含维护每个参数类别值的值:

  1. dev:连接到机器的特定设备的参数。
  2. fs:文件系统配置(例如配额和inode)。
  3. kernel:内核特定配置。
  4. net:网络配置。
  5. vm:使用内核的虚拟内存。

要修改内核运行时参数,我们将使用sysctl命令。可以查看可以修改的确切参数数量:

# sysctl -a | wc -l

如果要查看完整的内核参数列表,只需执行:

# sysctl -a 

由于上述命令的输出将包含很多行,我们可以使用管道后跟less来仔细检查它:

# sysctl -a | less

让我们看一下前几行。请注意,每行中的第一个字符与/proc/sys内部目录的名称匹配:

Understand Linux /proc Filesystem

例如,突出显示的行:

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
Check Linux Kernel Parameters

设置或修改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请求丢失:

Block Ping Requests in Linux

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=0net.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/