为什么我的 blockdev 配置更改不会在重新启动时从 rc.local 执行

DCa*_*ugs 3 centos bootable

我(可能很明显)是一个相对较新的 Linux 用户,所以我已经准备好迎接“你为什么不这样做……”评论。我很想听听他们的意见……但我也很想从根本上了解为什么这不能正常工作。

细节:

  • 我正在运行 CentOS 7+
  • 我正在尝试修改我的 blockdev 配置上的预读值(对于数据库服务器)
  • 我能够从 cmd 行实现更改,但在重新启动后我无法保留它们。
  • 是的,我已经重新启动。很多。
  • 为了保持更改,我修改了 rc.local 文件。
  • rc.local 文件是这样实现的:

    #!/bin/bash
    touch /var/lock/subsys/local
    /sbin/blockdev --setra 128 /dev/sda
    /sbin/blockdev --setra 128 /dev/dm-1
    /sbin/blockdev --setra 128 /dev/dm-0
    
    Run Code Online (Sandbox Code Playgroud)

Jde*_*eBP 6

忘记了rc.local

你使用的是 CentOS 7。你已经有了 systemd。 /etc/rc.local是 systemd 中的双重向后兼容机制,因为它是一种向后兼容机制,它本身就是System 5 中的兼容机制rc。正如下面超链接的 AskUbuntu 问题中的混乱所示,使用/etc/rc.local可能会出错。所以制作一个合适的 systemd 服务单元。

首先,创建一个模板服务单元。为了举例,我们称之为/etc/systemd/system/custom-readahead@.service

[单元]
文档=https://unix.stackexchange.com/questions/247436/
说明=在存储设备 %I 上设置自定义预读
BindsTo=dev-%i.device

[服务]
类型=oneshot
ExecStart=/sbin/blockdev --setra 128 /dev/%I

当适当的设备到达时,安排由即插即用设备管理器 (udev) 启动该服务单元。您必须根据自己的特定需求定制的规则如下所示:

SUBSYSTEM=="block", ACTION=="add|change", KERNEL=="sd[az]", ENV{SYSTEMD_WANTS}="custom-readahead@%k"

SYSTEMD_WANTS设置会导致 udev 启动命名服务 —针对设备的模板实例化%k。然后运行此服务blockdev

显然还有另一种方法可以做到这一点,它依赖于 udev 直接设置这些设置的能力。为此,您不需要 systemd 模板单元或实例化服务。相反,只需直接在其规则中指示 udev:

SUBSYSTEM=="block", ACTION=="add|change", KERNEL=="sd[az]", ATTR{bdi/read_ahead_kb}="128"

注意之间的差异===

rc.local无论哪种方式,都没有涉及任何地方。

进一步阅读