修改内核参数
就像我们可以读取内核参数一样,我们可以使用sysctl
在运行时更改它们的值。
语法非常简单:
sysctl variable=value
我们只需调用命令并提供要分配的变量名称和值。
例如:
$sudo sysctl dev.cdrom.autoeject=1
当我们更改内核参数的值时,如果命令正确执行,则将值集显示为STDOUT(标准输出)。
dev.cdrom.autoeject = 1
通过使用“-Q”(--quiet
)选项来更改此类行为。
读取内核参数值
即使在运行时,也可以通过修改某些参数的值来更改Linux内核的行为。
可用参数是可以通过/proc/sys
目录下通过/proc
伪文件系统访问的参数。
我们可以使用tree
命令来了解其内容:
$tree /proc/sys /proc/sys ├── abi │ └── vsyscall32 ├── crypto │ └── fips_enabled ├── debug │ ├── exception-trace │ └── kprobes-optimization ├── dev │ ├── cdrom │ │ ├── autoclose │ │ ├── autoeject │ │ ├── check_media │ │ ├── debug │ │ ├── info │ │ └── lock │ ├── hpet │ │ └── max-user-freq │ ├── i915 │ │ ├── oa_max_sample_rate │ │ └── perf_stream_paranoid │ ├── mac_hid │ │ ├── mouse_button2_keycode │ │ ├── mouse_button3_keycode │ │ └── mouse_button_emulation │ ├── raid │ │ ├── speed_limit_max │ │ └── speed_limit_min │ ├── scsi │ │ └── logging_level │ └── tty │ └── ldisc_autoload [...]
出于明显的原因,上面的命令的输出被截断,但它给出了我们在谈论的内容。
使用--all
(-a
)选项,sysctl将打印所有可用内核参数的值:
$sysctl -a abi.vsyscall32 = 1 crypto.fips_enabled = 0 debug.exception-trace = 1 debug.kprobes-optimization = 1 dev.cdrom.autoclose = 1 dev.cdrom.autoeject = 0 dev.cdrom.check_media = 0 [...]
如果我们想读取特定参数的值,使用该参数作为sysctl的参数:
$sysctl dev.raid.speed_limit_max dev.raid.speed_limit_max = 200000
如果在脚本中或者管道中,我们只想获取值,可以使用 --values
(-n
)选项:
$sysctl -n dev.raid.speed_limit_max 200000
使更改永久生效
直接使用sysctl修改的参数不是永久的,在重新启动系统后会丢失。
如何使更改永久生效?
我们需要将其写入专用目录中的文件中。
这些目录按优先级低到高的顺序是:
- /etc/sysctl.d
- /run/sysctl.d
- /usr/lib/sysctl.d
托管设置的文件必须具有“.conf”扩展名,并且在启动时由“systemd sysctl”服务按照字典顺序进行排序和加载,无论它们位于哪个目录中。
如果具有相同名称的文件存在于多个目录中,则仅加载位于具有较高优先级的目录中的文件中存在的设置。
“/usr/lib/sysctl.d”目录是用来承载“vendor”设置的,我们应该很少更改它的内容。
在绝大多数情况下,我们希望将文件放在/etc/sysctl.d
目录中,该目录是为系统管理员所做的更改而保留的。
让我们看一个例子。
假设我们想要更改内核交换值 swappiness。
要永久更改此参数的值,我们创建/etc/sysctl.d/99 swappiness.conf
文件:
vm.swappiness = 1
手动加载文件中的设置
使用-p
(--load
)选项,“手动”加载写入文件中的设置 不需要重新启动系统,也不需要重新加载'systemd sysctl'服务。
例如:
$sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
如果使用-p
选项调用sysctl,但没有提供文件参数,
它将从/etc/sysctl.conf
文件中加载设置。
$sudo sysctl -p 等同于 $sudo sysctl -p /etc/sysctl.conf 等同于 $sudo sysctl -p /etc/sysctl.d/99-sysctl.conf