理解Systemd单元和单元文件

介绍

越来越多地, Linux发行版本采用或计划采用sytemd 初始化系统。这个强大的软件套件可能管理你服务器从设备安装到系统状态的许多方面。

systemd,一个单元指的是让系统知道如何进行操作和管理的资源。这是systemd知道如何去处理的主要对象。这些资源使用叫作单元文件的配置文件来定义。

在这个手册,我们会介绍systemd能处理的不同单元文件。为了体现这些资源文件在你的系统里是处理的方式,我们也会涉及可以在单元文件中使用的许多指令。

systemd单元能给你什么呢?

单元是systemd明白如何去管理的对象。这些基本是一个可以被守护进程套件管理和提供的实用程序操作的系统资源的标准代表。

单元在某些方面可以形容成在其他初始化系统中的服务或者工作。但是,一个单元有更广泛的定义,因为它们可以用于抽象的服务、网络资源、设备、文件系统挂载及独立的资源池。

记住在其他的初始化系统中也许处理一个能根据焦点分解组成单元的统一服务定义。这通过函数来组织并且允许你简单地启用、禁用或者不需要修改一个单元的核心行为就能扩展功能。

单元容易现实的一些特性:

  • 基于套接字的激活:为了分别处理守护进程自身,套接字相关的服务是最好细分方式。这提供了许多优势,如延迟服务的开始到首次访问相关的套接字。
  • 基于总线的激活:单元也可以在D-Bus提供的总线接口上激活。一个单元可以在相于的总线发布时启动。
  • 基于路径的激活:一个单元可以基于特定文件系统路径的活动或者可用而开始。这利用了inotify
  • 基于设备的激活:单元也可以通过利用udev事件在相关硬件第一次可用时开始。
  • 隐含的依赖映射:大多数单元的依赖树可以被systemd自身构建。你仍然可以添加依赖和指令信息,但是大多数这些繁重的工作已经为你做好了。
  • 实例和模板:模板单元文件可以被用于创建一些通用单元的多个实例。这允许轻微的变化或者由完全由相同的通用函数提供的同级单元。
  • 方便的安全加固:单元可以通过添加简单的指令来实现一些相当不错的安全功能。例如,你可以指定不允许访问或者只读访问文件系统的一部分、限制内核能力以及分配私有的/tmp和网络接入。
  • 嵌入的(drop-ins)和代码片段:单元可能很容易地通过提供覆盖系统单元的一部分的代码片段来扩展。这使得很容易在平常和定制的单元实现之间切换。

相对于其他的初始化系统工作项,systemd单元还有其他一些优点,这些应该可以给你一些花力气使用本地配置指令的想法吧。

systemd单元文件在哪里能找到?

定义systemd将会如何处理一个单元的文件可以在不同的地方找到,每一个都有不同的优先级和影响。

系统的单元文件的副本一般情况下在/lib/systemd/syste目录。当软件在系统上安装单元文件时,这个地方是他们默认放的地方。

单元文件存储在这里可以在会话期间立即响应开始和停止。这是通用、平常的单元文件,经常被上游维护者写着应该在使用标准实现部署systemd的系统上工作。相反,如果你需要使用取代此位置文件其他单元文件,你应该覆盖该文件。

如果你希望单元函数的工作方式,最好的位置是在/etc/systemd/system目录。在这个目录找到的单元文件是优先于在文件系统其他位置的。如果你需要修改系统的单元文件副本,放一个替换文件在这个目录是最安全和灵活的方式。

如果你想只覆盖系统的单元文件中指定的指令,实际上你可以在子目录里提供单元文件片段。这些将会追加或者修改系统的副本里的指令,让你仅指定你要改的选项。

做这个的正确方式是创建一个名字是单元文件名字后面加上.d的目录。例如一个单元叫作example.services,可以创建一个叫作example.services.d的子文件。在这个目录里名字以.conf结尾的文件可以用于覆盖或者扩展系统的单元文件属性。

还有一个给运行时单元定义的位置在/run/systemd/system。在这个目录找到的单元文件优先级降低到在/etc/systemd/syste/lib/systemd/system之间。在这个目录里的文件被给定的重量小于前面一个目录,但多于后面一个目录。

systemd进程自身使用这个位置来在执行的时候动态创建单元文件。这个目录可以被用于修改会话期间的系统单元行为。当服务器重启时在这个目录里做的所有修改都会丢失。

单元的类型

