网站首页 语言 会计 电脑 医学 资格证 职场 文艺体育 范文
当前位置:书香门第 > 计算机 > 操作系统

在Linux系统中创建和修改systemd单元文件教程

栏目: 操作系统 / 发布于: / 人气:8.25K

在Linux系统中创建和修改systemd单元文件教程

在Linux系统中创建和修改systemd单元文件教程

(1)单元文件概述

单元文件包含单元的指令和行为信息。在后台systemctl命令和单元文件一起工作。为了出色而正确的完成工作,系统管理员必须能够手工编辑单元文件。一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。

单元配置文件的格式是:

unit__extension

这里的unit_name代表单元名称,type_extension代表单元类型。

单元文件可以作为附加的文件放置到一个目录下面,比如为了定制ice服务,可以创建ice.d/文件,在文件中做一些自定义的配置。

同样的,可以创建s/和ires/目录。这些目录包含sshd服务关联服务的软连接,在系统安装的时候,这些软连接或自动创建,也可以手工创建软连接。

许多单元配置文件可以使用单元说明符--通配的字符串,可以在单元文件被引导的时候动态的被变量替换。这使创建一些通用的单元配置模版成为可能。

(2)理解单元文件结构

典型的单元文件包含三节:

[Unit]节,包含不依赖单元类型的一般选项,这些选型提供单元描述,知道单元行为,配置单元和其他单元的依赖性。

[unittype]节,如果单元有特定的类型指令,在unittype节这些指令被组织在一起。举个例子,服务单元文件包含[Service]节,里面有经常使用的服务配置。

[Install]节,包含systemctlenable或者disable的命令安装信息。

1)[Unit]节选项

Description单元描述信息,这些文字信息在systemclstatus命令是会输出。

Documentation单元文档信息的URLs。

After定义在那些单元之后启动,本单元只在制定的单元启动之后启动,不像Requires选项,After选项不明确激活特定的单元,Before选项则是有相反的功能。

Requires配置单元的依赖性,在Requires选项中的单元需要一起被激活,如果有一个单元启动失败,其他单元都不会被启动。

Wants比Requires选项依赖性要弱很多,如果列表之中的的单元启动失败,不会对其他单元造成影响,这是推荐的建立自定义单元依赖性的方式。

Conflicts定义单元冲突关系,和Requires相反。

2)[unittype]类型是[Service]时的选项

Type配置单元进程在启动时候的类型,影响执行和关联选项的功能,可选的关键字是:

simple默认值,进程和服务的主进程一起启动;

forking进程作为服务主进程的一个子进程启动,父进程在完全启动之后退出。

oneshot同simple相似,但是进程在启动单元之后随之退出。

dbus同simple相似,但是随着单元启动后只有主进程得到D-BUS名字。

notify同simple相似,但是随着单元启动之后,一个主要信息被sd_notify()函数送出。

idle同simple相似,实际执行进程的二进制程序会被延缓直到所有的单元的任务完成,主要是避免服务状态和shell混合输出。

ExecStart指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。

ExecStop指定单元停止时执行的命令或者脚本。

ExecReload指定单元重新加载是执行的命令或者脚本。

Restart这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。

RemainAfterExit如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。

3)[Install]节选项

Alias为单元提供一个空间分离的附加名字。

RequiredBy单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。

WantBy单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。

Also指出和单元一起安装或者被协助的单元。

DefaultInstance实例单元的限制,这个选项指定如果单元被允许运行默认的实例。

4)一个postfix服务的例子:

单元文件位于/usr/lib/systemd/system/ice,内容如下:

[Unit]

Description=PostfixMailTransportAgent

After=et

Conflicts=ice

[Service]

Type=forking

PIDFile=/var/spool/postfix/pid/

EnvironmentFile=-/etc/sysconfig/network

ExecStartPre=-/usr/libexec/postfix/aliasesdb

ExecStartPre=-/usr/libexec/postfix/chroot-update

ExecStart=/usr/sbin/postfixstart

ExecReload=/usr/sbin/postfixreload

ExecStop=/usr/sbin/postfixstop

[Install]

WantedBy=et

(3)创建自定义的单元文件

以下几种场景需要自定义单元文件:

希望自己创建守护进程;

为现有的服务创建第二个实例;

引入SysV init脚本。

另外一方面,有时候需要修改已有的单元文件。

下面介绍创建单元文件的步骤:

1)准备自定义服务的执行文件。

可执行文件可以是脚本,也可以是软件提供者的的程序,如果需要,为自定义服务的主进程准备一个PID文件,一保证PID保持不变。另外还可能需要的配置环境变量的脚本,确保所以脚本都有可执行属性并且不需要交互。

2)在/etc/systemd/system/目录创建单元文件,并且保证只能被root用户编辑:

touch/etc/systemd/system/icechmod664/etc/systemd/system/ice

文件不需要执行权限。

3)打开ice文件,添加服务配置,各种变量如何配置视所添加的服务类型而定,下面是一个依赖网络服务的配置例子:

