Montando um volume de rede quando o Wi-Fi é configurado

2

Eu tenho algumas pastas compartilhadas na minha rede que gostaria de ter montado no meu Raspberry Pi 2 depois de inicializar. Eu editei meu /etc/fstab e se eu executar manualmente o mount -a , eu consigo ter acesso a eles. Eu encontrei diferentes "soluções" na internet, mas nenhuma parece estar funcionando para mim.

Como uma solução rápida, criei um script que monta esses volumes (com mount -a ) e os adiciona ao meu .bashrc ; então quando eu me conecto via ssh com esse usuário, eu tenho acesso a eles.

Eu tentei adicionar esse script a /etc/network/if-up.d/ , mas parece que não está funcionando. Por que isto não está funcionando? Qual é a melhor maneira de fazer isso?

P.S .: Estou usando uma versão osmc do Raspbian (não tenho certeza se isso é apenas Raspbian com um serviço "osmc" ou uma distribuição diferente). Então, quando eu corro uname -a , eu obtenho:

Linux osmc 4.2.1-1-osmc #1 SMP PREEMPT Wed Sep 23 17:57:49 UTC 2015 armv7l GNU/Linux
    
por makeMonday 20.10.2015 / 17:15

1 resposta

1

Às vezes, descobrir por que os mecanismos que devem funcionar não funcionam é mais trabalho do que apenas fazer o que você precisa para fazer outra maneira mais à prova de balas .

Você deseja montar uma pasta compartilhada durante a inicialização, mas obviamente é necessário aguardar até que a rede esteja ativa (observe que "rede" e "a rede está ativa" tendem a ser coisas muito diferentes dos serviços de inicialização do WRT). A maneira canônica de fazer isso é obviamente via ifup ou um serviço de inicialização com dependência de um serviço que deveria estabelecer a conexão de rede (novamente, distinta de "rede"). Mas já decidimos que esses mecanismos não são confiáveis neste caso por qualquer motivo.

Para criar um método mais "à prova de balas", precisamos reduzir essa tarefa a seus elementos mais básicos e recorrer ao uso de ferramentas de shell para lidar com esses elementos de maneira básica e fundamental. Isso pode começar com algum tipo de teste para determinar se a rede está ativa e aguardando até que o teste seja bem-sucedido.

Ou podemos ignorar esse teste e testar o resultado de mount , que falhará se o compartilhamento de rede estiver indisponível.

#!/bin/bash                                                                          

exec &> /var/log/mountshare.log                                                      

gap=3                                                                                
attempts=40                                                                           

while [ $attempts -gt 0 ]; do                                                        
    mount -v /foo /bar                                                                  
    if [ $? -eq 0 ]; then break; fi                                                   
    attempts=$(($attempts - 1))                                                      
    sleep $gap                                                                       
done

Para explicar:

  • exec &> /var/log/mountshare.log redireciona toda a saída desse script para um arquivo, sobrescrevendo qualquer versão anterior. Isso é um bashismo, e é por isso que a linha shebang não é simplesmente #!/bin/sh . No entanto, usar o bash em um sistema linux normal é geralmente uma aposta segura.

  • O valor de gap e attempts significa que isso será tentado a cada três segundos por dois minutos - bastante tempo. Você poderia definir a diferença para um, se quiser. Esta é uma tarefa incrivelmente pequena que pode ser executada para sempre em intervalos de um segundo sem prejudicar o sistema.

  • A linha mount é específica (obviamente você precisa personalizar isso). Como você sabe exatamente o que deseja fazer, é preferível mount -a e garante que nosso teste seja mais à prova de balas. Se você tiver uma listagem no fstab, poderá usar um argumento (o caminho do dispositivo ou outro identificador), mas, novamente, o uso de um comando específico e completo é fácil e satisfaz melhor os critérios à prova de balas .

  • O teste, if [ $? -eq 0 ] , verifica o status de saída de mount . Quando é bem sucedido, retorna 0; quando falha, retorna algum outro valor. Observe que mount irá cuspir um erro nesse caso, e essa saída terminará no arquivo de log. Como usamos -v , ele também produzirá uma mensagem quando a chamada for bem-sucedida.

  • As próximas duas linhas diminuem o contador ( attempts ) e adicionam uma suspensão. O sono é muito importante. Não faça isso sem dormir. Sem isso, isso passa de uma "tarefa incrivelmente pequena que pode realmente durar para sempre" para algo que consumirá muito tempo do processador.

Para usar isso, coloque-o, por exemplo, /usr/local/bin . Certifique-se de que seja de propriedade root.root ( sudo chown root:root mountmyshare.sh ) e executável ( chmod 755 mountmyshare.sh ). Você pode colocá-lo em qualquer lugar se não quiser em $PATH , pois vamos usar um caminho absoluto e à prova de balas para invocá-lo de qualquer maneira.

Em seguida, na parte superior de /etc/rc.local :

/usr/local/bin/mountmyshare.sh &

O & é crítico; isso bifurca isso no fundo. Eu disse "colocar no topo" no caso de você ter outras coisas que podem estragar tudo. Isso não vai estragar nada.

Embora /etc/rc.local seja uma espécie de mecanismo legado, ele ainda é executado no final da sequência de inicialização em todos os sistemas Linux razoavelmente normais, até onde eu saiba.

    
por 21.10.2015 / 14:23