Se possibile, localizziamo/identifichiamo il processo occupato, interrompiamo quel processo e poi unmount
la condivisione/l'unità samba per ridurre al minimo i danni:
-
lsof | grep '<mountpoint of /dev/sda1>'
(o qualunque sia il dispositivo montato) -
pkill target_process
(chiude il processo occupato per nome |kill PID
|killall target_process
) -
umount /dev/sda1
(o qualunque sia il dispositivo montato)
Evita umount -l
Al momento della scrittura, la risposta più votata consiglia di utilizzare umount -l
.
umount -l
è pericoloso o nella migliore delle ipotesi non sicuro . In sintesi:
- In realtà non smonta il dispositivo, rimuove solo il filesystem dallo spazio dei nomi. Le scritture sui file aperti possono continuare.
- Può causare la corruzione del filesystem btrfs
Soluzione/alternativa
Il comportamento utile di umount -l
nasconde il filesystem dall'accesso da parte di assoluto percorsi, riducendo così al minimo l'ulteriore utilizzo di moutpoint.
Questo stesso comportamento può essere ottenuto montando una directory vuota con permessi 000
sulla directory da smontare.
Quindi qualsiasi nuovo accesso ai nomi di file al di sotto del punto di montaggio raggiungerà la directory appena sovrapposta con zero autorizzazioni:i nuovi blocchi allo smontaggio vengono quindi impediti.
Prima prova a remount,ro
Il principale risultato di smontaggio da sbloccare è il rimontaggio di sola lettura. Quando ottieni il remount,ro
distintivo, sai che:
- Tutti i dati in sospeso sono stati scritti su disco
- Tutti i futuri tentativi di scrittura falliranno
- I dati sono in uno stato coerente, nel caso tu abbia bisogno di disconnettere fisicamente il dispositivo.
mount -o remount,ro /dev/device
è garantito che fallisca se ci sono file aperti per la scrittura, quindi provalo subito. Potresti sentirti fortunato, teppista!
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 a questo punto non riesci a rimontare in sola lettura, esamina alcune delle altre possibili cause elencate qui.
Rimonta obiettivo di sola lettura sbloccato ð☑
Congratulazioni, i tuoi dati sul punto di montaggio sono ora coerenti e protetti dalla scrittura futura.
Perché fuser
è inferiore a lsof
Perché non usare usa fuser
prima? Beh, avresti potuto, ma fuser
opera su una directory , non un dispositivo , quindi se desideri rimuovere il punto di montaggio dallo spazio dei nomi dei file e utilizzare ancora fuser
, dovresti:
- Duplica temporaneamente il punto di montaggio con
mount -o bind /media/hdd /mnt
in un'altra posizione - 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:
- Lo spazio dei nomi originale è nascosto (non è stato possibile aprire altri file, il problema non può peggiorare)
- Una directory montata bind duplicata (al contrario di un dispositivo) su cui eseguire
fuser
.
Questo è più contorto, ma ti permette di usare:
fuser -vmMkiw <mountpoint>
che chiederà in modo interattivo di terminare i processi con i file aperti per la scrittura. Ovviamente, potresti farlo senza nascondere affatto il punto di montaggio, ma quanto sopra imita umount -l
, senza nessuno dei pericoli.
Il -w
switch limita ai processi di scrittura e il -i
è interattivo, quindi dopo un rimontaggio in sola lettura, se hai fretta puoi usare:
fuser -vmMk <mountpoint>
per terminare tutti i processi rimanenti con i file aperti sotto il punto di montaggio.
Si spera che a questo punto tu possa smontare il dispositivo. (Dovrai eseguire umount
sul mountpoint due volte se hai bind montato una modalità 000
directory in alto.)
Oppure usa:
fuser -vmMki <mountpoint>
per terminare in modo interattivo i rimanenti processi di sola lettura che bloccano lo smontaggio.
Dannazione, ricevo ancora target is busy
!
I file aperti non sono l'unico blocco dello 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 hai il tuo filesystem in uno stato coerente.
Puoi quindi utilizzare lsof +f -- /dev/device
per elencare tutti i processi con file aperti sul dispositivo contenente il filesystem, quindi terminarli.
SÌ !! C'è un modo per scollegare immediatamente un dispositivo occupato, anche se è occupato e non può essere smontato forzatamente. Puoi ripulire tutto più tardi:
umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS (NETWORK-FILE-SYSTEM)
NOTA/ATTENZIONE
- Questi comandi possono interrompere un processo in esecuzione, causare la perdita di dati O corrompere i file aperti. I programmi che accedono ai file DEVICE/NFS di destinazione potrebbero generare errori OPPURE non potrebbero funzionare correttamente dopo lo smontaggio forzato.
- Non eseguire sopra
umount
comandi quando si trova all'interno del percorso montato (Cartella/Unità/Dispositivo) stesso. Innanzitutto, puoi utilizzarepwd
comando per convalidare il percorso della directory corrente (che non dovrebbe essere il percorso montato), quindi utilizzarecd
comando per uscire dal percorso montato - per smontarlo successivamente usando i comandi precedenti.
Assicurati di non essere ancora nel dispositivo montato quando stai tentando di smontarlo.