systemd根据他们描述的资源类型来分类单元。最简单的确定单元类型的方式是使用它们的类型后缀,其被附加在资源名后面。下面的列表介绍了systemd可用的单元类型:

.services:一个服务单元描述如何在服务器上管理一个服务或者应用。这将会包括如何开始或者停止服务、在哪些情况下应自动启动以及相关的软件依赖和排序信息。

  • .socket:一个套接字单元文件描述了systemd使用于基本套接字激活的一个网络或者IPC套接字,或者一个FIFO缓冲。.services文件将会在定义在这个单元里的套接字是活动时开始。
  • .devic:描述了一个设备被udev或者sysfs指定作为systemd管理器的单元。不是所有设置都有.device文件。一些情况下.device单元可能是命令、挂载及访问设备所必需的。
  • .mount:这个单元定义了一个在系统上systemd管理的挂载点。这个些文件以挂载路径来命名,并且把斜杠改成短划线。在/etc/fstab里的条目会有自动创建的单元。
  • .automount:一个.automount单元配置了一个将会自动挂载的挂载点。这些必须根据涉及的挂载点来命令并且必须有匹配的.mount单元来定义挂载的细节。
  • .swap:这个单元描述了系统里的交换空间。这些文件的名字必须体现设备或者空间文件。
  • .target:一个目标单元是在启动或者改变状态时为其他单元提供同步点的。他们也可以用于把系统带进一个新的状态。其他单元指定他们的相当目标来绑定目标的操作。
  • .path:这个单元定义了一个可用于基于路径激活的路径。默认情况下,当路径达到指定状态时一个相同基础名字的.service单元就会开始。这使用inotify来监控路径的变化。
  • .timer:一个.timer单元定义了一个被systemd管理的定时器,类似于一个cron工作来延时或者计划激活。一个匹配的单元将会在计时器到达时开始。
  • .snapshot:一个.snapshot单元是被systemctl snapshot命令自动创建的。它可以让你在进行更改后重建系统的当前状态。快照不会跨会话生存,快照是用于回滚临时状态的。
  • .slice:一个.slice单元是和Linux Control Group节点关联的,允许资源受到限制或者给关联的进程分匹配时间片。名字反映了它在cgroup树里的分层位置。单元默认根据他们的类型放在一定的位置。
  • .scope:作用域单元是systemd根据从它的总线接口接收到的信息自动创建的。这些被用于外部创建的系统进程的管理集。

就像你看到的,有许多systemd知道如何去管理的不同单元。很多单元类型一起工作来增加功能。例如,一些单元用于触发其他单元和提供激活功能。

我们将会主要集中在.servic单元,因为他们的实用性和管理员需要管理这些单元的一致性。

单元文件的剖析

单元文件的内部结构是使用区段来组织的。区段使用一对方括号及被包围其中的区段名来表示。每一个区段延伸到随后的区段开始或者文件的结尾。

单元文件的一般特征

区段名是明确定义并且区分大小写的。所以区段[Unit]不会正确解读拼写很像的[UNIT]。如果你需要添加不规范的区段来让systemd以外的应用来解析,你可以添加一个X-前缀到区段名。

在这些区段里,单元的行为和元数据通过等号表示的键-值格式来指定,就像这样:

[Section] Directive1=value Directive2=value . . .

在覆盖文件的情况下(比如包含在一个单元.类型.d目录),指令可以将它们分配到一个空字符串来进行复位。例如,系统的单元文件副本可能包含一个指令集像这样设置值:

Directive1=default_value

default_value可以通过不带值引用Directive1来取消,就像这样:

Directive1=

总之,systemd可以方便,灵活地配置。例如,多个布尔表达是被接受的(1yeson以及true来表示确定;0off以及false来表示相反的答案)。时间可以被智能地分析,没有单位的值假定成秒并且结合多种格式在内部完成。

[Unit]区段指令

在大多数单元文件第一个发现的区段是[Unit]区段。这通常用于定义单元的元数据和配置与其他单元的关系。

