Ao executar umount /path
, recebo:
umount: /path: device is busy.
O sistema de arquivos é enorme, portanto lsof +D /path
não é uma opção realista.
lsof /path
,, lsof +f -- /path
e fuser /path
todos não retornam nada. fuser -v /path
dá:
USER PID ACCESS COMMAND
/path: root kernel mount /path
o que é normal para todos os sistemas de arquivos montados não utilizados.
umount -l
e umount -f
não é bom o suficiente para a minha situação.
Como faço para descobrir por que o kernel acha que esse sistema de arquivos está ocupado?
fuser -vm /path
...--force
se esforçará mais para desmontar e /-v
ou-vvv
até reavaliará mais qual é o problema com a montagem. Então tente:umount -vvv --force /babdmount
Respostas:
Parece que a causa do meu problema foi a
nfs-kernel-server
exportação do diretório. Onfs-kernel-server
provavelmente vai atrás das arquivos abertos normais e, portanto, não está listado porlsof
efuser
.Quando parei o diretório,
nfs-kernel-server
pudeumount
.Fiz uma página com exemplos de todas as soluções até agora aqui: http://oletange.blogspot.com/2012/04/umount-device-is-busy-why.html
fonte
sudo service samba stop
primeiro, sua resposta realmente ajudou!sudo service nfs stop
e você pode (não) também precisar fazersudo exportfs -u
para não exportar. Lembre-se de entãosudo exportfs -r
esudo service nfs start
reexportar e reiniciar o serviço.exportfs -u
o diretório em questão.Para adicionar BruceCran do comentário acima, o motivo de minha manifestação deste problema agora era um velho montagem de auto-retorno. Eu já havia verificado a saída de
fuser -vm <mountpoint>
/lsof +D <mountpoint>
,mount
ecat /proc/mounts
verificado se algum servidor antigo do nfs-kernel estava em execução, desativado cotas, tentado (mas falhado)umount -f <mountpoint>
e quase me resignado a abandonar o tempo de atividade de 924 dias antes de finalmente verificar a saída delosetup
e encontrando dois envelhecer loopbacks configurado-but-não-montados:então
Uma postagem no fórum do Gentoo também lista os arquivos de troca como um possível culpado; embora a troca para arquivos seja provavelmente muito rara atualmente, não custa nada verificar a saída de
cat /proc/swaps
. Não tenho certeza se as cotas poderiam impedir uma desmontagem - eu estava agarrando canudos.fonte
Em vez de usar lsof para rastrear o sistema de arquivos, use a lista total de arquivos abertos e faça o grep. Acho que esse retorno deve ser mais rápido, embora seja menos preciso. Deve fazer o trabalho.
fonte
lsof /path
, eu disselsof | grep '/path'
. A diferença é que lsof sem argumentos mostra todos os arquivos abertos usando algum tipo de tabela de cache, e o grep é muito rápido em pesquisar por ela. O que você tentou com lsof faz com que ele varra o sistema de arquivos, o que leva muito tempo.lsof /path
olha apenas o caminho. Ele não analisa todos os arquivos. Geralmente, é muito mais rápido do quelsof | grep /path
(no meu teste não científico, foi 20 vezes mais rápido no YMMV), pois não analisa todos os arquivos abertos, mas apenas os arquivos desse caminho.lsof /path
não rendi nada, enquantolsof | grep /path
me mostrava o processo que estava mantendo arquivos abertos e me impedindo de desmontar o volume.Para mim, o processo ofensivo foi um daemon rodando em um chroot. Porque estava em um chroot,
lsof
efuser
não o encontraria.Se você suspeitar que ainda tem algo em execução em um chroot,
sudo ls -l /proc/*/root | grep chroot
encontrará o culpado (substitua "chroot" pelo caminho para o chroot).fonte
sudo ls -l /proc/*/status | grep HOST
onde HOST é o nome do host da prisãolsof /mountpoint
e osfuser /mountpoint
dois encontram um processo, mesmo que chrootados.Abrir arquivos
Processos com arquivos abertos são os culpados de sempre. Mostre-os:
Há uma vantagem em usar, em
/dev/<device>
vez de/mountpoint
: um ponto de montagem desaparece após umumount -l
ou pode ser oculto por um suporte sobreposto.fuser
também pode ser usado, mas na minha opiniãolsof
tem uma saída mais útil. No entanto,fuser
é útil quando se trata de matar os processos que causam seus dramas, para que você possa continuar sua vida.Liste os arquivos
<mountpoint>
(veja a advertência acima):Interaja apenas com processos abertos com arquivos abertos para gravação:
Após remontar somente leitura (
mount -o remount,ro <mountpoint>
), é seguro (r) eliminar todos os processos restantes:Pontos de montagem
O culpado pode ser o próprio kernel. Outro sistema de arquivos montado no sistema de arquivos que você está tentando
umount
causar luto. Verificar com:Para montagens de loopback, verifique também a saída de:
Inodes anônimos (Linux)
Inodes anônimos podem ser criados por:
open
comO_TMPFILE
)Estes são o tipo mais evasivo de pokemon, e aparecem em
lsof
'sTYPE
coluna comoa_inode
(o que não é documentado nalsof
página do manual ).Eles não aparecerão
lsof +f -- /dev/<device>
, então você precisará:Para processos de eliminação que contêm inodes anônimos, consulte: Listar os relógios atuais para identificação (nome do caminho, PID) .
fonte
Para que o fusor relate os PIDs que mantêm uma montagem aberta, é necessário usar -m
fonte
lsof /path
fornece a mesma lista de PIDs quefuser -m /path
.fuser -M /path
irá verificar se/path
é um ponto de montagem.Temos um sistema proprietário em que o sistema de arquivos raiz normalmente é somente leitura. Ocasionalmente, quando os arquivos precisam ser copiados, é remontado para leitura e gravação:
E depois remontou de volta:
Desta vez, no entanto,
mount
continuou dando omount: / is busy
erro. Isso foi causado por um processo que mantinha um descritor aberto em um arquivo que havia sido substituído por algum comando, que foi executado quando o sistema de arquivos foi lido / gravado. A linha importante dalsof -- /
saída é (os nomes foram alterados):Observe o
DEL
na saída. Simplesmente reiniciar o processo segurando o arquivo excluído resolveu o problema.fonte
lsof
efuser
também não me deu nada.Após um processo de renomear todos os diretórios possíveis para .old e reiniciar o sistema todas as vezes que fiz alterações, encontrei um diretório específico (relacionado ao postfix) responsável.
Aconteceu que uma vez eu fiz um link simbólico de
/var/spool/postfix
para/disk2/pers/mail/postfix/varspool
para minimizar gravações de disco em um sistema de arquivos raiz baseado em SDCARD (Sheeva Plug).Com este link simbólico, mesmo depois de parar o
postfix
edovecot
serviços (tantops aux
assim comonetstat -tuanp
não mostra nada relacionado) não foi capaz deunmount /disk2/pers
.Quando removi o link simbólico e atualizei os arquivos
postfix
edovecot
config para apontar diretamente para os novos diretórios,/disk2/pers/
consegui parar com êxito os serviços eunmount
o diretório.Na próxima vez, examinarei mais atentamente a saída de:
O comando acima listará recursivamente todos os links simbólicos em uma árvore de diretórios (aqui começando em
/var
) e filtrará os nomes que apontam para um ponto de montagem de destino específico (aqui disco2).fonte
Eu tive esse problema e, no fundo, havia sessões de tela ativas que eu desconhecia. Eu me conectei à outra sessão de tela ativa e seu shell ainda não estava no diretório montado. Matar essas outras sessões de shell corrigiu o problema para mim.
Apenas pensei em compartilhar minha resolução.
fonte
Hoje o problema era um soquete aberto (especificamente
tmux
):fonte
Eu tenho um par de
bind
eoverlay
monta sob o meu monte que estava me bloqueando, verifique a conclusão da aba para a montagem de ponto que você deseja desmontar. Eu suspeito que foi a montagem de sobreposição em particular, mas poderia ter sido também os vínculosfonte
Isso é mais uma solução alternativa do que uma resposta, mas estou publicando para o caso de ajudar alguém.
No meu caso, eu estava tentando modificar o LVM, pois queria aumentar a partição / var, por isso precisava desmontá-la. Eu tentei todos os comentários e respondi neste post (obrigado a todos e principalmente ao @ ole-tange por reuni-los) e ainda recebi o erro "o dispositivo está ocupado".
Também tentei matar a maioria dos processos na ordem especificada no nível de execução 0, caso a ordem fosse relevante no meu caso, mas isso também não ajudou. Então, o que fiz foi criar um nível de execução personalizado (combinando a saída do chkconfig em novos comandos chkconfig --level) que seria muito semelhante ao 1 (modo de usuário único), mas com recursos de rede (com rede ssh e xinet).
Como eu estava usando o redhat, o nível de execução 4 está marcado como "não utilizado / definido pelo usuário", então usei esse e execute
init 4
No meu caso, estava tudo bem, pois eu precisava reiniciar o servidor em qualquer caso, mas provavelmente será esse o caso de alguém mexendo nos discos.fonte