如何以持久和非持久的方式更改内核运行时参数
在本LFCS(Linux 基金会认证系统管理员)系列的第 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)表示系统将遵循该组合并执行kernel.org中sysrq.c文档Alt+SysRq+key
中列出的操作(其中 key 是 bz 范围内的一个字母)。例如,将强制重启系统(如果您的服务器没有响应,请将此作为最后的手段)。Alt+SysRq+b
警告!不要尝试在虚拟机上按下此组合键,因为它可能会强制主机系统重新启动!
当设置为1时,net.ipv4.icmp_echo_ignore_all将忽略 ping 请求并在内核级别丢弃它们。如下图所示 - 请注意设置此内核参数后 ping 请求如何丢失:
设置单个运行时参数的更好、更简单的方法是使用内部的.conf文件/etc/sysctl.d
,并按类别对其进行分组。
例如,我们可以在/etc/sysctl.d中创建一个名为的文件,而不是在 /etc/sysctl.conf 中设置net.ipv4.ip_forward=0和net.ipv4.icmp_echo_ignore_all=1: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 设置的参数的最完整文档来源。
您觉得这篇文章有用吗?我们当然希望您觉得有用。如果您有任何问题或改进建议,请随时告诉我们。