FPs

Systemd 设备管理相关

Mount handling

systemd中的.mount单元文件主要用于管理分区,功能上与/etc/fstab类似。目前的调查深度下,还未发现.mount有相比/etc/fstab更多的特性,官方用户手册中也提到:

“In general, configuring mount points through /etc/fstab is the preferred approach.”

实际上systemd中的mount单元可以说是mount命令的一份配置文件,因为systemd进行挂载文件时候是按照mount单元的配置调用mount命令。

设备挂载信息可以写在.mount单元文件中,也可以写在/etc/fstab文件中。在/etc/fstab中的挂载配置信息,在系统启动阶段systemd会调用systemd-fstab-generator/etc/fstab中的配置条目转化为原生的单元文件然后挂载。对于/etc/fstab中部分特殊的选项,systemd会自动处理依赖,创建WantsRequires等(见下文中的nofail选项)。

/etc/fstab部分与systemd有关联的配置选项:

  • x-systemd.automount:将自动创建systemd中的.automount单元文件,分区只有需要访问时才会被挂载,内核会缓存所有的文件操作,直到分区准备完成。
  • x-systemd.device-timeout=:设置访问分区的超时时间,单位可为:s,min,h,ms。在挂载远程文件系统时候此选项可以防止网络资源不能访问的时候浪费时间。
  • nofail, fail:设置为nofail时,分区只是被wanted,而非required,意味着启动时若设备不存在直接忽略它而不报错。fail意义则相反,fail选项为默认设置。
  • noauto, auto:设置为noauto时,分区只在用户的命令下被挂载,同时也将不会被添加作为local-fs.target的依赖,即在启动时候将不会挂载。auto选项的意义相反。
  • x-initrd.mount:挂载一个额外的文件系统在initramfs中。参考initrd-fs.target。(不太理解具体意义)

若一个挂载点在/etc/fstab/usr/目录的\.mount的单元文件中都进行了配置,前者的优先级更高。若\.mount是存在/etc目录下的,则后者的优先级更高。

native unit files take precedence over traditional configuration files, but this is superseded by the rule that configuration in /etc will always take precedence over configuration in /usr.

配置选项与实例

.mount单元文件的命名规范:mount单元必须以文件系统中挂载点的路径来进行命名,路径中的/-替换。

例:挂载点/home/lennart的配置必须写在名为home-lennart.mount的单元文件中

.mount单元文件中,[Unit]和[Install]两个Section与其他单元文件无差别,

注意:

The User= and Group= options are not particularly useful for mount units specifying a "Type=" option or using configuration not specified in /etc/fstab; mount(8) will refuse options that are not listed in /etc/fstab if it is not run as UID 0.

mount单元独有的是[Mount]Section,以下是该Section中的配置选项:

必备选项

  • What=
  • 所要挂载的设备或者分区、文件的据对路径。若要挂载的是一个设备,相应的device单元上的依赖关系会自动创建,参考systemd.device
  • Where=
  • 挂载点的绝对路径。若挂载点不存在将自动创建。此选项中的字符串必须反映在单元文件名中,见上文提到的命名规范。

可选选项

  • Type=
    • 挂载的文件系统类型。
  • Options=
    • mount选项(mode,size,nodev,noexec,nosuid等,更多见mount)。多个选项以逗号隔开。
  • SloopOption=[true,false]
    • 若为true,上文Options选项中的错误参数将被完全忽略。此项与mount命令中的-s 选项对应。此项默认为关闭(false),即在任何选项发生错误时将拒绝进行挂载。
  • DirectoryMode=
    • 设置自动生成挂载点文件夹时文件夹的访问权限。默认为0755
  • TimeoutSec
    • 等待mount命令完成的时间。若超时将认为mount命令执行失败,对应进程将会被杀死(via SIGTERM; 下一轮继续超时将通过SIGKILL杀死进程)。值为0表示关闭超时设置,默认值同systemd配置文件(systemd-system.conf)中的DefaultTimeoutStart

mount单元文件样例:

/lib/systemd/system/tmp.mount(tmp目录的挂载)

[Unit]
Description=Temporary Directory
Documentation=man:hier(7)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target

[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime

[Install]
WantedBy=local-fs.target

/lib/systemd/system/run-lock.mount(run/lock/目录的挂载)

[Unit]
Description=Lock Directory
Before=local-fs.target

[Mount]
What=tmpfs
Where=/run/lock
Type=tmpfs
Options=nodev,noexec,nosuid,size=5242880

本节参考链接


fsck handling

systemd 中提供fsck工具(/lib/systemd/systemd-fsck)用于检查文件系统。系统中默认存在两个服务单元文件:systemd-fsck@.service, systemd-fsck-root.service用于调用systemd-fsck工具。其中systemd-fsck-root.service由于检查根文件系统拥有(根文件在initramfs中未进行检查的情况下)。systemd-fsck@.service用于检查除根文件系统之外的文件系统,若根文件系统在initramfs中进程了检查,也将由systemd-fsck@.service再次检查。

在系统启动阶段,systemd-fsck@.service, systemd-fsck-root.service将根据/etc/fstab条目中的passno字段设置进行检查。根文件系统的检查在其他文件系统之前,其他文件系统的检查将并行进行(多个文件系统在同一磁盘的情况除外)。

systemd-fsck工具的参数选项(可在service文件中设置或手动调用时指定):

  • fsck.mode=["auto","force","skip"]:
  • auto:只在文件系统检查工具认为文件系统检查是必要时才进行检查。
  • force:强制进行全部文件系统的检查。
  • skip:跳过全部文件系统的检查。
  • fsck.repair=["preen","yes","no"]
  • preen:自动安全的修复fsck检查过程中的文件系统错误。
  • yes:检查过程中fsck给出的问题默认回答为yes。
  • no:检查过程中fsck给出的问题默认回答为no。

注:fsck.mode设置中auto和force进行文件系统检查的前提是/etc/fstab中pass不为0.

  • 0 = Do not check.
  • 1 = First file system (partition) to check; / (root partition) should be set to 1.
  • 2 = All other filesystems to be checked.

本节参考链接

Encrypted hard disk handling(LUKS)

systemd提供了一个名为systemd-cryptsetup-generator,此工具在系统启动阶段将/etc/crypttab转化为原生的systemd单元文件--systemd-cryptsetup@.sevice文件。

注:目前的调查深度下,未发现systemd在磁盘加密方面有更多的特性或者注意点。

对于采用LUKS标准(工具:cryptsetup)进行磁盘加密的做法与之前并没有区别,要进行磁盘和文件加密,只需关心/etc/fstab/etc/crypttab即可。

本节参考链接

硬件故障跟踪与自动报警的研究

systemd合并了udev,从version-184开始[1]。systemd中存在一个硬件相关的单元文件device[2],但是device单元只会在udev匹配到特定规则后自动触发生成,并且device单元中也没有特殊的[device]段用于硬件的特殊配置选项。 udev中与systemd相关的规则文件位于 /lib/udev/rules.d/99-systemd.rules,当匹配到特定条件或者设备时,通过ENV{}输出环境变量等等。

99-systemd.rules片段, 见图 99-systemd.rules。

99-systemd.rules

目前看来,systemd并没有可直接用于硬件故障报警或监控的特性或者功能。

本节参考链接

  1. Udev and systemd to merge
  2. systemd.device
  3. ArchWiki:udev
  4. Writing udev rules
2016-03-18 Systemd