我最近制作了一个 systemd 单元,它运行一个简单的 bash 脚本来解决 NTFS 挂载驱动程序中的一个错误。该分区与 Windows 共享,因此如果它处于休眠状态,我将无法挂载它rw
。并且它不能正确处理errors=--remount-ro
参数(在 fstab 选项部分),所以我编写了一个脚本来(暂时)处理这个问题。
除此之外,systemd 似乎在启动服务时卸载了“手动”挂载的分区。这是 systemd 的标准功能吗?我该如何禁用它?
相关信息:
systemctl status SHAREDFILES-mount.service
● SHAREDFILES-mount.service - mount SHAREDFILES on boot
Loaded: loaded (/etc/systemd/system/SHAREDFILES-mount.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2019-01-29 13:15:15 -02; 2h 23min ago
Main PID: 992 (code=exited, status=0/SUCCESS)
jan 29 13:15:09 hosthame systemd[1]: Starting mount SHAREDFILES on boot...
jan 29 13:15:13 hosthame ntfs-3g[1302]: Version 2017.3.23 integrated FUSE 28
jan 29 13:15:13 hosthame ntfs-3g[1302]: Mounted /dev/sda4 (Read-Write, label "SHAREDFILES", NTFS 3.1)
jan 29 13:15:13 hosthame ntfs-3g[1302]: Cmdline options: rw,uid=1000,guid=username,umask=002
jan 29 13:15:13 hosthame ntfs-3g[1302]: Mount options: rw,guid=username,allow_other,nonempty,relatime,default_permissions,fsname=/dev/sda4,blkdev,blksize=4096
jan 29 13:15:13 hosthame ntfs-3g[1302]: Global ownership and permissions enforced, configuration type 7
jan 29 13:15:14 hosthame ntfs-3g[1302]: Unmounting /dev/sda4 (SHAREDFILES)
jan 29 13:15:15 hosthame systemd[1]: Started mount SHAREDFILES on boot
脚本:
#try mounting normally (windows not hibernated)
mount -U 'disk-uid' --target /path/to/mountpoint -o uid=username,guid=username,umask=002 && exit;
#mount as ro (windows hibernated)
sudo mount -ro --source $( eval $(blkid | grep SHAREDFILES | grep -Eo "UUID=\"\w+\"" ) && blkid -U "$UUID" ) --target /path/to/mountpoint -o uid=username,guid=username,umask=0002 && exit;
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
答案1
您可能对该功能感兴趣automount
:
https://www.freedesktop.org/software/systemd/man/systemd.automount.html#
Systemd 和挂载
问题标题容易让人误解。我们就从这里开始吧。
Systemd 不直接负责挂载驱动器。它旨在调度其他服务,例如mount
。
自古以来,持久挂载点都是手动写入/etc/fstab
文件中的。
mount -a
加载列出的每个挂载点/etc/fstab
,因此 systemdmount -a
在启动时调用(文档没有另外说明)。
要编辑,运行sudo nano /etc/fstab
或sudo gedit /etc/fstab
。
sudo
对于机器上没有此文件的人:请使用su -c=/usr/bin/nano /etc/fstab
。如果此 nano 路径不起作用,请使用 查找您的位置where nano
。
挂载文件
Systemd 还具有一项功能,允许您将<filename>.mount
文件放在 systemdsystem
目录中。例如:
/etc/systemd/system/var-lib-docker.mount
文件名必须按照特定方式格式化:
挂载单元必须以其控制的挂载点目录命名。例如:挂载点
/var/lib/docker
必须在单元文件中配置var-lib-docker.mount
。有关将文件系统路径转换为单元名称的转义逻辑的详细信息,请参阅 systemd.unit 的手册页。从:https://www.thegeekdiary.com/how-to-auto-mount-a-filesystem-using-systemd/
然而,官方文件说/etc/fstab是推荐的方法。
文件系统
挂载单元可以通过单元文件或 /etc/fstab 配置(详情请参阅 fstab(5))。/etc/fstab 中列出的挂载将在启动时以及系统管理器的配置重新加载时动态转换为本机单元。通常,通过 /etc/fstab 配置挂载点是首选方法。
文档:https://www.freedesktop.org/software/systemd/man/systemd.mount.html
您说您在以读/写方式挂载失败后使用 fstab 选项以只读方式重新挂载,但这不起作用。我不建议使用脚本黑客。这可以避免解决问题。如果上述步骤不能解决您的问题,请与软件包维护者或项目开发人员一起调查。请参阅 FreeDesktop 的调试页面底部,获取报告 systemd 错误的链接以及要附加到错误报告的内容的描述:
答案2
好像使用.mount
正如 Ryan 所建议的,该单位将是一个很好的解决方案。
但是,如果您已经配置了标准服务文件,并且想要继续使用该文件...
问题在于,服务的默认行为是在进程停止运行ExecStop
时立即运行命令ExecStart
。您可以通过将此配置添加到文件来阻止这种情况.service
:
[Service]
# Stoppable one-shot service (this might not actually be needed, not sure)
# It allows you to specify multiple ExecStart commands, if that's desirable
Type=oneshot
# Useful: This ensures systemd won't automatically stop the service immediately
# after the start command completed.
# It is not recommended for daemons, because it won't notice if the daemon crashes.
RemainAfterExit=yes
# Optional: Will mark the service as successful, even if the script returns an error,
# which will at least allow bootup to continue
ExecStartPost=/bin/true
文档:https://www.freedesktop.org/software/systemd/man/systemd.service.html
/etc/fstab
最后,如果 systemd 试图在关机时自动卸载它,我建议从中删除任何条目,但您更愿意使用 手动卸载它ExecStop
。