Come smontare un dispositivo occupato


246

Ho alcune unità samba a cui accedono quotidianamente più utenti. Ho già il codice per riconoscere le unità condivise (da una tabella SQL) e montarle in una directory speciale in cui tutti gli utenti possono accedervi.

Voglio sapere, se rimuovo un'unità dalla mia tabella SQL (portandola effettivamente offline) come, o addirittura, c'è un modo per smontare un dispositivo occupato? Finora ho scoperto che qualsiasi forma di umountnon funziona.

Ignorando la possibilità di distruggere i dati - è possibile smontare un dispositivo attualmente in fase di lettura?


3
Una risposta più generale che affronta più cause per il mancato umount si trova qui oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Tange

2
Ciao, probabilmente hai cdmontato dir, poi sei diventato root o accedi di nuovo e l'altra shell è intrappolata. Fare exitsu tutte le conchiglie.
Smeterlink

Risposte:


458

SÌ!! C'è un modo per staccare immediatamente un dispositivo occupato (anche se è occupato e non può essere smontato con forza). Puoi pulire tutto in seguito:

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

NOTA:

  1. Questi comandi possono interrompere un processo in esecuzione, causare perdita di dati o file aperti corrotti. I programmi che accedono ai file DEVICE / NFS di destinazione possono generare errori O non possono funzionare correttamente dopo lo smontaggio forzato.
  2. Prova a eseguire questi comandi quando NON è installato nella cartella / unità / dispositivo montata.

22
Nota: -lecco una minuscola L(per "smontaggio pigro"). (Vedi questa risposta correlata .)
ジ ョ ー ジ

4
Lavorato. Una sfumatura, se si è effettuato l'accesso tramite client FTP, è necessario disconnettersi per smontare correttamente la cartella.
Alexander Kim,

Non funzionano. Entrambi si fermano per sempre. (Debian 8, cifs-utils 2: 6.4-1)
Hubro,

1
-l/ --lazynon corromperà i file aperti, ma su Linux sembra che tu non sappia quando il dispositivo è effettivamente smontato e può essere rimosso
Tom Hale

1
Kinda spaventoso. Ho smontato-smontato e poi rimontato mentre alcuni altri processi stavano ancora accedendo ad esso. Quindi immagino di averlo montato due volte alla fine nella stessa posizione? Non sono sicuro di quello che ha fatto.
sudo,

121

Se possibile, localizziamo / identifichiamo il processo occupato, uccidiamo il processo e quindi smontiamo la condivisione samba per ridurre al minimo i danni.

  • lsof | grep '<mountpoint of /dev/sda1>' (o qualunque sia il dispositivo montato)

  • pkill target_process(uccide il proc. occupato per nome | kill PID| killall target_process)

  • umount /dev/sda1 (o qualunque sia il dispositivo montato)


6
Questo non restituisce nulla. Suppongo sia perché è un'unità di rete e non riesco a vedere i processi di altri computer che accedono all'unità. Stesso affare con i comandi "fusore".
Max

oh diavolo ... hai bisogno dei comandi samba ... / usr / bin / smbclient service <password>: vedi se questo ti fa iniziare ... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor

2
I comandi smb sono stati in realtà deprecati e sostituiti da "umount.cifs" .... che inoltre non funziona. Sembra che sono bloccato per non essere in grado di smontare mentre è occupato.
Max

Se si utilizza Asuswrt-Merlin, è necessario installare lsof:# opkg install lsof
Tonatio

1
devi ottenere lsof per ottenere alcuni risultati
aheigins

78

Assicurarsi di non essere ancora nel dispositivo montato quando si tenta di smontare.


4
Esatto, basta semplicemente aprire la cartella corrente (posizionata sul dispositivo di destinazione) nel terminale (tramite, ad esempio, il comando cd), per fermare il processo incoerente :)
jave.web

2
Sì, avevo una shell in esecuzione in una directory sul dispositivo. Chiusa la finestra del terminale e voilà
sh78

Inoltre, assicurati che non ci siano altri punti di montaggio all'interno di quello che stai provando umount.
victe

