通过fstab挂载的CIFS在启动时无法挂载

我在我的NAS上有一个CIFS共享,我希望它能在启动时挂载 - 这是我的MythTV服务器用作主要媒体存储的地方。我在fstab中添加了一个条目来进行挂载,但是它没有生效。通过查看系统日志,似乎fstab在我的网络接口启动之前就被读取了。有没有办法修改fstab条目以解决这个问题?
挂载该共享的fstab条目如下:
\\192.168.0.26\mythtv\media  /media/mybooklive  cifs  username=user,password=pass,umask=002,uid=136,gid=144,iocharset=utf8   0       0

启动后,当我输入sudo mount -a时,它能够正常挂载,没有其他问题。
谢谢!

2如果服务器正在运行Ubuntu,那么你可能需要使用/而不是\ - "//192.168.0.26/mythtv/media"。请参考https://wiki.ubuntu.com/MountWindowsSharesPermanently。 - Panther
@bodhi.zazen 我输入时可能有 /,但现在显示为 \。 - douggro
检查 fstab 中的语法(/ vs \)。 - Panther
@bodhi.zazen 我很确定维基百科的文章就是我在设置时遵循的指南。等我有时间坐在服务器旁边时,我会检查语法。 - douggro
再次阅读您的问题后,我认为您需要遵循djmadscribbler的建议。 - Panther
1@bodhi.zazen 请将您的评论转换为答案 - 将\更改为/解决了问题。 - douggro
6个回答

如果_netdev不起作用,可以尝试使用以下选项:
x-systemd.automount

它的工作原理是在首次访问时挂载驱动器。
为了测试自动挂载功能,请先卸载您当前已挂载的共享。
sudo umount /media/mybooklive

然后重新启动remote-fs systemd 单元:

sudo systemctl daemon-reload
sudo systemctl restart remote-fs.target

3谢谢,这个方法在18.04 LTS版本中对我有用。 - Chief
2_netdev在18.04上无法正常工作,但这个方法完美解决了问题 :) - Brian Leishman
1适用于Raspbian 10 - Michael
谢谢,这也是适用于Ubuntu 20.04的正确答案。 - lamka02sk
太棒了!这是唯一一个让我的Mybooklive在启动时挂载成功的方法。还需要添加vers=1.0作为选项。 - cdsaenz
适用于Raspbian 11操作系统。 - Caumons

你尝试过在你的fstab条目中添加选项_netdev吗?你可以像这样在字符串中与其他选项一起添加它。
//192.168.0.26/mythtv/media  /media/mybooklive  cifs  username=user,password=pass,_netdev,umask=002,uid=136,gid=144,iocharset=utf8   0       0

_netdev应该延迟挂载,直到网络连接后。


你能给出在fstab行中放置的上下文吗?有了这个,还有一个可以在服务器不被使用时重启的时间段,我会试一试。感谢你的回答。 - douggro
原来bodhi.zazen的评论是对的。我确实给了你一个赞,感谢你的帮助! - douggro
1这在Ubuntu 12.04上对我有效,但在Ubuntu 16.04上无效。最新版本是否有所改变? - Katu
我也是,16.04版本不起作用。 - jcollum
2注意:我认为_netdev在16.04版本中实际上是有效的,然而credentials=/home/user/.smbcreds不再有效。至少对于我来说,当我使用user=、pass=和_netdev时,它是有效的;当我使用credentials=和_netdev时,它就无效了。在启动后,这两种方式都可以通过命令行中的sudo mount-a来工作。 - jb510
1我实际上认为这可能与对媒体文件夹进行的权限更改有关。在某个时候,Ubuntu开始将东西挂载到/media/用户名/文件夹名称而不是/media/文件夹名称。如果不挂载到"用户名"位置,那么你必须具备sudo级别的权限才能访问。如果你将路径更改为使用/media/用户名路径,我认为它应该仍然可以工作。 - djmadscribbler
3_netdev - 只有在 fstype 为 nfs 时才有效 - Mikhail Chuprynski
这个方法起作用了,但是只有在我弄清楚我的本地网络上的网络路径也没有正确解析之后才行。我不得不添加一个域名后缀。可能是我PFSense路由器的特殊情况。我试图挂载//freenas/x/y,但是我的DNS解析器却想要看到//freenas.pflan/x/y。 - gregb212

我正在使用日期为2017-09-07的Raspbian-Stretch版本,遇到了同样的问题。然而,我通过进入raspi-config,在引导选项菜单下启用了“开机等待网络”选项来解决了这个问题。


