Desmontando dispositivos destacáveis (eSATA, armazenamento USB) no Linux

4

Um dispositivo destacável como eSATA, drive USB pode ser removido abruptamente (simplesmente puxando o plugue).

Se houver identificadores de arquivos abertos em uma partição, essas partições não serão desmontadas, ou seja, o comando umount do Linux falhará, mesmo DEPOIS de a unidade estar fisicamente desconectada.

Se a desmontagem falhar, em seguida, na reconexão do dispositivo, o mount falhará também. Então você tem que descobrir quais processos estão usando a unidade e matá-los ou fechar todas as alças. Se você não conseguir fazer isso, terá que reinicializar a caixa para montar sua unidade. E eu definitivamente não posso matar o processo usando isso.

Não vejo nenhuma opção "force unmount", há uma opção -f , mas é apenas para o NFS.

Isso soa muito estranho, o Linux não acomoda esse cenário em que um usuário simplesmente pega uma unidade? Alguém sabe como lidar com esse cenário normalmente no Linux?

Existe alguma maneira de descobrir quais identificadores de arquivo estão abertos em uma partição / dispositivo em particular ou liberar e fechar seletivamente todas as alças de arquivo somente para um dispositivo específico?

Nota: O comando lsof não está disponível no Linux embarcado que estou usando (busybox).

"fusor" não está disponível no meu Linux incorporado.

Eu tentei o preguiçoso -l. No entanto, não parece consistentemente funcionar. Diga por exemplo Eu mantenho um identificador de arquivo aberto (com "tail -f" em algum arquivo no dispositivo). Então eu desanexar uma unidade e então faço "umount -l" e desmonta. Em seguida, reconecto a unidade e tento montá-la novamente no mesmo ponto de montagem, enquanto a cauda ainda está em execução. Não funciona de forma consistente. Às vezes, é bem-sucedido e às vezes não. Isso me deixa desconfortável usando a opção preguiçosa e se ela deixar o sistema de arquivos em estado inconsistente. E também não tenho certeza se essa opção preguiçosa deveria ser usada para tais cenários.

Eu não posso matar o processo que tem identificadores de arquivos abertos.

Parece que se eu montei o dispositivo em say / mnt / abc e se eu desconectar a unidade e depois reconectar, o Linux parece reconectar o sistema de arquivos do dispositivo ao mesmo ponto de montagem "/ mnt / abc", sem nos fazendo desmontar ou montar. E então as mesmas antigas alças de arquivos abertos parecem começar a funcionar após a reconexão (pelo menos para a operação de leitura de arquivos). Esta é minha observação. Não tenho certeza se esse é o comportamento esperado. No entanto, isso também não parece estar funcionando de forma consistente.

Eu tinha um identificador de arquivo aberto para leitura ("tail -f") que deixei aberto, desmembramento e recolocado e modifiquei o arquivo sendo seguido e vi a saída "tail -f" sendo atualizada com as alterações . No entanto, se eu tentar modificar um arquivo após o dispositivo ter desaparecido (ele fornecerá o erro esperado) e, em seguida, eu reconectar, o sistema de arquivos do dispositivo não será reconectado corretamente ao mesmo ponto de montagem. Em caso de gravação de um arquivo (enquanto o dispositivo não estava lá), ele não parece estar funcionando.

Existe algum comportamento padrão / consistente que o Linux segue quando uma unidade é removida abruptamente sem fechar todas as alças e desmontar corretamente todas as partições?

    
por solidstate 07.09.2011 / 10:58

4 respostas

3

Você pode escrever um script bash para verificar todos os descritores de arquivos listados em /proc (suponha que você tenha isso) e listar / matar os processos.

/proc/$m/fd/$n é o n-ésimo descritor de arquivo para o PID m apresentado como um link simbólico. busybox tem suporte a readlink, então você deve poder automatizá-lo.

Editar: só para dizer que isso é essencialmente reimplementar lsof , mas na verdade é bastante simples.

    
por 08.09.2011 / 01:37
2

Você pode usar lsof para listar arquivos abertos em um determinado diretório usando lsof +D /path/to/mountpoint .

    
por 07.09.2011 / 11:28
1

Você já tentou: %código% Ou

%código% ?

Ok, minhas sugestões anteriores não funcionaram. Eu sei que pode ser estúpido, mas você já tentou: %pr_e%

De acordo com a documentação do Busybox, esta deve ser a opção de desmontagem de força (mostrando o NFS como um exemplo).

Se isso não funcionar, você já tentou: %pr_e%

    
por 07.09.2011 / 16:31
0

Uma solução rápida quando você não tem lsof seria find /proc/*/fd | xargs readlink | grep /mount_point substituindo mount_point pelo ponto de montagem real. Isso é baseado na resposta billc.cn acima.

    
por 05.08.2015 / 15:50