Como desmontar um drive ocupado em 2 passos – Elias Praciano
Categories
Tutoriais Ubuntu

Como desmontar um drive ocupado em 2 passos

Se você está tentando desconectar um dispositivo USB, um pendrive ou remover um DVD e ele demora muito (e, aparentemente, nada acontece) é por que algo errado pode estar acontecendo.
Há várias situações em que um dispositivo pode parar de responder às suas tentativas de remoção (desmontar, ejetar etc.) — a mais comum é que ele esteja sendo retido por algum programa (processo).
usb flash media pendriveSe um processo ainda estiver escrevendo/lendo dados, ele vai “tentar” impedir que você desconecte o dispositivo — seja um CD/DVD/Blu-Ray, um pendrive, um cartão de memória, um HD externo etc.
O ideal é esperar — se você estiver lidando com transferências volumosas entre dispositivos, boa parte destes dados pode estar armazenada no cache do sistema, aguardando disponibilidade para concluir a transação.
Ou seja, mesmo que você não perceba qualquer atividade de tráfego de dados no sistema, ela pode, sim, ainda estar ocorrendo — e desconectar um drive nestas condições é extremamente arriscado.
Neste post, vou mostrar como lidar, de forma segura, com esta situação.

Feche os programas relacionados ao dispositivo

Você está ouvindo música no pendrive ou no cartão de memória?
Está editando algum texto ou planilha armazenada no dispositivo?
Em casos assim, o dispositivo está em uso pelo programa em execução e impedir que ele seja retirado é uma medida de segurança do sistema — para evitar que você perca os seus dados e/ou danifique o sistema de arquivos do dispositivo.
Feche todos os programas abertos e aguarde uns instantes — e tente ejetar novamente.
Se isto ainda não resolveu, prossiga a leitura.

Como resolver o problema

A minha primeira opção é o comando sync. Sua função é escoar os dados retidos no buffer do sistema de arquivos, pro dispositivo de destino.
Na maioria das vezes, tudo se resolve com este comando.
Comece por abrir um terminal e execute o comando:

sudo sync

Aguarde alguns instantes.
Se isto não resolver, tente o que segue:
Localize o dispositivo, com o comando mount:

mount
/dev/sda2 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/pstore type pstore (rw)
/dev/sda1 on /home type ext4 (rw)
systemd on /sys/fs/cgroup/systemd type cgroup (rw, noexec, nosuid, nodev, none, name=systemd)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw, nosuid, nodev, user=justincase)
/dev/sdc1 on /mnt type ext4 (rw)

Vou usar como exemplo o dispositivo destacado acima /dev/sdc1, que está montado na diretório /mnt.
Para tentar desmontá-lo, use o seguinte comando:

sudo umount /dev/sdc1

comandos mount umount linux ubuntu
comando mount retornou erro
Se este método não funcionou, você vai precisar descobrir qual(is) processo(s) está(ão) retendo o dispositivo — e decidir o que fazer com ele(s).

Como determinar qual processo está ocupando o dispositivo

A idéia é justamente esta: identificar quem está ocupando o drive e “pedir para ele parar”.
Neste artigo, vou abordar 3 métodos para identificar e resolver o problema:

  • pseste comando exibe um relatório instantâneo sobre os processos em execução.
  • lsof — este comando é usado para listar os arquivos em aberto. Ele pode apontar se há algum programa mantendo um arquivo aberto em seu pendrive.
  • fuser — identifica processos que estejam usando arquivos ou sockets.

O comando PS

O ps, em conjunto com o comando grep, pode resolver esta situação em um piscar de olhos.
Adéque a linha de comando, abaixo, à sua realidade:

ps aux | grep -i "/mnt"

No exemplo acima, eu inquiri o sistema sobre os processos em execução com ps aux e filtrei o resultado, para ver apenas o que se referia à pasta em que o dispositivo /dev/sdc1 está montado: /mnt. Veja o resultado:

justinc+  8233  2.8  0.1  83016  3012 pts/30   Sl   20:06   0:04 mpg123 /mnt/Música/REO Speedwagon - discography/1971 R.E.O. Speedwagon/01 Gypsy Woman's Passion.mp3
justinc+  8264  0.0  0.0   4956   848 pts/30   S+   20:09   0:00 grep --color=auto -i /mnt

Quem está mantendo o meu dispositivo ocupado é o player mpg123 — e a identificação do processo 8233.
Para interromper este aplicativo, use o comando kill:

kill -9 8233

Use lsof para listar os arquivos abertos (opened files)

Vou usar um método semelhante ao que usei antes com o comando ps, combinando-o com um filtro grep:

lsof | grep -i "/mnt/"

Tenha um pouco de paciência — este comando pode demorar um pouco para apresentar os seus resultados.
Novamente, o player de músicas mpg123 aparece na lista, com o seu PID. Veja:

mpg123    13424       justincase    8r      REG       8,33    9695544  5505285 /mnt/Música/REO Speedwagon - discography/1971 R.E.O. Speedwagon/02 157 Riverside Avenue.mp3
threaded- 13424 13427 justincase    8r      REG       8,33    9695544  5505285 /mnt/Música/REO Speedwagon - discography/1971 R.E.O. Speedwagon/02 157 Riverside Avenue.mp3

Use o comando kill para terminar o processo (note que o PID – Process IDentification – mudou):

kill -9 13424

Use o fuser para encontrar o processo que está usando o seu dispositivo

O último método é o meu preferido.
O comando fuser pode ser usado para identificar processos que estejam mantendo arquivos abertos ou ocupando sockets. Veja como usar:

fuser -m /dev/sdc1

O resultado, no meu sistema foi o seguinte:

/dev/sdc1:            6740c 13702

O último número, é o do PID — que vamos informar ao comando kill:

kill -9 13702

como usar o comando fuser
Se necessário, preceda o comando kill com o sudo — para ter privilégios administrativos:

sudo kill -9 13702

Outras soluções com umount

Se o problema persistir, você pode tentar “remontar” um dispositivo em modo “somente leitura” (read-only) – o que causará menos danos ao seu sistema de arquivos, se for removido arbitrariamente (use o sudo, se necessário):

sudo umount -rv /dev/sdc1
[sudo] password for justincase: 
umount: /dev/sdc1 está ocupado - remontado somente para leitura

Se você obtiver sucesso nisto, já pode desconectar o drive ou a mídia.
As soluções que seguem são variantes do comando umount e você combinar os parâmetros e as opções para obter o melhor resultado.
Elas não funcionam não funcionam em kernels anteriores ao 2.4:
Para forçar a remoção:

sudo umount -vf /dev/sdc1

Remover imediatamente o sistema de arquivos do dispositivo junto a todas as referências, tão logo ele se desocupe:

sudo umount -l /dev/sdc1

Combinando as duas:

sudo umount -lf /dev/sdc1

Espero que uma destas soluções funcione para você. 😉

By Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como "Rick and Morty" e "BoJack Horseman".
Me siga no Twitter e vamos trocar ideias!