A ordem de montagem será normalmente determinada pelo último campo inteiro em /etc/fstab
. Por exemplo:
UUID=XXX / ext4 errors=remount-ro,noatime,nodiratime 0 1
Aqui, o último campo inteiro determinará a ordem (quanto menor, quanto mais cedo). Então você provavelmente quer que o nfs mount tenha algum pedido aqui (por exemplo, 2) e loopback maior do que esse (por exemplo, 3). No entanto, com o nfs, a complicação pode ser que eles sejam montados somente depois que os dispositivos de rede estiverem totalmente ativados e talvez não aconteçam como parte do /etc/init/mountall.conf
normal. Portanto, devemos ter o dispositivo de loopback, em vez disso, vinculado à interface subindo ou descendo.
Isso geralmente é feito por scripts em /etc/network/if-up.d
. Mas a montagem do NFS acontecerá em segundo plano, uma vez que é governada pela tarefa inicial em /etc/init/mountall-net.conf
, que simplesmente envia um sinal para a montagem para tentar recarregar todos os sistemas de arquivos da rede sempre que um dispositivo de rede é ativado. Parece que haverá atraso após o envio do sinal, então eu acho que um script que vai esperar assim deve funcionar:
#!/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
(substitua <nfs-mount-point>
, <loop-mount-point>
, <loop-file>
pelos valores reais)
Isso aguarda 10 segundos em intervalo de 1 segundo para que o NFS seja montado. Como eu mencionei o lugar natural para colocá-lo em /etc/network/if-up.d
ordenado depois do script upstart
lá, mas é melhor lançarmos em segundo plano para evitar esperar especialmente porque a montagem upstart acontecerá em segundo plano através de um sinal por /etc/init/mountall-net.conf
. Portanto, coloque este script em / usr / local / bin, torne-o executável (permitindo executar até mesmo o contrário) e adicione /etc/network/if-up.d/zzz-local
(você deve primeiro verificar se o script funciona como esperado executando manualmente com sudo mountloop.sh
):
#!/bin/sh
/usr/local/bin/mountloop.sh &
(torne o zzz-local como executável)
O umount é feito pela tarefa /etc/init.d/umountnfs.sh
sysv. O que precisamos fazer é adicionar um script para desmontar um dispositivo de loop com um número de pedido menor que isso. Então, adicione /etc/init.d/umountloop.sh
como:
#! /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>
(substitua pelo valor real e torne o script executável)
A ordem de umountnfs.sh é 31 no meu sistema ( /etc/rc0.d/S31umountnfs.sh
, /etc/rc6.d/S31umountnfs.sh
), portanto, daremos um número menor:
sudo update-rc.d umountloop.sh start 30 0 6 .
Edit: Eu cometi um erro no script mountloop.sh antes. Deve ter sido mount -o loop
e não mount -t loop
. Além disso, o umountloop.sh deve ter "Default-Start:" como "0 6" e não em "Default-Stop:" nos comentários para ser preciso, embora não vá atrapalhar e eu copiei principalmente de umountnfs.sh que tem o mesmo erro.