Auto-montagem de compartilhamentos CIFS no laptop

7

Já vi perguntas semelhantes a esta feitas antes em várias variações, mas ainda não encontrei uma resposta satisfatória.

Veja o que eu tenho:

  • Um laptop Debian altamente móvel que alterna as redes com freqüência.
  • Um servidor FreeNAS em casa com um monte de compartilhamentos CIFS.

Aqui está o que eu quero:

  • Se eu acessar o diretório de compartilhamento CIFS quando estiver em casa, monte automaticamente o compartilhamento CIFS.
  • Se eu acessar o compartilhamento CIFS quando estiver em outro lugar, retorne um erro imediatamente (ou seja, não pense na rede por cinco minutos antes de descobrir que o NAS não está lá).
  • Quando eu suspender ou hibernar a máquina, desmonte de forma limpa o compartilhamento de modo que a montagem não esteja apontando para o ar quando a máquina acordar novamente. Se o compartilhamento não puder ser desmontado corretamente (um processo está usando um diretório):
    • Aborte a suspensão / hibernação e me diga quem está acampando no monte; ou
    • Forçar a desmontagem de qualquer maneira e continuar com o suspend / hibernate.
  • Crédito extra: quando a conexão de rede cair (puxe o plugue ou perca a associação com o WAP), tente desmontar o compartilhamento.
  • Crédito extra: essa mágica deve ser independente do gerenciador de rede em uso.

Nenhuma das várias opções sobre as quais li parece ser apropriada:

  • autofs parece ser confiável, mas parece não ter nenhum conhecimento sobre suspensão / hibernação.
  • A opção _netdev em mount e /etc/fstab parece interessante, mas parece se aplicar apenas a compartilhamentos NFS.
  • Ainda não consegui fazer com que gvfs funcione, mas ainda não me esforcei muito.

Alguma sugestão sobre como abordar isso?

ADENDO:

Aqui está a versão curta do que acabei fazendo até agora. Instalei autofs e escrevi um pequeno script shell para forçar a expiração de todos os volumes montados automaticamente, que são chamados sempre que uma interface de rede fica inativa.

Eu criei um mapa automounter para meu servidor CIFS, com as credenciais armazenadas em um arquivo externo (yuck). Eu então escrevi o seguinte script de shell:

#!/bin/sh -e

# Expire everything in the automounter.
if [ -f /var/run/autofs.pid ]; then
    kill -USR1 "$(cat /var/run/autofs.pid)"
fi

Enviar o sinal USR1 para o daemon do automount faz com que ele expire todas as montagens não usadas. Em seguida, coloquei esse script em /etc/network/if-down.d/autofs , com um link em /etc/network/if-post-down.d/autofs . O NetworkManager invoca todos os scripts no último diretório quando uma conexão cai, portanto, qualquer sistema de arquivos montado automaticamente deve ser desmontado.

Eu não estou muito feliz com o acordo, no entanto. Para começar, autofs não faz distinção entre volumes montados automaticamente e, ao receber USR1, desmontará todos volumes inativos, incluindo volumes que não sejam de rede, o que é bastante pesado.

Além disso, a senha de login do servidor CIFS deve ser armazenada em um arquivo. Eu preferiria muito mais ser solicitado.

De qualquer forma, foi o que eu juntei até agora. Funciona, mas ficarei feliz em usar algo melhor ...

    
por ewhac 10.12.2013 / 11:47

1 resposta

2

Se você usa o NetworkManager, é possível escrever scripts que são executados em uma interface de rede que está chegando ou diminuindo.

NetworkManager will execute scripts in the /etc/NetworkManager/dispatcher.d directory in alphabetical order in response to network events. Each script should be (a) a regular file, (b) owned by root, (c) not writable by group or other, (d) not set-uid, (e) and executable by the owner. Each script receives two arguments, the first being the interface name of the device just activated, and second an action.

Detecte sua própria rede de, por exemplo, o domínio de pesquisa e, em seguida, monte ou desmonte quando a interface ficar on-line:

#!/bin/bash
#/etc/NetworkManager/dispatcher.d/mount-my-cifs    
case "$2" in
  up)
    # some logic to detect if we're at home
    grep "search myhome.local" /etc/resolv.conf
    if [ "$?" != "0" ] ; then 
       exit
    else 
       mount /mnt/cifs
    fi
    ;;
  down)
       umount /mnt/cifs
    ;;
esac
    
por 10.12.2013 / 14:37