[Unit]

Description=service_description

After=et

[Service]

ExecStart=path_to_executable

Type=forking

PIDFile=path_to_pidfile

[Install]

WantedBy=et

4)通知systemd有个新服务添加:

systemctldaemon-reload

ice

(4)创建ice例子:

1)创建文件,并确保正确权限:

~]#touch/etc/systemd/system/ice

~]#chmod664/etc/systemd/system/ice

2)添加配置信息:

[Unit]

Description=Emacs:theextensible,self-documentingtexteditor

[Service]

Type=forking

ExecStart=/usr/bin/emacs--daemon

ExecStop=/usr/bin/emacsclient--eval"(kill-emacs)"

Environment=SSH_AUTH_SOCK=%t/keyring/ssh

Restart=always

[Install]

WantedBy=et

3)通知systemd并开启服务:

~]#systemctldaemon-reload

~]#ice

(5)创建第二个sshd服务的例子

1)拷贝sshd_config文件

]#cp/etc/ssh/sshd{,-second}_config

2)编辑sshd-second_config文件,添加22220的端口,和PID文件:

Port22220

PidFile/var/run/

如果还需要修改其他参数,请阅读帮助。

3)拷贝单元文件:

~]#cp/usr/lib/systemd/system/sshd{,-second}ice

4)编辑单元文件ice

修改描述字段

Description=OpenSSHserversecondinstancedaemon

添加ice服务在After关键字之后:

After=ice

移除sshdkey创建:

ExecStartPre=/usr/sbin/sshd-keygen

移除这一行

在执行脚本里,添加第二sshd服务的配置文件:

ExecStart=/usr/sbin/sshd-D-f/etc/ssh/sshd-second_config$OPTIONS

修改后的ice文件内容如下:

[Unit]

Description=OpenSSHserversecondinstancedaemon

After=et e ice ice

[Service]

EnvironmentFile=/etc/sysconfig/sshd

ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config$OPTIONS

ExecReload=/bin/kill -HUP $MAINPID

KillMode=process

Restart=on-failure

RestartSec=42s

[Install]

WantedBy=et

5)如果使用SELinux,添加tcp端口,负责第二sshd服务的端口就会被拒绝绑定:

~]#semanage port -a -tssh_port_t -p tcp22220

6)设置开机启动并测试:

~]#systemctl enable ice

~]$ssh -p 22220 user@server

确保防火墙端口也开放。

(6)修改已经存在的单元文件

systemd单元配置文件默认保存在/usr/lib/systemd/system/目录,系统管理员不建议直接修改这个目录下的文件,自定义的文件在/etc/systemd/system/目录下,如果有扩展的需求,可以使用以下方案:

创建一个目录/etc/systemd/system/unit.d/,这个是最推荐的`一种方式,可以参考初始的单元文件,通过附件配置文件来扩展默认的配置,对默认单元文件的升级会被自动升级和应用。

从/usr/lib/systemd/system/拷贝一份原始配置文件到/etc/systemd/system/,然后修改。复制的版本会覆盖原始配置,这种方式不能增加附件的配置包,用于不需要附加功能的场景。

如果需要恢复到默认的配置文件,只需要删除/etc/systemd/system/下的配置文件就可以了,不需要重启机器,使用如下命令应用改变就可以:

systemctl daemon-reload

daemon-reload选项重新加载所以单元文件并重新创建依赖书,在需要立即应用单元文件改变的时候使用。另外,也可以使用下面的命令达到同样的目的:

init q

还有,如果修改的是一个正在运行服务的单元文件,服务需要被重启下:

systemct lrestart ice

(7)扩展默认单元配置文件配置

为了扩展默认的单元文件配置,需要先在/etc/systemd/system/下创建一个目录,用root执行类似下面的命令:

mkdir/etc/systemd/system/ice.d

在刚才创建的目录之下创建配置文件,必须以文件结尾。

例如创建一个自定义的依赖文件,内容如下:

[Unit]

Requires=new_dependency

After=new_dependency

另外一个例子,可以配置重启的时候,在主进程退出后30秒在重启,配置例子如下:

[Service]

Restart=always

RestartSec=30

推荐每次只产生一个小文件,每个文件只聚焦完善一个功能,这样配置文件很容易被移除或者链接到其他服务对的配置目录中。

为了应用刚才的修改,使用root执行以下操作:

systemctldaemon-reload

ice

例子:扩展ice服务配置

为了是httpd服务启动的时候执行用户自定义的脚本,需要修改httpd的单元配置文件,执行以下几步操作,首先创建一个自定义文件的目录及自定义文件:

~]#mkdir/etc/systemd/system/ice.d

~]#touch/etc/systemd/system/ice.d/custom_

假设自定义文件位置在/usr/local/bin/,将这个信息添加到custom_自定义脚本中:

[Service]

ExecStartPost=/usr/local/bin/

应用更改:

~]#systemctldaemon-reload

~]#ice