@victe Grazie; Mouting una cartella usando mount pfexec -F vboxfs carpetacompartida ~ / Documents on Solaris 11; ma Documents aveva sottocartelle ed era il problema.
Dani Aya,

44

Prova quanto segue, ma prima di eseguirlo nota che il -kflag ucciderà tutti i processi in esecuzione mantenendo occupato il dispositivo.

La -ibandiera fa fuserchiedere prima di uccidere.

fuser -kim /address  # kill any processes accessing file
unmount /address

5
lsof | grep '/dev/<my-device>non ha restituito nulla, ma funziona alla grande! Potrebbe voler suggerire anche fuser -m /dev/<my-device>nel caso in cui desideri scoprire il processo prima di ucciderlo.
Modulitos,

3
L'esecuzione del comando fuser mi ha immediatamente disconnesso dal VPS.
giorgio79,

21

Evitare umount -l

Al momento in cui scrivo, la risposta più votata consiglia l'utilizzo umount -l.

umount -lè pericoloso o nella migliore delle ipotesi non sicuro . In sintesi:

  • In realtà non smonta il dispositivo, rimuove semplicemente il filesystem dallo spazio dei nomi. Le scritture per aprire i file possono continuare.
  • Può causare la corruzione del file system btrfs

Aggirare / alternativa

Il comportamento utile di umount -lsta nascondendo il filesystem dall'accesso tramite nomi di percorso assoluti , minimizzando così ulteriormente l'utilizzo di moutpoint.

Questo stesso comportamento può essere ottenuto montando una directory vuota con autorizzazioni 000sulla directory da smontare.

Quindi eventuali nuovi accessi ai nomi dei file nella parte inferiore del mountpoint colpiranno la directory appena sovrapposta con zero permessi - i nuovi blocchi allo smontaggio vengono quindi impediti.

Prima prova remount,ro

Il principale risultato di smontaggio da sbloccare è il rimontaggio di sola lettura. Quando ottieni il remount,robadge, sai che:

  1. Tutti i dati in sospeso sono stati scritti su disco
  2. Tutti i tentativi di scrittura futuri falliranno
  3. I dati sono in uno stato coerente, se è necessario scollegare fisicamente il dispositivo.

mount -o remount,ro /dev/device è garantito un errore se ci sono file aperti per la scrittura , quindi prova subito. Potresti sentirti fortunato, punk!

Se sei sfortunato, concentrati solo sui processi con file aperti per la scrittura :

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

Dovresti quindi essere in grado di rimontare il dispositivo in sola lettura e garantire uno stato coerente.

Se non riesci a rimontare di sola lettura a questo punto, esamina alcune delle altre possibili cause elencate qui .

Obiettivo di re-mount in sola lettura sbloccato 🔓☑

Congratulazioni, i tuoi dati sul mountpoint sono ora coerenti e protetti da future scritture.

Perché fuserè inferiore alsof

Perché non usarlo fuserprima? Bene, si potrebbe avere, ma fuserfunziona su una directory , non su un dispositivo , quindi se si desidera rimuovere il mountpoint dallo spazio del nome del file e continuare a utilizzarlo fuser, è necessario:

  1. Duplica temporaneamente il mountpoint mount -o bind /media/hdd /mntin un'altra posizione
  2. Nascondi il punto di montaggio originale e blocca lo spazio dei nomi:

Ecco come:

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"

Avresti quindi:

  1. Lo spazio dei nomi originale nascosto (non è possibile aprire altri file, il problema non può peggiorare)
  2. Una directory montata con binding duplicato (anziché un dispositivo) su cui eseguire fuser.

Questo è più contorto [1] , ma ti permette di usare:

fuser -vmMkiw <mountpoint>

che chiederà in modo interattivo di interrompere i processi con file aperti per la scrittura. Certo, potresti farlo senza nascondere affatto il punto di montaggio, ma quanto sopra imita umount -l, senza alcun pericolo.

L' -winterruttore si limita ai processi di scrittura e -iè interattivo, quindi dopo un rimontaggio di sola lettura, se hai fretta puoi usare:

fuser -vmMk <mountpoint>

