「systemd」- 修改单元文件 @20210318

本文介绍如何通过systemctledit命令安全地修改系统服务配置,避免软件升级导致配置丢失。以MySQL服务为例,演示如何正确地调整服务参数,以及如何查看和还原所做的修改。

问题描述

系统安装某个服务,但是需要修改它的单元文件的参数。

由于这些服务是通过包管理器安装的,比如 YUM 安装,不建议直接修改包中的文件。因为随着软件的升级,该单元文件会被覆盖或者删除,因此不应该直接修改属于软件包的文件。

比如,安装了MySQL服务,单元文件/usr/lib/systemd/system/mysqld.service为包中自带的,但是我们需要调整它的配置。而你应该直接修改这个文件,因为:如果升级MySQL版本,该文件会被覆盖。

标准操作

正确的做法是使用 systemctl edit 命令。

基于上面的例子,执行systemctl edit mysqld.service命令,该会打开编辑器,你可以在这其中输入自定义配置,例如:

[Service]
LimitNOFILE=65535

然后保存退出。

实际上,上面的操作流程就是:创建了/etc/systemd/system/mysqld.service.d/override.conf文件,并将编辑器的内容写入到override.conf文件中。你也可以在定义自己的.conf文件。

!!!另外有几个需要注意的地方:
(1)当使用systemctl edit命令进行修改的时候,需要指定章节,比如示例中的[Service]部分。
(2)覆盖是以指令单位的。例如,上面虽然指定了[Service]部分,但是只会覆盖[Service]部分的LimitNOFILE配置。
(3)如果它是一个列表,那你需要清空在定义。比如,先指定LimitNOFILE=后指令,再指定LimitNOFILE=65535指令。
(4)不需要运行systemctl daemon-reload命令。

查看修改

执行systemctl cat命令来查看修改。

例如执行systemctl cat mysqld.service命令,会产生类似如下的输出:

#
# /usr/lib/systemd/system/mysqld.service
#
# Simple MySQL systemd service file
#
# systemd supports lots of fancy features, look here (and linked docs) for a full list:
#   http://www.freedesktop.org/software/systemd/man/systemd.exec.html
#
# Note: this file ( /usr/lib/systemd/system/mysql.service )
# will be overwritten on package upgrade, please copy the file to
#
#  /etc/systemd/system/mysql.service
#
# to make needed changes.
#
# systemd-delta can be used to check differences between the two mysql.service files.
#

[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
Alias=mysql.service

[Service]
User=mysql
Group=mysql

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Needed to create system tables etc.
ExecStartPre=/usr/bin/mysql-systemd-start pre

# Start main service
ExecStart=/usr/bin/mysqld_safe --basedir=/usr

# Don't signal startup success before a ping works
ExecStartPost=/usr/bin/mysql-systemd-start post

# Give up if ping don't get an answer
TimeoutSec=600

Restart=always
PrivateTmp=false



# /etc/systemd/system/mysqld.service.d/override.conf
[Service]
LimitNOFILE=65535

它同时输出了哪些指令是来自于/usr/lib/systemd/system/mysqld.service文件,哪些是来自于/etc/systemd/system/mysqld.service.d/override.conf文件。

关于环境变量

环境变量的修改也是类似的方法,但是使用的是Environment指令,如同Environment=FOO=bar的形式。

还原修改

执行systemctl revert命令来还原修改。它会还原至原始版本,删除所有的覆盖,还原单元文件的属性到默认值,并且进行unmask操作。

执行systemctl revert mysqld.service命令来还原之前的修改。

!!!但是要高于229版本(systemctl --version),而CentOS Linux release 7.4.1708 (Core)是systemd 219版本。

相关文章

「systemd」- 从 systemctl status 中提取个别字段
「Supervisor」- 创建首个配置文件
「systemd」 - 创建和修改单元文件
「systemd.timer」

参考文献

How do I override or configure systemd services?
Systemd delete overrides
systemd.unit — Unit configuration
How to override systemd unit file settings?
How to find out the systemd version on Raspbian

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值