关机前使用 systemd 卸载网络驱动器

关机前使用 systemd 卸载网络驱动器

我的关机需要相当长的时间(我使用的是 Debian 8.1),我发现可以通过在关闭系统之前卸载网络驱动器来修复它。显然,在卸载所有驱动器之前,网络已断开连接。

为了自动执行此操作,我尝试创建一个 systemd 服务,但它不起作用,即它似乎没有及时卸载,并且关闭过程仍然需要很长时间。我的方法的灵感来自这个问题的答案以及一些 systemd.service 手册页的浏览...

[unit]
description=Unmount network drives on shutdown
Before=shutdown.target reboot.target halt.target network.target

[Service]
type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/bin/sh umount /media/networkdrive1 /media/networkdrive2

[Install]
WantedBy=multi-user.target

编辑

网络驱动器通过以下行安装在 /etc/fstab 中:

//192.168.1.5/networkdrive1 /media/nw1 cifs _netdev,uid=myuser,credentials=/home/myuser/.credfile
//192.168.1.5/networkdrive2 /media/nw2 cifs _netdev,uid=myuser,credentials=/home/myuser/.credfile

答案1

经过 3 天的搜索和测试,我开发了一个可行的解决方案——适用于 Debian-Jessie、Linux Mint、i386(32 位)安装。我有网络 cifs 共享,如果不首先卸载这些共享,则会挂起关闭或重新启动 120 秒。使用此脚本,我不必在重新启动或关闭之前手动卸载共享。

自动 cifs umount 脚本,在关机和重新启动时运行

  • 创建以下脚本/etc/init.d/aaaumount (脚本按数字和字母顺序执行,这就是 的原因aaa,所以它首先运行):

    #!/bin/sh
    
    #
    # aaaumount initscript
    #
    ### BEGIN INIT INFO
    # Provides:          aaaumount
    # Required-Start:    $local_fs $remote_fs
    # Required-Stop:     $remote_fs
    # Default-Start:     S
    # Default-Stop:      0 1 6
    # Short-Description: umounts cifs shares
    # Description:       This script unmounts cifs shares
    ### END INIT INFO
    
    case "$1" in
     stop)
                umount -t cifs -af
    esac
    
  • 使其可执行:

    sudo chmod 755 /etc/init.d/aaaumount
    
  • 在 /lib/systemd/system/ 中创建指向服务的符号链接:

    cd /lib/systemd/system/
    sudo ln -s /dev/null aaaumount.service
    
  • /etc/rc0.d在和中创建符号链接/etc/rc6.d06是关闭/重新启动运行级别):

    sudo ln -s /etc/init.d/aaaumount /etc/rc0.d/K01aaaumount 
    sudo ln -s /etc/init.d/aaaumount /etc/rc6.d/K01aaaumount 
    
  • 激活它:

    sudo systemctl enable aaaumount.service
    

答案2

将挂载选项添加_netdev到 中的远程文件系统/etc/fstab。之后,systemctl daemon-reload这应该使您的网络安装remote-fs.target;的依赖项用 来检查systemctl list-dependencies remote-fs.target。在网络关闭之前,此类文件系统将被卸载。

答案3

经过一番尝试和错误后,我想wpa_supplicant.service,在 Ubuntu 16.04 上,我的系统使用 Wi-Fi 所必需的,并没有真正由 systemd 管理(并且其 systemd 单元被“禁用”)。它似乎是通过 DBus 启动的。我还是不知道为什么,但它被关闭了 network-online.targetnetwork.target

最后,为了确保我的驱动器正确卸载,我将其添加After=graphical.target到安装单元中。为此,您可以添加x-systemd.requires=graphical.target到文件中的选项/etc/fstab,如下所示:

请注意,您需要安装实用程序(在我的例子中为mount.cifs)来忽略以 开头的选项,这在6.5 版本之前x-不是这种情况。mount.cifs

相关内容