Como desmontar um dispositivo ocupado

244

Eu tenho algumas unidades de samba que estão sendo acessadas por vários usuários diariamente. Eu já tenho código para reconhecer unidades compartilhadas (de uma tabela SQL) e montá-las em um diretório especial onde todos os usuários possam acessá-las.

Eu quero saber, se eu remover uma unidade da minha tabela SQL (colocando-a efetivamente offline) como ou há uma maneira de desmontar um dispositivo ocupado? Até agora, descobri que qualquer forma de umountnão funciona.

Ignorando a possibilidade de destruir dados - é possível desmontar um dispositivo que está sendo lido no momento?

Máx.
fonte
3
Uma resposta mais geral abordando mais causas para a falha umount é encontrado aqui oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Tange
2
Olá, provavelmente você cdmontou dir, então você se tornou root ou logon novamente e o outro shell está preso. Faça exitem todas as conchas.
Smeterlink

Respostas:

456

SIM!! Existe uma maneira de desconectar um dispositivo ocupado imediatamente (mesmo se estiver ocupado e não puder ser desmontado com força). Você pode limpar tudo mais tarde:

umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)

NOTA:

  1. Esses comandos podem interromper um processo em execução, causar perda de dados OU arquivos abertos corrompidos. Os programas que acessam os arquivos DEVICE / NFS de destino podem gerar erros OU não funcionar corretamente após a desmontagem forçada.
  2. Tente executar esses comandos quando NÃO estiver dentro da pasta / unidade / dispositivo montados.
Amit Verma
fonte
22
Nota: -laqui está uma letra minúscula L(para "desmontagem lenta"). (Veja esta resposta relacionada .)
ジョージ
4
Trabalhou. Uma nuance, se você estiver conectado através do cliente FTP, precisará fazer logout para desmontar a pasta com êxito.
Alexander Kim
Eles não funcionam. Os dois ficam para sempre. (Debian 8, cifs-utils 2: 6.4-1)
Hubro 28/09
1
-l/ --lazyVai abrir arquivos não corruptos, mas no Linux, parece que você não pode saber quando o dispositivo é realmente desmontado e pode ser removido
Tom Hale
1
Meio assustador. Desmontei preguiçosamente e remontei enquanto outros processos ainda o acessavam. Então eu acho que montei duas vezes no final no mesmo local? Não tenho certeza do que isso fez.
sudo
120

Se possível, vamos localizar / identificar o processo ocupado, encerrar o processo e desmontar o compartilhamento de samba para minimizar os danos.

  • lsof | grep '<mountpoint of /dev/sda1>' (ou qualquer que seja o dispositivo montado)

  • pkill target_process(mata proc. ocupado por nome | kill PID| killall target_process)

  • umount /dev/sda1 (ou qualquer que seja o dispositivo montado)

Frank Tudor
fonte
6
Isso não retorna nada. Estou assumindo que é porque é uma unidade de rede e não consigo ver os processos de outros computadores acessando a unidade. O mesmo acordo com os comandos "fusor".
Max
oh inferno ... você precisa dos comandos samba ... / usr / bin / smbclient service <password>: Veja se isso faz você começar ... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor
2
Os comandos smb foram realmente descontinuados e substituídos por "umount.cifs" .... o que também não funciona. Parece que eu estou preso por não ser capaz de desmontar enquanto está ocupado.
Max
Se você estiver usando o Asuswrt-Merlin, precisará instalar lsof:# opkg install lsof
Tonatio 24/07
1
você precisa sudo lsof para obter alguns resultados
aheigins
78

Verifique se você ainda não está no dispositivo montado ao tentar desmontar.

Luci
fonte
4
Exatamente, simplesmente ter pasta atual (localizado no dispositivo de destino) aberta em seu terminal (através, por exemplo comando cd) é enaugh para parar o processo unmnounting :)
jave.web
2
Sim, eu tinha um shell rodando em um diretório no dispositivo.
Fechei
Além disso, verifique se não há outros pontos de montagem dentro do que você está tentando umount.
victe 19/07/19
@victe Obrigado; Eu estava usando uma pasta no pfexec mount -F vboxfs carpetacompartida ~ / Documents on Solaris 11; mas Documents tinha subpastas e esse era o problema.
Dani Aya
44

