自动挂载 CIFS / SMB,优雅地处理无响应的服务器

Chr*_*ris 5 fstab mount automount cifs 17.10

有很多页面展示了如何配置系统以自动挂载由 CIFS 访问的网络共享(fstabautofssystemd.mount,甚至可能更多)。但是当服务器没有响应时,它们会失败(至少我对前两个的尝试)。随着 Kubuntu 17.10 的更新,它甚至使我的系统在启动时挂起并出现黑屏,系统日志中充满了:

CIFS VFS: cifs_mount failed w/return code = -113
Run Code Online (Sandbox Code Playgroud)

还有一些:

CIFS VFS: cifs_mount failed w/return code = -111
Run Code Online (Sandbox Code Playgroud)

那么处理这种设置的推荐方法是什么?

  • 在给定的安装点安装 CIFS 共享(KDEsmb://是不够的)
  • 自动为每个用户执行所有操作
  • 请注意,当目标不可用时不会出现问题
  • 当目标可用时,只需安装它

背景:目标是我的 NAS,它会根据网络流量进入睡眠状态并唤醒。所以至少对于第一个请求它是不可用的。
当笔记本电脑在外部网络中启动时,NAS 甚至根本不可用(或者我启动 VPN 连接)

mpb*_*den 2

systemd.mount我认为你可以使用和来解决这个问题systemd.automount。这将创建一个按需实现的安装点,并且不会在启动过程中挂起系统。

\n

根据systemd.mount(5)的联机帮助页:

\n
\n

或者,安装单元可以附带自动安装单元,
以允许按需或并行安装。请参阅
\nsystemd.automount(5)。

\n
\n

systemd.automount(5)的联机帮助页中:

\n
\n

名称以“.automount”结尾的单元配置文件\n编码有关由 systemd 控制和监督的文件系统自动挂载点的信息。自动挂载单元可用于实现文件系统的\n按需挂载以及并行挂载。

\n
\n

为此,您必须创建一个systemd.mount单元文件和一个systemd.automount单元文件。

\n
\n

创建挂载点

\n

首先,为要挂载的 CIFS 网络共享创建一个目录:

\n
sudo mkdir /mnt/share\n
Run Code Online (Sandbox Code Playgroud)\n

创建systemd.mount单元文件

\n

接下来,systemd.mount/etc/systemd/system/. 文件名必须包含挂载点名称,并将斜杠替换为 \xe2\x80\x9cminus\xe2\x80\x9d 符号。例如,对于上面创建的安装点,/mnt/share创建一个名为 的单元文件mnt-share.mount。请参阅systemd.mount(5)

\n
\n
   Mount units must be named after the mount point directories they\n   control. Example: the mount point /home/lennart must be\n   configured in a unit file home-lennart.mount. For details about\n   the escaping logic used to convert a file system path to a unit\n   name, see systemd.unit(5). Note that mount units cannot be\n   templated, nor is possible to add multiple names to a mount unit\n   by creating symlinks to its unit file.\n
Run Code Online (Sandbox Code Playgroud)\n
\n

对于此文件,您将需要以下信息:

\n
    \n
  • NAS 服务器的 IP 地址和目录
  • \n
  • 您的 CIFS 用户名
  • \n
  • 你的密码
  • \n
  • 您的域名
  • \n
\n

将以下内容添加到/etc/systemd/system/mnt-share.mount,替换上述值:

\n
[Unit]\n  Description=cifs mount unit\n  Requires=network-online.target\n  After=network-online.service\n\n[Mount]\n  What=//NAS-IP-Address/directory\n  Where=/mnt/share\n  Options=username=YourCIFSUserName,password=YourPassword,workgroup=YourDomain,rw\n  Type=cifs\n\n[Install]\n  WantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n

不要启用上述单元。如果这样做,它会在每次启动期间尝试安装您的网络共享,并像以前一样挂起您的系统。

\n

创建systemd.automount单元文件

\n

接下来,创建一个systemd.automount单元:/etc/systemd/system/mnt-share.automount。该单元将按需systemd.automount启动该单元。mnt-share.mount

\n
[Unit]\n  Description=cifs automount unit\n\n[Automount]\n  Where=/mnt/share\n\n[Install]\n  WantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n

启用并启动本机:

\n
sudo systemctl daemon-reload\nsudo systemctl enable mnt-share.automount\nsudo systemctl start mnt-share.automount\n
Run Code Online (Sandbox Code Playgroud)\n
\n

启动此单元后,共享点将不会被安装,但/etc/mtab文件将被更新为一个新条目。您可以通过以下方式查看:

\n
$ mount | grep share\nsystemd-1 on /mnt/share type autofs (...)\n
Run Code Online (Sandbox Code Playgroud)\n

最后,浏览到应自动挂载的网络共享并列出目录内容:

\n
ls /mnt/share\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以检查安装:

\n
$ mount | grep share\nsystemd-1 on /mnt/share type autofs (...)\n//NAS-IP-Address/directory on /mnt/share type ext4 (rw,relatime)\n
Run Code Online (Sandbox Code Playgroud)\n


kan*_*ili 0

安装

sudo apt-get install cifs-utils
Run Code Online (Sandbox Code Playgroud)

如果尚未完成。

作为 sudo 用户,将一个或多个条目添加到您的/etc/fstab

//YourSambaServer/folder /mnt/share/ cifs username=YourCIFSUserName, password=YourPassword,noauto,_netdev,users 0 0
Run Code Online (Sandbox Code Playgroud)

解释:

  1. 第一个条目显示 SMB 服务器的 samba 位置,以及要安装的文件夹
  2. 然后是本地设备上的挂载点 - 不一定是 /mnt/..,任何本地文件夹都可以
  3. 您的 Samba 凭证
  4. 挂载共享所需的标志,如果不存在则忽略它

重新启动,你应该准备好了

我多年来一直使用这个解决方案,并通过 CIF 获得更高的传输速率。请注意,通过这些设置,您可以随时挂载 samba 文件夹。