为什么我的安装单元之一缺少 `Before=local-fs.target`?

为什么我的安装单元之一缺少 `Before=local-fs.target`?
$ systemctl show -p Before /home/.shared-separate
Before=umount.target

$ systemctl show -p Before /data
Before=umount.target local-fs.target

为什么安装单元/home/.shared-separate缺失Before=local-fs.target?这不是我所期望的man systemd.mount——

DefaultDependencies=yes对于“[Unit]”部分(默认)中的安装单元,添加了一些额外的依赖项。引用本地文件系统的挂载单元会自动获得 After=local-fs-pre.target.网络挂载单元自动获取After=remote-fs-pre.target、 network.target 和 network-online.target 的依赖关系。对于后者,Wants= 还添加了一个单元。引用本地和网络文件系统的安装单元通过其文件系统类型规范来区分。在某些情况下,这还不够(例如基于网络块设备的挂载,例如 iSCSI),在这种情况下,_netdev可以将其添加到单元的挂载选项字符串中,这会强制 systemd 将挂载单元视为网络挂载。安装单元(无论是本地还是网络)也会自动获取Before=Conflicts=打开umount.target,以便在关机期间停止。

...

当读取 /etc/fstab 时,systemd 会理解一些特殊的挂载选项,这些选项会影响挂载点创建依赖关系的方式。 systemd 将从 local-fs.target 或 remote-fs.target 创建类型 Wants= 或 Requires (请参阅下面的 nofail 选项)的依赖项,具体取决于文件系统是本地还是远程。

这是在 Debian 8 上。systemd 版本是232-25+deb9u6

这似乎是不可取的。如果我/home/.shared-separate在关闭时登录到控制台和目录中,有时似乎会导致卸载失败。因为这意味着没有顺序依赖性来确保在 systemd 尝试停止安装之前停止会话。

$ journalctl -u /home/.shared-separate -b -1
Jan 06 21:26:59 drystone systemd[1]: Mounting /home/.shared-separate...
Jan 06 21:26:59 drystone systemd[1]: Mounted /home/.shared-separate.
Jan 06 21:28:18 drystone systemd[1]: Unmounting /home/.shared-separate...
Jan 06 21:28:18 drystone systemd[1]: home-.shared\x2dseparate.mount: Mount process exited, code=exited status=32
Jan 06 21:28:18 drystone systemd[1]: Failed unmounting /home/.shared-separate.

systemd 本身在启动期间不会记录任何警告甚至通知消息。关闭时有一些注意事项:

journalctl -p notice -u init.scope
...
-- Reboot --
Jan 06 21:28:18 drystone systemd[1]: home-.shared\x2dseparate.mount: Mount process exited, code=exited status=32
Jan 06 21:28:18 drystone systemd[1]: Failed unmounting /home/.shared-separate.
Jan 06 21:28:18 drystone systemd[1]: Requested transaction contradicts existing jobs: Transaction is destructive.
Jan 06 21:28:18 drystone systemd[1]: systemd-coredump.socket: Failed to queue service startup job (Maybe the service file is missing or not a non-template unit?): Transaction is destructive.
Jan 06 21:28:18 drystone systemd[1]: systemd-coredump.socket: Unit entered failed state.
Jan 06 21:28:21 drystone systemd[1]: Failed to propagate agent release message: Transport endpoint is not connected
Jan 06 21:28:21 drystone systemd[1]: Failed to propagate agent release message: Transport endpoint is not connected
Jan 06 21:28:21 drystone systemd[1]: dev-disk-by\x2duuid-642a335b\x2da00a\x2d4f63\x2d9a36\x2dd689b0d15099.swap: Swap process exited, code=exited status=255
Jan 06 21:28:21 drystone systemd[1]: dev-disk-by\x2duuid-642a335b\x2da00a\x2d4f63\x2d9a36\x2dd689b0d15099.swap: Unit entered failed state.
Jan 06 21:28:21 drystone systemd[1]: Shutting down.
-- Reboot --
...

coredump 以及因此在关闭期间启动 systemd-coredump 的失败尝试来自 gnome-session 的一部分。显然,这与检查我的安装单元这一事实无关关机显示丢失 Before=local-fs.target

Jan 06 21:15:58 drystone kernel: gnome-session-f[14384]: segfault at 0 ip 00007f30cf45de19 sp 00007ffd77e4bd50 error 4 in libgtk-3.so.0.2200.11[7f30cf17b000+700000]

两种安装方式均在 中定义/etc/fstab。两个坐骑都没有_netdev选择。但你可以看到他们的单元文件的差异......

# Extract from /etc/fstab :
UUID=8bf8198a-02d4-450b-a4e7-461194aff2ec /data ext4 nosuid,nodev,errors=remount-ro 0 0
/home/.shared-separate-internal /home/.shared-separate fuse.bindfs nofail,allow_other,force-group=jenkins-photos,perms=g+rwX

$ systemctl cat /home/.shared-separate
# /run/systemd/generator/home-.shared\x2dseparate.mount
# Automatically generated by systemd-fstab-generator

[Unit]
SourcePath=/etc/fstab
Documentation=man:fstab(5) man:systemd-fstab-generator(8)

[Mount]
What=/home/.shared-separate-internal
Where=/home/.shared-separate
Type=fuse.bindfs
Options=nofail,allow_other,force-group=jenkins-photos,perms=g+rwX

$ systemctl cat /data
# /run/systemd/generator/data.mount
# Automatically generated by systemd-fstab-generator

[Unit]
SourcePath=/etc/fstab
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
Before=local-fs.target

[Mount]
What=/dev/disk/by-uuid/8bf8198a-02d4-450b-a4e7-461194aff2ec
Where=/data
Type=ext4
Options=nosuid,nodev,errors=remount-ro

答案1

这是由于nofail选项造成的。继续阅读同一man页:-)。

nofail

使用nofail,此挂载将仅是 local-fs.target 或 remote-fs.target 需要的,而不是必需的。此外,安装单元不会在这些目标单元之前订购。这意味着引导将继续,而无需等待安装单元,并且无论安装点是否可以成功安装。


我想我的预期恰恰相反,因为我在 Arch Wiki(或其他地方)上阅读了以下信息,这些信息似乎是错误或过时的:

选项nofail最好与x-systemd.device-timeout选项结合起来。这是因为默认设备超时为 90 秒,因此断开连接的外部设备只会nofail使启动时间延长 90 秒,除非您重新配置超时(如图所示)。确保不要将超时设置为 0,因为这会导致无限超时。

https://wiki.archlinux.org/index.php/Fstab#External_devices

相关内容