Pergunta

Linux: qual o processo está causando "dispositivo ocupado" ao fazer umount

Foi útil?

Solução

Olhe para os lsof comando (lista de arquivos abertos) - pode dizer-lhe os processos que estão segurando o que aberto. Às vezes é complicado, mas muitas vezes algo tão simples como sudo lsof | grep (your device name here) poderia fazer isso por você.

Outras dicas

Apenas no caso de ... Às vezes acontece que você está chamando umount do terminal, e seu diretório atual pertence ao sistema de arquivos montado.

Você deve usar o comando fusor .

Por exemplo. fuser /dev/cdrom irá devolver o PID (s) do processo utilizando /dev/cdrom.

Se você está tentando desmontar, você pode matar teses processar usando o interruptor -k (veja man fuser).

Verifique se há dispositivos de loop aberto mapeadas para um arquivo no sistema de arquivos com "losetup -a". Eles não vão aparecer com qualquer lsof ou fusão.

Além disso, verifique /etc/exports. Se você estiver exportando caminhos dentro do ponto de montagem via NFS, ele vai te dar esse erro ao tentar desmontar e nada vai aparecer em fuser ou lsof.

lsof +f -- /mountpoint

(como listas dos processos usando arquivos no Monte montado em / mountpoint. Particularmente útil para encontrar qual processo (s) está usando um stick USB ou CD / DVD montado.

lsof e fuser são realmente duas maneiras de encontrar o processo que mantém uma certa abertura de arquivo. Se você quiser apenas umount para ter sucesso, você deve investigar a sua -f e opções -l.

Isso é exatamente por isso que a "fusão -m / mount / point" existe.

BTW, eu não acho que "fusão" ou "lsof" indicará quando um recurso é realizada pelo módulo do kernel, embora eu geralmente não têm essa questão ..

lsof e do fusor não me deu nada.

Depois de um processo de renomear todos os diretórios possíveis para .old e reiniciar o sistema cada vez que depois de ter feito mudanças que eu encontrei um diretório específico (relacionado com postfix), que era o responsável.

Acontece que eu tinha feito uma vez um link simbólico de / var / spool / postfix para / disk2 / pers / mail / postfix / varspool, a fim de minimizar escritas de disco em um sistema de arquivos raiz baseada SDCARD (Sheeva plug).

Com este link simbólico, mesmo depois de parar os serviços postfix e dovecot (ambos ps aux, bem como -tuanp netstat não mostrou qualquer coisa relacionada) Eu não era capaz de desmontar / DISK2 / pers.

Quando eu removi o link simbólico e atualizados os arquivos postfix e configuração dovecot para apontar diretamente para os novos diretórios em / DISK2 / pessoa / I foi capaz de parar com sucesso os serviços e desmontar o diretório.

Da próxima vez vou olhar mais de perto a saída de:

ls -lR /var | grep ^l | grep disk2

O comando acima irá listar recursivamente todos os links simbólicos em uma árvore de diretório (aqui a partir de / var) e filtrar aqueles nomes que apontam para um alvo específico ponto de montagem (aqui disk2).

Abrir arquivos

Processos com arquivos abertos são os culpados usuais. Exibi-los:

lsof +f -- <mountpoint or device>

Há uma vantagem de usar /dev/<device> em vez de /mountpoint:. Um ponto de montagem irá desaparecer após um umount -l, ou pode ser escondida por um sobreposto montar

fuser também pode ser usado, mas a minha mente lsof tem uma saída mais útil. No entanto fuser é útil quando se trata de matar os processos causando seus dramas para que você possa continuar com sua vida.

Lista de arquivos em <mountpoint> (veja ressalva acima):

fuser -vmM <mountpoint>

interativamente matar apenas processa com arquivos abertos para escrita:

fuser -vmMkiw <mountpoint>

Depois de remontar somente leitura (mount -o remount,ro <mountpoint>), é seguro (r) para matar todos os processos restantes:

fuser -vmMk <mountpoint>

Mountpoints

O culpado pode ser o próprio kernel. Outro sistema de arquivos montado no sistema de arquivos que você está tentando umount causará dor. Verifique com:

mount | grep <mountpoint>/

Para montagens loopback, verifique também a saída de:

losetup -la

inodes anônimos (Linux)

anônimos inodes pode ser criado por:

  • Os arquivos temporários (open com O_TMPFILE)
  • inotify relógios
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Estes são o tipo mais evasivo de pokemon, e aparecem na coluna lsof de TYPE como a_inode (que não está documentada no página homem lsof ).

Eles não vão aparecer em lsof +f -- /dev/<device>, assim que você vai precisar:

lsof | grep a_inode

Para matar processos segurando inodes anônimos, consulte: lista atual relógios inotify (nome de caminho, PID)

Se você ainda não desmontar ou pode remontar o dispositivo depois de parar todos os serviços e processos com arquivos abertos, então pode haver um arquivo de swap ou partição swap manter seu dispositivo ocupado. Isso não vai aparecer com fuser ou lsof. Desligue trocar com:

sudo swapoff -a

Você pode verificar com antecedência e mostrar um resumo de todas as partições ou arquivos de swap com:

swapon -s

ou

cat /proc/swaps

Como uma alternativa ao uso do sudo swapoff -a comando, você pode também ser capaz de desativar a troca por parar um serviço ou systemd unidade. Por exemplo:

sudo systemctl stop dphys-swapfile

ou

sudo systemctl stop var-swap.swap

No meu caso, desligando troca era necessária, além de parar todos os serviços e processos com arquivos aberto para escrita, para que eu pudesse remontar minha partição raiz como somente leitura, a fim de executar fsck na minha partição raiz sem reinicializar. Isso foi necessário em um Pi Raspberry correndo Raspbian Jessie.

Sistemas de arquivos montados no sistema de arquivos que você está tentando desmontar pode causar o erro target is busy para além de quaisquer arquivos que estão em uso. (Por exemplo, quando você mount -o bind /dev /mnt/yourmount/dev Para utilizar chroot lá.)

Para saber quais sistemas de arquivos são montados no sistema de arquivos executar o seguinte:

mount | grep '/mnt/yourmount'

Para saber quais arquivos estão em uso o conselho já sugerido por outros aqui:

lsof | grep '/mnt/yourmount'

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top