虽然解析文件时对systemd来说区段的顺序无关紧要,但是这个区段因为提供了单元的概况经常被放在顶部。在[Unit]区段能找到的常见指令:

  • Description=:指令可以用于单元的名字和基本的功能描述。它被各种各样的systemd工具返回,所以把这个设置得简短、具体和翔实是好主意。
  • Documentation=:这个指令提供了文档URI的列表地址。可以是内部可用的man页面或者网页访问的URL。systemctl status命令将会显示这个信息,使得易于被发现。
  • Requires=:这个指令列出这个单元主要依赖的单元。如果现在的单元被激活,那么被列在这的单元也必须要成功地激活,否则这个单元将会失败。默认情况下,这些单元与现在的单元同时开始。
  • Wants=:这个指令和Requires=相似,只是更宽松一些。当这个单元被激活时,systemd将会偿试激活这里列出的单元。这是配置大多数依赖关系的推荐方式。再一次,除非由其他指令修改,这意味并行激活。
  • BindsTo:这个指令和Requires=相似,但是当相关单元终止会引起当前单元停止。
  • Before=:被列在这个指令里的单元如果和当前单元在同一时间被激活,他们在当前单元被有被标记成已开始前不会启动。这并不意味着一个依赖关系,如果需要的话必须配合上述指定中的一个使用。
  • After=:列在这个指令里的单元将会在当前单元开始前启动。这并不意味一个依赖关系,如果需要的话必须要通过上面的指令建立一个依赖关系。
  • Conflicts=:这可以用于列出不能和当前单元同时运行的单元。开始一个带有这个关系的单元会造成其他单元被停止。
  • Condition...=:有许多以Condition开始的指令使管理员能够在测试开始单元之前的特定条件。这可以用于提供一个只能在合适系统下运行的通用单元文件。如果条件不满足,单元就会被优雅地跳过。
  • Assert...=:和那些以Condition开始的指令相同,这些指令指令检查运行环境的各方面来决定单元是否应该被激活。然而,不像Condition指令,使用这个指定否定的结果会导致失败。

使用这些指令和其他一小部分指令,可以建立关于单元以它与其他单元和操作系统的关系的一般信息

[Install]区段指令

在单元文件的相对面,最后的区段经常是[Install]区段。这个区段是可选的,用于定义行为或者单元是否启用。启用一个单元意味它在引导时自动开始。本质上,它是通过在引导时启动到某些单元的位置封锁相关的单元。

因为这个,只有那些可以被启用的单元才有这个区段。里面的指令指明了在单元被启用时会发生什么:

  • WantedBy=WantedBy=指令是用于指定单元如何启用的常见方式。这个指令允许你用类似于[Unit]区段中Wants=指令的方式来指定依赖关系。不同之处在于这个指令是包含在辅助单元里,以便基本单元列表保持干净。当一个带有这个指令的单元被启用时,在/etc/systemd/system里会创建一个单元名加上.wants后缀的目录。在这个目录里,会创建一个指向当前单元的软链接,创建依赖关系。对于实例,如果当前单元有WantedBy=multi-user.target,一个被叫作multi-user.target.wants的目录会在/etc/systemd/system里创建(如果事先不存在的话),并且指向当前单元的软链接会被放在里面。禁用这个单元就移除链接并移除依赖关系。
  • RequiredBy=:这个指令是和WantedBy=指令非常相似的的,但不同的在于如果指定的需要依赖如果没有遇到的话会引起激活失败。当启用时,带有这个指令的单元会创建一个以.requires结尾的目录。
  • Alias=:这个指令使单元也可以使用其他的名字来启用。其他用途是,使得多个产商能够提供的同一个功能,所以相关的单元可以找到一些常见别名的提供者。
  • Also=:这个指令允许单元不成一个集合来启用和禁用。当这个单元激活时总是可用的支持单元可以被列在这里。他们在安装任务时常常被作为一个组来进行管理。
  • DefaultInstance=:对于模板单元(后面介绍)可以产生一个不指定名字的单元实例,这可以用于没有设置合适的名字时的后备值。

单元细节区段指令

在上面两个区段之间你可能会找到单元特定类型的区段。大多数单元类型提供只适用于他们的特定类型。在区段里根据类型命名的可用部分,我们将在这里简单地介绍。

devicetargetsnapshot以及scope单元类型没有单元细节指令,因此没有这些类型没有相关的区段。

[Service]区段

[Service]区段用于提供仅适用服务的配置。

需要在[Service]区段里指定的一个基本情项是服务的Type=。这通过服务的进程和守护(daemonizing)行为来分类服务。它告诉systemd如何正确管理服务和找出它的状态,所以很重要。

