umount - o dispositivo está ocupado

14

Às vezes, quando eu quero desmontar um dispositivo, por exemplo

sudo umount /dev/loop0

Vou receber a mensagem

umount: /mnt: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

Normalmente, resolvo esse problema fechando uma janela do console (no meu caso, xfce4-terminal) e depois umount.

O que esse problema significa? Existe alguma solução mais inteligente?

xralf
fonte
2
Isso acontece, por exemplo, se você ainda estiver em um shell no diretório em que o dispositivo está montado.
Klapaucius
Não me lembro se eu estava lá, mas tentei e você está certo, isso aconteceu.
Xralf

Respostas:

14

Isso significa que algum processo tem um diretório de trabalho ou um identificador de arquivo aberto abaixo do ponto de montagem. A melhor coisa a fazer é encerrar o processo incorreto, alterar seu diretório de trabalho ou fechar o identificador do arquivo antes de desmontar.

Existe uma alternativa no Linux. Usando umount -lchamadas uma desmontagem "preguiçosa". O sistema de arquivos ainda estará montado, mas você não poderá vê-lo ou usá-lo, exceto pelos processos que já o estão usando. Quando o programa incorreto sair (por qualquer meio), o sistema "concluirá" a desmontagem do sistema de arquivos.

bahamat
fonte
2
Existe uma maneira de descobrir qual processo possui o identificador de arquivo aberto e deve ser finalizado?
Xralf
4
Usar lsofé provavelmente o melhor caminho.
bahamat 1/09/11
1
por exemplo lsof | grep loop0?
xralf 2/09/11
Não, grep para o ponto de montagem. Ele deve listar todos os arquivos abaixo. Eu não acho que ele mostrará coisas que simplesmente têm um diretório de trabalho sob o ponto de montagem, portanto não é um método perfeito.
bahamat 2/09/11
7

Você também pode usar fuserpara matar todos os processos usando o sistema de arquivos montado.

fuser -cuk /mnt

Opções:

-c     
    Same as -m option, used for POSIX compatibility.

-u, --user
    Append the user name of the process owner to each PID.

-k, --kill
    Kill  processes accessing the file. Unless changed with -SIGNAL, SIGKILL is sent. An fuser process
    never kills itself, but may kill other fuser processes. The  effective  user  ID  of  the  process
    executing fuser is set to its real user ID before attempting to kill.kill.

-m NAME, --mount NAME
    NAME specifies a file on a mounted file system or a block device that is  mounted.  All  processes
    accessing  files  on  that  file  system  are  listed.   If  a  directory file is specified, it is
    automatically changed to NAME/. to use any file system that might be mounted on that directory.

Verifique você mesmo no explicashell .

sys0dm1n
fonte
3

Dada a sua "solução usual", isso significa que o shell que você está executando na janela do console tem um diretório em um sistema de arquivos naquele dispositivo como o diretório de trabalho atual.

Linux e Unixes em geral, desejam muito manter um sistema de arquivos montado se um processo tiver um diretório de trabalho atual nesse sistema de arquivos.

Você pode apenas usar cdna janela do console para sair de um diretório dentro ou abaixo, em /mntvez de matar a janela do console e o shell sendo executado dentro dele.

Bruce Ediger
fonte
0

Descobri uma situação que pode interferir na desmontagem de um dispositivo que compartilharei como resposta, mesmo que essa pergunta seja muito antiga.

Se você tiver compartilhamentos NFS hospedados na máquina, e qualquer um desses compartilhamentos NFS for suportado pelo dispositivo que você está tentando desmontar, será necessário parar de compartilhá-los (o melhor é interromper o serviço NFS, por exemplo, sudo service nfs-kernel-server stopnas versões recentes do Ubuntu ) O servidor NFS pode não aparecer no lsof ou no fusor, o que pode dificultar a identificação do problema.

Wug
fonte