修改内核参数

就像我们可以读取内核参数一样,我们可以使用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读取和更改内核参数的值

使更改永久生效

直接使用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
日期:2020-07-07 20:56:29 来源:oir作者:oir