在网络共享上安装/卸载环回设备的最佳实践?

在网络共享上安装/卸载环回设备的最佳实践?

我正在寻找一种在网络驱动器上自动挂载和卸载磁盘映像(即环回文件)的首选方法。

不幸的是,/etc/init.d/umountnfs它不检查环回设备。因此,当尝试卸载承载环回文件的网络驱动器时,关机序列会卡住。

另一方面,如何确保环回文件在系统启动时可用,即如何影响启动过程中文件系统挂载顺序

答案1

安装顺序通常由 中的最后一个整数字段决定/etc/fstab。例如:

UUID=XXX / ext4    errors=remount-ro,noatime,nodiratime 0 1

这里最后一个整数字段将决定顺序(越小,越早)。因此,您可能希望 nfs mount 在这里具有某种顺序(例如 2),而 loopback 的顺序高于此(例如 3)。但是,使用 nfs 时,复杂之处在于它们仅在网络设备完全启动后才安装,并且可能不会作为常规的一部分发生/etc/init/mountall.conf。因此,我们必须将 loopback 设备与即将启动或关闭的接口绑定在一起。

这通常由 中的脚本完成/etc/network/if-up.d。但是 NFS 挂载将在后台进行,因为它由 upstart 作业控制,/etc/init/mountall-net.conf该作业在网络设备启动时简单地向 mountall 发送信号以尝试重新加载所有网络文件系统。发送信号后似乎会有延迟,所以我猜像这样等待的脚本应该可以工作:

#!/bin/sh

ntries=10
while [ $ntries -gt 0 ]; do
  if findmnt <nfs-mount-point> >/dev/null 2>/dev/null; then
    if findmnt <loop-mount-point> >/dev/null 2>/dev/null; then
      # loop already mounted; nothing to be done
      :
    else
      mount -t loop <loop-file> <loop-mount-point>
    fi
    break
  else
    sleep 1
    ntries="`expr $ntries - 1`"
  fi
done

(将<nfs-mount-point><loop-mount-point>、替换<loop-file>为实际值)这将以 1 秒为间隔等待 10 秒以挂载 NFS。正如我提到的那样,将它放在脚本/etc/network/if-up.d后面的顺序中是自然的upstart,但我们最好在后台启动以避免等待,因为 upstart mount 将通过 信号在后台进行/etc/init/mountall-net.conf。因此,将此脚本放在 /usr/local/bin 中,使其可执行(即使在其他情况下也允许执行)并添加/etc/network/if-up.d/zzz-local(您应该首先通过使用 手动运行来检查脚本是否按预期工作sudo mountloop.sh):

#!/bin/sh

/usr/local/bin/mountloop.sh &

(将 zzz-local 设为可执行文件)卸载由 sysv 任务完成/etc/init.d/umountnfs.sh。我们需要做的是添加一个脚本来卸载顺序号小于该顺序号的循环设备。因此添加/etc/init.d/umountloop.sh如下内容:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          umountloop
# Required-Start:
# Required-Stop:     umountnfs
# Should-Stop:       $network $portmap nfs-common
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Unmount network loop filesystems.
# Description:       Unmount network loop filesystems.
### END INIT INFO

umount <loop-mount-point>

(替换为实际值并使脚本可执行)在我的系统中,umountnfs.sh 的顺序是 31(/etc/rc0.d/S31umountnfs.sh/etc/rc6.d/S31umountnfs.sh),因此我们将赋予它一个较小的数字:

sudo update-rc.d umountloop.sh start 30 0 6 .

编辑:我之前在 mountloop.sh 脚本中犯了一个错误。它应该是mount -o loop而不是mount -t loop。另外,umountloop.sh 应该将“Default-Start:”写成“0 6”,而不是注释中的“Default-Stop:”,这样才准确,不过这不会有什么坏处,而且我大部分内容都是从有同样错误的 umountnfs.sh 中复制过来的。

答案2

通常,顺序是根据此文件决定的:gksu gedit /etc/fstab 请创建此文件的一个备份,然后根据需要编辑它。编辑时要非常小心。要卸载驱动器,请执行 sudo umount -l mountpoint 或 sudo umount -I mountpoint

谢谢。

相关内容