Type=指令可以是以下之一︰

  • simple:服务的主进程是在最开始一行中指定的。如果Type=Busname=指令没有设置但是ExecStart=设置了,这是将是默认值。有些会话应该在单元外通过第二个适当类型单元来处理(例如如果单元必须使用套接字来通信,就需要使用.socket单元)。
  • forking:这种服务类型用于服务fork一个子进程,紧接着退出父进程。这就告诉systemd即使父进程已退出进程仍在运行。
  • oneshot:这个类型表明进程短暂存活并且systemd应该在继续其他进程要等待进程退出。当ExecStart=未设置,这个是默认的Type=。它用于一次性任务。
  • dbus:这表明该单元将在D-Bus总线上取个名字。当发生这种情况时,systemd将继续处理下一个单元。
  • notify:这表明服务在启动完成后会发出通知。systemd进程将会在继续其他单元前等待这种情况发生。
  • idle:这表明在所有任务调度完之前,这个服务不会执行。

在使用某些服务类型时,可能需要一些额外的指令。例如︰

  • RemainAfterExit=:这个指令常用于oneshot类型。它表明即使进程退出了也认为服务是活跃的。
  • PIDFile=:如果服务类型标记为“forking",这个指令用于设置保存被监视主子进程ID号的文件路径。
  • BusName=:此指令应该设置成当使用”dbus“服务类型时尝试获取的D-Bus总线名称。
  • NotifyAccess=:当服务类型选择”notify“时,这选项指定用于 监听通知而访问的套接字,可用的选项有”none“、”main“或者”all“。默认值为”none",忽略所有状态消息。“main”选项将会监听来 自主进程的消息,“all”选项将会捕获并处理该服务控制组的所有成员。

