网站搜索

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


在本 LFCS(Linux 基金会认证系统管理员)系列的第 13 部分中,我们解释了如何使用 GRUB 通过将选项传递给内核以进行正在进行的引导过程来修改系统的行为。

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

因此,当由于系统预期操作方式需要更改而需要时,您可以毫不费力地即时启用或禁用内核参数。

介绍 /proc 文件系统

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

/proc/sys 的实际内部结构在很大程度上取决于所使用的内核,但您可能会在其中找到以下目录。反过来,它们中的每一个都将包含其他子目录,其中维护每个参数类别的值:

  1. dev:连接到机器的特定设备的参数。
  2. fs:文件系统配置(例如配额和索引节点)。
  3. kernel:特定于内核的配置。
  4. net:网络配置。
  5. 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+key组合并执行sysrq.c中列出的操作在 kernel.org 中找到的文档(其中 key 是 b-z 范围内的一个字母)。例如,Alt+SysRq+b 将强制重新启动系统(如果您的服务器没有响应,请将此作为最后的手段)。

警告!请勿尝试在虚拟机上按此组合键,因为它可能会强制您的主机系统重新启动!

当设置为1时,net.ipv4.icmp_echo_ignore_all将忽略 ping 请求并将其丢弃在内核级别。如下图所示 – 请注意设置此内核参数后 ping 请求如何丢失:

设置各个运行时参数的更好、更简单的方法是使用 /etc/sysctl.d 中的 .conf 文件,按类别对它们进行分组。

例如,不要在 /etc/sysctl.conf 中设置 net.ipv4.ip_forward=0net.ipv4.icmp_echo_ignore_all=1,我们可以在 /etc/sysctl.d 中创建一个名为 net.conf 的新文件:

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 设置的参数的最完整的文档来源。

你觉得这篇文章有用吗?我们当然希望你做到了。如果您有任何问题或需要改进的建议,请随时告诉我们。