per terminare tutti i processi rimanenti con i file aperti sotto il mountpoint.

Spero che a questo punto sia possibile smontare il dispositivo. (Dovrai eseguire umountil mountpoint due volte se hai associato una 000directory mode in cima.)

Oppure usa:

fuser -vmMki <mountpoint>

per uccidere in modo interattivo i restanti processi di sola lettura bloccando lo smontaggio.

Accidenti, ho ancora target is busy!

I file aperti non sono l'unico blocco smontaggio. Vedi qui e qui per altre cause e i loro rimedi.

Anche se hai qualche gremlin in agguato che ti impedisce di smontare completamente il dispositivo, almeno il tuo filesystem è in uno stato coerente.

È quindi possibile utilizzare lsof +f -- /dev/deviceper elencare tutti i processi con file aperti sul dispositivo contenente il file system e quindi eliminarli.


[1] È meno contorto da usare mount --move, ma ciò richiede mount --make-private /parent-mount-pointquali implicazioni . Fondamentalmente, se il mountpoint è montato sotto il /filesystem, dovresti evitarlo.


1
Se --lazyè così pericoloso, perché non c'è un avviso nella umountpagina man? Tutto ciò che dice è " Smontaggio pigro. Stacca ora il filesystem dalla gerarchia dei file e ripulisci tutti i riferimenti a questo filesystem non appena non è più occupato. "
Bitinerant

7

Controlla i file system NFS esportati con exportfs -v. Se trovato, rimuovi con exportfs -d share: / directory. Questi non vengono visualizzati nell'elenco dei fuser / lsof e possono impedire il successo di umount.


1
Grazie per questo consiglio Ho dovuto usare exportfs -ua per rimuovere il blocco.
FuePi,

6

Dai un'occhiata umount2:

Linux 2.1.116 ha aggiunto la chiamata di sistema umount2 (), che, come umount (), smonta un target, ma consente flag aggiuntivi che controllano il comportamento dell'operazione:

MNT_FORCE (da Linux 2.1.116) Forza lo smontaggio anche se occupato. (Solo per montaggi NFS.) MNT_DETACH (da Linux 2.4.11) Esegui uno smontaggio pigro: rendi il punto di montaggio non disponibile per i nuovi accessi ed esegui effettivamente lo smontaggio quando il punto di montaggio cessa di essere occupato. MNT_EXPIRE (da Linux 2.6.8) Contrassegna il punto di montaggio come scaduto. Se un mount point non è attualmente in uso, una chiamata iniziale a umount2 () con questo flag fallisce con l'errore EAGAIN, ma contrassegna il mount point come scaduto. Il punto di montaggio rimane scaduto finché non è accessibile da alcun processo. Una seconda chiamata umount2 () che specifica MNT_EXPIRE smonta un punto di montaggio scaduto. Questo flag non può essere specificato con MNT_FORCE o MNT_DETACH. Valore di ritorno

In caso di successo, viene restituito zero. In caso di errore, viene restituito -1 e errno è impostato in modo appropriato.


Purtroppo non si tratta di montaggi NFS, ma di CIFS. Proverò MNT_DETACH però. Tuttavia, se umount -l non ha funzionato, non posso immaginare che sarebbe molto diverso. Grazie comunque!
Max

2

Qualcuno ha detto che se si utilizza il terminale e la directory corrente si trova all'interno del percorso che si desidera smontare, verrà visualizzato l'errore.
Come complemento, in questo caso, lsof | grep path-to-be-unmounteddevi avere un output inferiore:

bash ... path-to-be-unmounted

1

Un'altra alternativa quando qualcosa funziona è la modifica /etc/fstab, l'aggiunta di noautoflag e il riavvio della macchina. Il dispositivo non verrà montato e quando hai finito di fare qualsiasi cosa, rimuovi la bandiera e riavvia nuovamente.


0

Risposta di nicchia:

Se si dispone di un pool zfs su quel dispositivo, almeno quando si tratta di un pool basato su file, lsofnon verrà mostrato l'utilizzo. Ma puoi semplicemente correre

sudo zpool export mypoo

e quindi smontare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.