3这实际上非常有帮助,我遇到的问题是,即使启动时显示一切正常,但实际上并没有挂载或显示文件夹。 - Alfred Espinosa
谢谢!就是这样。这可能是fstab条目无法加载或树莓派等选项默认关闭的主要原因。干杯。 - drakorg
1这个很好地替代了"_netdev"参数,该参数仅适用于NFS共享。 - Frankie0p

这是一个语法错误,我认为你需要使用"/"而不是"\",像这样
//192.168.0.26/mythtv/media  /media/mybooklive  cifs  username=user,password=pass,_netdev,umask=002,uid=136,gid=144,iocharset=utf8  0 0

请参考以下链接获得更多信息:https://wiki.ubuntu.com/MountWindowsSharesPermanently

  • 使用斜杠(/)对我来说没有解决问题。
  • 此外,将选项_netdev添加到我的/etc/fstab条目中也没有解决问题。

为了解决这个问题(在我的Pi3上),我修改了/etc/rc.local文件,在其中加入了sleep 20命令来延迟20秒,然后调用mount -a命令。这样,即使系统在首次读取fstab文件时网络尚未连接,导致挂载失败,我也强制系统在这里等待20秒(给网络连接的时间),然后再次调用mount -a命令来挂载fstab文件中的所有驱动器。

以下是我现在的/etc/rc.local文件内容:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
# GS notes: a *minimum* of `sleep 10` is required for the mount below to
# work on the Pi 3; it failed with `sleep 5`, but worked with `sleep 10`,
# `sleep 15`, and `sleep 30`
sleep 20
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
  mount -a #GS: mount all drives in /etc/fstab
fi

exit 0

完成了!现在对我来说完美地运作起来了!
参考资料:
[我的答案] https://raspberrypi.stackexchange.com/a/63690/49091 https://www.raspberrypi.org/documentation/linux/usage/rc-local.md http://elinux.org/RPi_Email_IP_On_Boot_Debian - 他们有一个类似的rc.local文件,其中有一个注释:
# 如果IP地址无法工作,请打印IP地址并在所有代码之前延迟30秒

关于我回答的编辑,我有一个关于英语语法的后续问题:
  1. https://english.stackexchange.com/questions/568348/need-help-identifying-if-this-is-1-grammatically-correct-and-2-an-infinitive

你是通过wifi连接的吗? - cbcoutinho
是的,我正在使用 WiFi 而不是以太网。 - Gabriel Staples
这确实非常奇怪,但可能与我的问题无关。我有三个网络驱动器,我正在尝试通过以太网电缆连接它们 - 没有WiFi。其中一个驱动器的名称中有一个特殊字符,这导致在重新启动后无法连接。执行sudo mount -a可以解决这个问题,但我很好奇为什么在启动时不起作用。我会尝试您的解决方案,看看是否有帮助。 - cbcoutinho
1你写道:“我为了解决这个问题(在我的Pi3上)修改了/etc/rc.local来延迟”。这里使用“modify”是正确的英语用法。使用“modifying”是错误的。伪关系句(也称为wh-关系句)在功能上类似于关系句,但它们是由代词what(= the thing(s) that/which)构成的。伪关系句中强调的是what从句后面的短语+be动词:在过去时和现在完成时,我们可以使用以下模式 What I have done is (to) write a letter to the editor. - Michael Harvey

保险方法,永远记住这三点:

  • noauto
  • x-systemd.automount
  • _netdev

总是有效。

以下是我引用的如何使用sshfs自动挂载的方法

我正在添加一个 fstab 方法,因为在这个页面中没有人谈论它。如果你不想使用 hack 并使用内置的高级挂载功能,你需要使用 /etc/fstab 并永远不要回头。
user@host:/remote/folder /mount/point  fuse.sshfs noauto,x-systemd.automount,_netdev,IdentityFile=/home/name/.ssh/id_rsa, allow_other,reconnect 0 0
  • noauto 将停止像强制挂载一样的无脑操作,无论网络是否已经启动。
  • x-systemd.automount 是智能守护进程,知道何时挂载。
  • _netdev 标签也将标识它使用网络设备,因此它将等待网络启动。

在我的20.04LTS机器上它没有起作用,肯定还有一些更加神秘的要素。 - Horror Vacui
在Debian 11(Bullseye)上为我工作得很好,用于CIFS装载。谢谢! - HerbCSO