Que utilitário usar para limpar depois que um disco é desconectado de repente?

2

No caso de um disco rígido externo estar fisicamente desconectado e o dispositivo ser montado usando o mapeador de dispositivos, nenhuma limpeza será feita.

Em particular:

  • o diretório em que a unidade foi montada está vazio
  • a montagem ainda está presente no mount (8)
  • os dispositivos mapeadores de dispositivos ainda estão presentes
  • o dispositivo físico ainda está presente como /dev/sd*

Nesse cenário, sem limpar os itens acima, as três primeiras etapas precisam de limpeza manual (via umount, dmsetup remove e udevadm trigger --system-match = block). Mesmo assim, o diretório sysfs do disco ainda está presente em /sys/bus/scsi/drivers/sd e você precisa fazer o eco manualmente de 1 > excluir para garantir que o dispositivo SCSI não tenha registro. Sem isso, a replicação do disco de volta não funciona.

Então, minha pergunta é: existe um programa que possa detectar quando um disco físico mapeado por dispositivo não está mais respondendo e executando a limpeza necessária?

    
por vladsharp 19.01.2011 / 17:51

1 resposta

1

Eu não estou ciente de um programa para fazer isso para você, no entanto eu tinha um dispositivo em um estágio que periodicamente acabaria neste estado, desconectando-se de repente. Ele se reconectaria bem depois de percorrer manualmente as etapas descritas acima, minha solução contava com a observação de que, quando acontecia, o ponto de montagem mostrava-se vazio, embora o sistema ainda acreditasse que algo estava montado.

Minha solução, coloque um arquivo vazio simples na unidade cuja presença poderia ser verificada por um script de shell e automaticamente limpa. Eu não tenho mais a unidade ou o shell script completo, mas posso dar-lhe um exemplo básico de como criar o seu próprio e adicionar os comandos que você precisou executar para limpar manualmente quando você fez isso.

Note que neste exemplo eu usarei / mnt / externalhd como o ponto de montagem e presumo que o arquivo que estamos procurando é chamado .isonline em seu sistema de arquivos raiz. Você pode verificar a presença de um arquivo existente na unidade, assumindo que ela nunca será alterada durante a operação. Observe que a instrução if também verifica a entrada / dev para que não criemos um loop de limpezas enquanto esperamos que o dispositivo reconecte, localizando e usando os discos corretamente. A entrada / dev / disk / by-uuid / * seria mais precisa no entanto e essencial se a ordem de conexão dos seus dispositivos puder variar um problema que felizmente nunca tive.

if [ ! -e /mnt/externalhd/.isonline ] && [ -e /dev/sdb ]; then {
   # This line optionally logs the disconnect to a file for your records.
   echo "'date '+%d %b %Y %H:%M:%S'' OFFLINE: /dev/sdb disconnected, cleaning up" >> /var/log/externalhd.log

   # Do whatever you need to do to clean up the bad unmount and enable reconnection

   # Optionally log the completion of the cleanup process
   echo "'date '+%d %b %Y %H:%M:%S'' CLEANUP: /dev/sdb cleanup process completed" >> /var/log/externalhd.log
}
fi

Espero que ajude, estou um pouco confuso sobre os comandos que tive que executar para concluir a limpeza completa e parece que eu deletei o script antigo quando a própria unidade finalmente morreu. Depois de configurar o script com os comandos que você precisa executar para limpar sua unidade, eles serão os mesmos que você usa ao fazer isso manualmente, embora deva descartar a parte sudo deles.

O script pode então ser executado via cron para fazer uma verificação regular de uma desmontagem incorreta e limpá-la automaticamente sempre que uma for detectada. Supondo que o script seja salvo em / home / user / cleanumount, as etapas a seguir podem adicionar uma tarefa cron para ele. O exemplo executará a verificação a cada 5 minutos.

Primeiro, execute o seguinte comando: sudo crontab -u root -e

Você pode ser solicitado a selecionar um editor de texto de uma lista, pressionando um número de um menu, se assim for, basta escolher o seu editor preferido pressionando o número correspondente.

Em seguida, adicione as duas linhas seguintes ao seu crontab (A linha superior é um comentário opcional, mas recomendado, para que você saiba o que ele faz).

# Run /home/user/cleanumount every 5 minutes to cleanly unmount /dev/sdb after sudden disconnects
*/5 * * * *    /home/user/cleanumount

Em seguida, salve seu arquivo e saia do editor de texto. O novo crontab será automaticamente instalado e carregado no daemon do cron.

No caso de 5 minutos não ser freqüente o suficiente, você pode ajustar a primeira parte da linha, alterá-la para um simples * para executar a cada minuto ou, por exemplo, * / 2 para cada 2 minutos * / 3 para cada 3 minutos e assim por diante. Informações mais detalhadas sobre o crontab podem ser encontradas executando man 5 crontab

Espero que você ache isso útil, ou seja, a menos que alguma outra pessoa inteligente venha com uma ferramenta bacana para tornar toda essa informação que escrevi para você redundante se for tão fantástica:)

    
por MttJocy 19.01.2011 / 19:41