我(可能显然)是一个相对较新的 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
启用它。