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).
Se 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
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:
- ps — este 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
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ê. 😉