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

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

我(可能显然)是一个相对较新的 Linux 用户,所以我已经准备好迎接“你为什么不这样做......”的评论。我很想听听他们的声音……但我也想真的喜欢从根本上理解为什么这不能按原样工作。

细节:

  • 我运行的是 CentOS 7+
  • 我正在尝试修改 blockdev 配置上的预读值(对于数据库服务器)
  • 我可以从命令行实施更改,但重新启动后无法保留它们。
  • 是的,我重新启动。很多。
  • 为了尝试保留更改,我修改了 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
    

答案1

把...忘了吧rc.local

您使用的是 CentOS 7。您有 systemd。 /etc/rc.local是 systemd 中的双重向后兼容机制,因为它是以前的机制的向后兼容机制本身系统5中的兼容机制rc。正如下面超链接的 AskUbuntu 问题中的混乱所示,使用/etc/rc.local可能会出现严重错误。因此,创建一个适当的 systemd 服务单元。

首先,创建一个模板服务单元。为了举例,我们称其为:/etc/systemd/system/[email protected]

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

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

当适当的设备到达时,安排即插即用设备管理器 (udev) 启动该服务单元。您必须根据自己的具体需求定制规则,该规则将类似于:

SUBSYSTEM==“块”,ACTION==“添加|更改”,KERNEL==“sd[az]”,ENV{SYSTEMD_WANTS}="custom-readahead@%k"

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

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

子系统==“块”,操作==“添加|更改”,内核==“sd [az]”,ATTR {bdi / read_ahead_kb} =“128”

==注意和之间的区别=

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

进一步阅读

答案2

在 CentOS 7 中,rc.local 默认情况下不可执行。

运行:chmod +x /etc/rc.d/rc.local

启用它。

相关内容