到目前为止,我们已经讨论了一些必备的信息,但我们并没有真正定义如何管理我们的服务。做这个指令是:

  • ExecStart=:这指定了启动进程执行的完整路径和命令参数。这只能指定一次(“oneshot"服务除外)。如果该命令路径前面加上了破折号”-“,那么非零退出状态将会被接受而不是将单元的激活标记成失败。
  • ExecStartPre=:这可能用于提供在主进程开始前执行的额外命令。再次的,命令必须指定完整路径并且可以在他们前面加上"-"以表明命令的失败是可以容忍的。
  • ExecStartPost=:这有和ExecStartPre=一样的准确特性外,它指定的命令将会在主进程开始运行。
  • ExecReload=:这个选项指令表明如果配置可用的话,命令有必要重新加截配置。
  • ExecStop=:这个指出停止服务时需要的命令。如果不给,当停止服务器时进程会立即被杀死。
  • ExecStopPost=︰ 这可以用来指定要在停止命令后执行的命令。
  • RestartSec=︰ 如果启用了自动重新启动该服务,则这指定尝试重新启动服务前等待的时间的量。
  • Restart=︰ 这说明在什么情况下, systemd 将尝试自动重新启动该服务。这可以设置为像"always"、"on-success"、"on-failure"、"on-abnormal"、"on-abort"或"on-watchdog"这样的值。这些都将根据服务停止的方法触发重新启。
  • TimeoutSec=:这配置systemd在停止服务或者在停止服务前标志成失败或强杀时等待的时间量。你也可以使用TimeoutStartSec=TimeoutStopSec=来分别地设置超时时间
[Socket]区段

套接字单元在systemd配置里是非常常见的,因为为了提供更好的并行化和灵活性许多服务都实现基于套接字的激活方法。当套接字接收活动时,每个套接字单元必须匹配将要被激活的服务单元。

通过在服务本身外断开套接字控制,套接字可以在早期初始化并且服务往往可以并行启动。默认情况下,套接字名将会尝试开始一个同名的服务来接收连接 。当服务初始化时,套接字将会被传给它,使它开始处理一些缓存的请求。

这些指令是常见的用于指定实际套接字的:

  • ListenStream=:定义了连续、可靠通信的流套接字地址。使用TCP的服务应该要使用此套接字类型。
  • ListenDatagram=:这定义了快速、不可靠通信包的数据包套接字地址。使用UDP的服务应该设置成此套接字类型。
  • ListenSequentialPacket=:这定义使用最大长度数据包保护信息边界的连接、可靠通信的地址。这在Unix套接字最经常看到。
  • ListenFIFO︰ 同其他类型监听类型一起,您还可以指定 FIFO 缓冲区而不是一个套接字。
[Path]区段

路径单元定义了一个systemd可以监视变化的路径。当某些活动在这个路径的位置被检测到时,必须存在另一个被激活的路径。路径的活动是通过inotify来确定的。

单元文件的[Path]区段可以包停驶下这些指令:

PathExists=︰ 此指令用来检查问题路径是否存在。如果是,则关联的单元被激活。 PathExistsGlob=:跟上面的一样,但是可以支持文件通配符表达式来确定路径是否存在。 PathChanged=:这观察路径位置的变化。如果检测到一个变化,当观察的文件被关闭时,就会激活关联的单元。 PathModified=:这像上面的指令一样观察变化,但它在文件写入和关闭时激活。 DirectoryNotEmpty=:这个指令使得systemd在目录不再为空时激活关联单元. Unit=:这指定当路径碰到了上面指定情况下激活的单元。如果缺省,systemd将会查找和这个单元相同基本单元名的.service文件。 MakeDirectory=:这决定了systemd是否会在观察问题前创建路径的目录结构。 DirectoryMode=:如果启用了上述指令,这将设置必须被创建的路径组成的权限模式。

[Swap]区段

交换单元被用于系统统的交换空间。这个单元必须根据交换文件或者交换设备来命名,使用和上文件讨论的相同的文件系统转换。

像的挂载选项,交换单元可以从 /etc/fstab 条目自动创建,或可以通过一个专用的单元文件进行配置。

一个单元文件的[Swap]区段可以包含下面这些用于配置的指令:

What=:交换空间位置的绝对路径,不论这是一个文件还是一个设备。 Priority=:一个用于配置交换空间优先级的整数。 Options=:在/etc/fstab文件里指定的选项可以使用这个指令替代。使用逗号分隔的列表。 TimeoutSec=:在被操作为标定为失败前systemd等待交换空间激活的时间量。

[Automount]区段

这个单元能使一个关联的.mount单元在引导时自动挂载。与.mount单元一样,这睦单元必须根据转化的挂载点路径来命名。

[Automount]区段相当简单,只允许以下两个选项:

Where=:在文件系统上自动动挂载点的绝对路径。这将匹配使用常规符号表示的文件名而不是转换过的。 DirectoryMode=:如果自动挂载点或者父目录需要创建,这将决定这些路径组成的权限设置。

[Mount]区段

挂载单元允许在systemd内部管理挂载点。挂载点应用转换算法根据他们控制的目录来命名。

例如,删除前导的斜杠,其他所有的斜杠转化为破折号“-”,并且所有的短华线和不可打印字符使用C风格的转义码来替代。这个转化的结果被用作挂载单元的名称。挂载单元对上层的其他挂载有隐式依赖。

在引导过程中,挂载单元通常从/etc/fstab文件直接转化而来。为了能在单元中定义自动创建以及那些你希望在单元文件定义的,下面的指令很有用:

What=:需要被挂载的资源绝对路径。 Where=:资源需要被挂载到的绝对路径。除了使用与传统的文件系统相同的表示外,还应该跟单元文件名相同。 Type=:挂载的文件系统类型。 Options=:需要被应用的一些挂载选项。这是一个以逗号分隔的列表。 SloppyOptions=:一个用于确定当有无法识别的挂载选项时是否应该算是挂载失败。 DirectoryMode=:如果需要创建挂载点的父目录时,这决定了这些目录的权限模式。 TimeoutSec=:配置了在挂载被标记成失败前系统等待的时间量。

监听指令还有更多类型,但是上面的这些是最常见的。

其他的套接字特征可以使用附加指令来控制:

Accept=:这将确定是否为每一个连接启动一个附加的服务实例。如果设置成false(默认),一个实例会处理所有连接。 SocketUser=:使用Unix套接字时,指定套接字的所有者。如果未设置,这将是root用户。 SocketGroup=︰ 使用Unix套接字时,指定套接字所属的组。如果即没有设置这个也没有设置上面的指令,这将是root组。如果只有 SocketUser= 设置时, systemd 将尝试查找匹配的组。 SocketMode=︰ 对于 Unix 套接字或 FIFO 缓冲器,这在创建的实体上设置的权限。 Service=︰ 如果服务名称不匹配 .socket 名称,可以使用此指令指定的服务。

[Timer]区段

计时器单元用于安排任务在特定时间或特定的延迟后操作。这种单元类型替换或补充cronat守护进程的某些功能。这将激活计时器达到时,必须提供关联的单元。

单元文件中的[Timer]区段可以包含一些下面的指令︰

  • OnActiveSec=:这个指令使关联单元相对于.timer单元的激活来激活。
  • OnBootSec=:这个指令用于指定关联单元在系统引多长时间后激活的时间量。
  • OnStartupSec=︰ 此指令是类似的上述的计时器,但和systemd进程自身开始时间相关。
  • OnUnitActiveSec=:这设置了一个依据关联单元上次激活时间的定时器。
  • OnUnitInactiveSec=:这设置了一个关于关联单元上次被标记成未激活的定时器。
  • OnCalendar=:这使你能通过一个绝对而不是与事件相关的定时器来激活关联单元。
  • AccuracySec=:这个指令用于设置定时器应该遵守的精确级别。默认情况下,相关单元将会在定时器到达的一分钟内激活。这个指令的值会决定systemd安排激活发生窗口的最大值。
  • 单元=:这指令用来指定定时器过期时应该激活的单元。如果未设置,systemd会寻找与名字与这个单元匹配的.service单元。
  • Persistent=:如果设置此值并相关单元在定时器未激活期间没有被触发,systemd将会在计时器激活时触发它。
  • WakeSystem=:设置这个指令在系统挂起状态下也能在定时器到达时唤起系统。
[Slice]区段

单元文件的[Slice]区段其实并没有任何.slice单元特别的配置。相反,它可以包含一些对于许多上面列出单元实际可用的资源管理指令。

[Slice]区段中一些常见指令,可能也被用于在systemd.resource-controlman页面中可以看到的其他单元。下面这些单元细节区段是可用的:

  • [Slice]
  • [Scope]
  • [Service]
  • [Socket]
  • [Mount]
  • [Swap]

从模板单元文件创建实例

我们在本指南的前面提到了使用模板单元文件来创建多个实例的想法。在本节,我们可以介绍这一概念更多的细节。

模板单元文件是在大多数方面,和常规单元文件没有什么不同。然而,通过让文件的某些部分成为运行的动态信息,提供了灵活地单元配置。

模板和实例单位名称

在模板单元文件名字里包含@符号在基本单元名和单元类型扩展名之间。这个模板单元文件名字可能像这样:

example@.service

当从模板创建的实例时,实例标识符放在@符号和句点表示单位类型之间。例如,使用上面的模板单元文件创建的实例单元看起来像这样︰

example@instance1.service

一个实例文件通常是创建了一个名字里带有实例标识的到模板文件的符号链接。通过这种方式,带有不同标识的多个链接可以指向单个模板文件。当管理实例单元时,systemd将会寻找并使用你在命令行里指定的准确实例名。如果一个也找不到,它会去找关联的模板文件。

模板说明符

模板单元文件的力量主要是通过单元根据操作环境来动态替换合适信息。这做起来就像在平常一样在模板文件里设置指令,只是替换了某些值或者值的一部分成变量说明符。

当实例单元使用有关信息解读时,下面这些比较常见的说明符会被替换:

  • %n:出现在模板文件的任何地方,使用完整的单元名结果插入。
  • %N:像上面的一样,但有一些转码,就像出现在文件路径的模式会被转义。
  • %p︰ 这引用的单元名称前缀。这是@ 符号之前的单位名称的部分 。
  • %P︰ 这和上面相同,但有一些转义反。
  • %i︰ 这引用实例单元中标识符@后的实例名称。这是最常用的说明符之一,因为它将会保证是动态的。此标识符鼓励使用配置显著标识符。例如,将在运行该服务的端口可以用作实例标识符和模板可以使用此说明符设置端口。
  • %I︰ 这和上面相同,但有一些转义反。
  • %f:这将使用预设的/替换非转义实例史或者前缀名。
  • %c:这将指定单元控制组,使标准父级的/sys/fs/cgroup/ssytemd/被移除。
  • %u︰ 配置的运行单元的用户名。
  • %U: 与相同的上述情况,但使用数字 UID 而不是名称。
  • %H:运行这个单元的系统主机名。
  • %%︰ 这用来插入文字的百分比符号。

通过在模板文件中使用上述标识符, systemd 创建一个实例单位时会解释模板时填写正确的值。

总结

当使用 systemd ,了解单元和单元文件可以使管理简单。不像许多其他初始化系统那样你需要知道一种脚本语言来解释启动服务或系统的初始化文件。这些单元文件使用相当简单的声明性语法,使您可以一目了然地看到目的和激活一个单元的影响。

像激活逻辑成为独立的单元这样突破性功能,不仅能使内部的systemd进程优化并行初始化,它也使得配置变得相当简单并使你在不拆除和重建其关联的连接情况下就能修改和重启一些单元。利用这些能力可以给你在管理期间更多的灵活性和力量。

 

原文地址:https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files
本文地址:http://my.oschina.net/soarwilldo/blog/674971

转载于:https://my.oschina.net/soarwilldo/blog/674971

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值