Systemd 挂载失败。where= 设置与单位名称不匹配

Ole*_*ndr 22 mount systemd

如果我使用这个命令:

mount -t xfs -o noatime,nodiratime,logbufs=8 -L d1 /srv/node/d1
Run Code Online (Sandbox Code Playgroud)

一切正常。但是如果我尝试通过systemdmount 挂载它就会失败。

我创建了一个/etc/systemd/system/mnt-d1.mount包含以下内容的文件:

[Unit]
Description = Disk 1

[Mount]
What = LABEL=d1
Where = /srv/node/d1
Type = xfs
Options = noatime,nodiratime,logbufs=8

[Install]
WantedBy = multi-user.target
Run Code Online (Sandbox Code Playgroud)

之后我运行这些命令:

systemctl daemon-reload
systemctl start mnt-d1.mount
Run Code Online (Sandbox Code Playgroud)

最后一张给我看了:

Failed to start mnt-d1.mount: Unit mnt-d1.mount failed to load: Invalid argument.  
See system logs and 'systemctl status mnt-d1.mount' for details.
Run Code Online (Sandbox Code Playgroud)

systemctl status mnt-d1.mount 给我看了:

May 16 18:13:52 object1 systemd[1]: Cannot add dependency job for unit mnt-d1.mount, ignoring: Unit mnt-d1.mount failed to ...ectory.
May 16 18:24:05 object1 systemd[1]: mnt-d1.mount's Where= setting doesn't match unit name. Refusing.
Run Code Online (Sandbox Code Playgroud)

请帮我通过systemd挂载单元挂载磁盘。

don*_*sti 32

错误消息解释了原因:

Where= setting doesn't match unit name. Refusing.
Run Code Online (Sandbox Code Playgroud)

尽管理解该消息需要阅读几个手册页。
每个systemd.mount手册页(强调我的):

Where=

获取挂载点目录的绝对路径。如果挂载时挂载点不存在,则创建。 该字符串必须反映在单元文件名中。(见上文。)此选项是强制性的。

“见上”部分是:

挂载单元必须以其控制的挂载点目录命名。示例:挂载点/home/lennart必须在单元文件中配置home-lennart.mount。有关用于将文件系统路径转换为单元名称的转义逻辑的详细信息,请参阅 systemd.unit(5)

好的,systemd.unit手册页指出:

可以使用该systemd-escape(1) 命令生成正确转义的路径。

指向说明如何操作的systemd-escape手册页

要为路径生成安装单元:

$ systemd-escape -p --suffix=mount "/tmp//waldi/foobar/"
tmp-waldi-foobar.mount

所以,在你的情况下,/srv/node/d1转化为srv-node-d1.mount

  • 需要注意的是,即使处理非 AZ 名称,“路径转义”系统也会变得有点复杂。甚至路径中的一些破折号也需要转换为 C 风格的 `\x2d` 转义,当用于创建单元文件时,可能(取决于你的 shell/编辑器)需要再次对斜杠字符进行转义 - 所以单元文件适合挂载 `/some-path` 可能需要运行 `edit some\\x2dpath.mount` (5认同)
  • 我最终来到这里试图找出为什么我无法安装“共享名”。将其重命名为“share_name”解决了问题。 (2认同)
  • 为什么有一个单元文件来挂载带有“-”字符的路径如此困难?我使用 `systemd-escape -p --suffix=mount "/storage/media-server"` 生成了挂载,它输出了 `storage-media\x2dserver.mount` 并且该文件名仍然产生相同的错误.. (2认同)

小智 5

如果有人在尝试挂载到包含连字符的本地目录时看到此错误,请在 shell 上寻址该文件时小心,我的 shell (bash 4) 需要转义斜杠,因此我们要转义转义。
例子:

#/etc/systemd/system/mnt-my\x2dlocal\x2ddir.mount
[Unit]
Description=My mount

[Mount]
What=//some/remote/share
Where=/mnt/my-local-dir
Type=cifs
Options=user=nonrootuser

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

本例中的绝对文件路径是: /etc/systemd/system/mnt-my\x2dlocal\x2ddir.mount

但要重命名您的文件,您需要执行以下操作:

mv /my/original/file /etc/systemd/system/mnt-my\\x2dlocal\\x2ddir.mount
Run Code Online (Sandbox Code Playgroud)

当你调用 systemd 时,你需要

systemctl status /etc/systemd/system/mnt-my\\x2dlocal\\x2ddir.mount
Run Code Online (Sandbox Code Playgroud)

现在,您可以在启动时以非 root 用户身份挂载远程共享。