许多 sysv init 脚本使用相应的文件/etc/default
以允许管理员对其进行配置。可以使用.override
文件修改 Upstart 作业。既然 systemd 是 Ubuntu 中的默认设置,我该如何覆盖或配置 systemd 单元?
许多 sysv init 脚本使用相应的文件/etc/default
以允许管理员对其进行配置。可以使用.override
文件修改 Upstart 作业。既然 systemd 是 Ubuntu 中的默认设置,我该如何覆盖或配置 systemd 单元?
systemd
单位不需要服从/etc/default
.systemd
很容易配置,但需要你知道 systemd 单元文件的语法。包通常以
/lib/systemd/system/
. 这些不能编辑。相反,systemd
允许您通过在/etc/systemd/system/
.对于给定的服务
foo
,包将提供/lib/systemd/system/foo.service
。您可以使用 检查其状态systemctl status foo
,或使用 查看其日志journalctl -u foo
。要覆盖 的定义中的某些内容foo
,请执行以下操作:这将创建一个
/etc/systemd/system
以单元命名的目录,并override.conf
在该目录中创建一个文件 (/etc/systemd/system/foo.service.d/override.conf
)。.conf
您可以使用此文件(或中的其他文件)添加或覆盖设置/etc/systemd/system/foo.service.d/
。这也适用于非服务单位——你可以这样做systemctl edit foo.mount
,systemctl edit foo.timer
等等。覆盖命令参数
以
getty
服务为例。假设我想让 TTY2 自动登录到我的用户(这是不可取的,但只是一个例子)。TTY2 由getty@tty2
服务运行(tty2
作为模板的一个实例/lib/systemd/system/getty@service
)。为此,我必须修改getty@tty2
服务。特别是,我必须更改当前
ExecStart
行:要覆盖它,请执行以下操作:
并添加:
注意:
ExecStart
它,因为它是一个附加设置,类似于其他列表,如Environment
(作为一个整体,而不是每个变量)和EnvironmentFile
; 并反对重写RestartSec
或之类的设置Type
。ExecStart
只能为Type=oneshot
服务设置多个条目。请注意,像Before
、After
、Wants
等依赖项设置也是列表,但不能使用这种方式清除。您必须为此覆盖/替换整个服务(见下文)。ExecStart
在该[Service]
部分中,因此我的覆盖也必须放在ExecStart
该[Service]
部分中。通常,查看实际使用的服务文件systemctl cat
会告诉您需要覆盖什么以及它位于哪个部分。通常,如果你编辑一个 systemd 单元文件,要让它生效,你需要运行:
但是,
systemctl edit
它会自动为您执行此操作。现在:
如果我这样做:
然后按CtrlAltF2,很快!我将在该 TTY 上登录我的帐户。
正如我之前所说,
getty@tty2
是模板的一个实例。那么,如果我想覆盖该模板的所有实例怎么办?这可以通过编辑模板本身来完成(删除实例标识符 - 在这种情况下tty2
):覆盖环境
文件的一个常见用例
/etc/default
是设置环境变量。通常,/etc/default
是一个 shell 脚本,因此您可以在其中使用 shell 语言构造。但是,对于systemd
,情况并非如此。您可以通过两种方式指定环境变量:通过文件
假设您已在文件中设置环境变量:
然后,您可以添加到覆盖:
特别是,如果您
/etc/default/grub
只包含赋值而没有 shell 语法,则可以将它用作EnvironmentFile
.通过
Environment
条目也可以使用以下覆盖来完成上述操作:
但是,对于多个变量、空格等,这可能会变得棘手。查看我的其他答案之一以获取此类实例的示例。
编辑的变化
完全替换现有单元
如果您想对现有单元进行大量更改,以便有效地完全替换它,您可以这样做:
临时编辑
在 systemd 文件层次结构中,
/run
优先于/etc
,后者又优先于/lib
. 到目前为止所说的一切也适用于 using/run/systemd/system
instead of/etc/systemd/system
。通常/run
是一个临时文件系统,其内容在重启时会丢失,所以如果你只想在重启之前覆盖一个单元,你可以这样做:撤消更改
您可以简单地删除相应的覆盖文件,并
systemctl daemon-reload
让 systemd 读取更新的单元定义。您还可以还原所有更改:
进一步阅读
systemd
通过这种机制,覆盖单位以及撤消此类更改变得非常容易(通过简单地删除覆盖文件)。这些不是唯一可以修改的设置。以下链接会很有用:
systemd
systemd
联机帮助页,特别是systemd.unit
和的联机帮助页systemd.service