Tente o seguinte, mas antes de executá-lo, observe que o -ksinalizador eliminará todos os processos em execução, mantendo o dispositivo ocupado.

A -ibandeira faz fuserperguntar antes de matar.

fuser -kim /address  # kill any processes accessing file
unmount /address
user3751769
fonte
5
lsof | grep '/dev/<my-device>não retornou nada, mas isso funciona muito bem! Você também pode sugerir fuser -m /dev/<my-device>caso queira descobrir o processo antes de matá-lo.
Modulitos
3
A execução do comando fusor me desconectou imediatamente do VPS.
Giorgio79 # 30/16
21

Evitar umount -l

No momento da redação deste artigo, a resposta mais votada recomenda o uso umount -l.

umount -lé perigoso ou, na melhor das hipóteses, inseguro . Em suma:

  • Na verdade, ele não desmonta o dispositivo, apenas remove o sistema de arquivos do espaço para nome. Gravações para abrir arquivos podem continuar.
  • Pode causar corrupção no sistema de arquivos btrfs

Solução alternativa / alternativa

O comportamento útil de umount -locultar o sistema de arquivos do acesso por nomes de caminho absolutos , minimizando assim o uso adicional de pontos de referência.

Esse mesmo comportamento pode ser alcançado montando um diretório vazio com permissões 000sobre o diretório a ser desmontado.

Em seguida, quaisquer novos acessos aos nomes de arquivos no ponto de montagem abaixo atingirão o diretório recém-sobreposto com zero permissões - assim, novos bloqueadores para desmontar serão impedidos.

Primeiro tente remount,ro

A principal conquista desmontada a ser desbloqueada é a remontagem somente leitura. Quando você recebe o remount,roemblema, você sabe que:

  1. Todos os dados pendentes foram gravados no disco
  2. Todas as futuras tentativas de gravação falharão
  3. Os dados estão em um estado consistente, se você precisar desconectar fisicamente o dispositivo.

mount -o remount,ro /dev/device é garantido que falhe se houver arquivos abertos para gravação , então tente isso diretamente. Você pode estar se sentindo com sorte, punk!

Se você não tiver sorte, concentre-se apenas nos processos com arquivos abertos para gravação :

lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'

Você poderá consertar o dispositivo somente leitura e garantir um estado consistente.

Se você não conseguir remontar somente leitura neste momento, investigue algumas das outras possíveis causas listadas aqui .

Realização de remontagem somente leitura desbloqueada 🔓☑

Parabéns, seus dados no ponto de montagem agora são consistentes e protegidos de futuras gravações.

Por que fuseré inferior alsof

Por que não usar o uso fuseranteriormente? Bem, você poderia ter, mas fuseropera em um diretório , não em um dispositivo ; portanto, se você deseja remover o ponto de montagem do espaço para nome do arquivo e ainda usá- fuserlo, precisará:

  1. Duplicar temporariamente o ponto de montagem com mount -o bind /media/hdd /mntpara outro local
  2. Oculte o ponto de montagem original e bloqueie o espaço para nome:

Aqui está como:

null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"

# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked.  https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"

# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"

# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"

Você teria então:

  1. O espaço para nome original oculto (não foi possível abrir mais arquivos, o problema não pode piorar)
  2. Um diretório montado de ligação duplicado (em oposição a um dispositivo) no qual executar fuser.

Isso é mais complicado [1] , mas permite que você use:

fuser -vmMkiw <mountpoint>

que solicitará interativamente para interromper os processos com arquivos abertos para gravação. Obviamente, você poderia fazer isso sem ocultar o ponto de montagem, mas as opções acima imitam umount -l, sem nenhum dos perigos.

A -wopção se restringe aos processos de gravação e -ié interativa; portanto, após uma remontagem somente leitura, se você estiver com pressa, poderá usar:

fuser -vmMk <mountpoint>

para matar todos os processos restantes com arquivos abertos sob o ponto de montagem.

Felizmente, neste momento, você pode desmontar o dispositivo. (Você precisará executar umounto ponto de montagem duas vezes se tiver vinculado um 000diretório de modo na parte superior.)

Ou use:

fuser -vmMki <mountpoint>

para eliminar interativamente os processos somente leitura restantes, bloqueando a desmontagem.

Droga, eu ainda entendo target is busy!

Os arquivos abertos não são o único bloqueador de desmontagem. Veja aqui e aqui outras causas e seus remédios.

Mesmo se você tiver algum gremlin oculto que o impeça de desmontar completamente o dispositivo, você terá pelo menos seu sistema de arquivos em um estado consistente.

Você pode usar lsof +f -- /dev/devicepara listar todos os processos com arquivos abertos no dispositivo que contém o sistema de arquivos e depois matá-los.


[1] É menos complicado de usar mount --move, mas isso requer o mount --make-private /parent-mount-pointque tem implicações . Basicamente, se o ponto de montagem estiver montado no /sistema de arquivos, você deve evitar isso.

Tom Hale
fonte
1
Se --lazyé tão perigoso, por que não existe um aviso na umountpágina de manual? Tudo o que diz é "
Desmontagem lenta
7

Verifique os sistemas de arquivos NFS exportados com exportfs -v. Se encontrado, remova com o diretório exportfs -d share: /. Eles não aparecem na lista fusor / lsof e podem impedir que umount seja bem-sucedido.

numberer6
fonte
1
Obrigado por este conselho. Eu tive que usar o exportfs -ua para remover a trava.
FuePi
6

Confira umount2:

O Linux 2.1.116 adicionou a chamada de sistema umount2 (), que, como umount (), desmonta um destino, mas permite sinalizadores adicionais que controlam o comportamento da operação:

MNT_FORCE (desde Linux 2.1.116) Força a desmontagem, mesmo que ocupado. (Somente para montagens NFS.) MNT_DETACH (desde Linux 2.4.11) Execute uma desmontagem lenta: torne o ponto de montagem indisponível para novos acessos e efetue a desmontagem quando o ponto de montagem deixar de estar ocupado. MNT_EXPIRE (desde Linux 2.6.8) Marque o ponto de montagem como expirado. Se um ponto de montagem não estiver em uso no momento, uma chamada inicial para umount2 () com esse sinalizador falhará com o erro EAGAIN, mas marcará o ponto de montagem como expirado. O ponto de montagem permanece expirado, desde que não seja acessado por nenhum processo. Uma segunda chamada umount2 () especificando MNT_EXPIRE desmonta um ponto de montagem expirado. Este sinalizador não pode ser especificado com MNT_FORCE ou MNT_DETACH. Valor de retorno

Em caso de sucesso, zero é retornado. Em caso de erro, -1 é retornado e errno é definido adequadamente.

chown
fonte
Infelizmente, essas não são montagens NFS, mas CIFS. Vou tentar o MNT_DETACH embora. No entanto, se umount -l não funcionasse, não posso imaginar que isso seria muito diferente. Obrigado embora!
Max
2

Alguém mencionou que se você estiver usando o terminal e seu diretório atual estiver dentro do caminho que deseja desmontar, você receberá o erro.
Como complementar, nesse caso, você lsof | grep path-to-be-unmounteddeve ter uma saída abaixo:

bash ... path-to-be-unmounted
Eugene
fonte
1

Outra alternativa quando tudo funciona é editar /etc/fstab, adicionar noautosinalizador e reiniciar a máquina. O dispositivo não será montado e, quando terminar de fazer o que for, remova o sinalizador e reinicie novamente.

jesjimher
fonte
0

Resposta de nicho:

Se você tiver um pool zfs nesse dispositivo, pelo menos quando for um pool baseado em arquivo, lsofnão mostrará o uso. Mas você pode simplesmente correr

sudo zpool export mypoo

e depois desmonte.

lucidbrot
fonte