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 -l
sta 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 000
sulla 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,ro
badge, sai che:
- Tutti i dati in sospeso sono stati scritti su disco
- Tutti i tentativi di scrittura futuri falliranno
- 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 fuser
prima? Bene, si potrebbe avere, ma fuser
funziona 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:
- Duplica temporaneamente il mountpoint
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 è possibile aprire altri file, il problema non può peggiorare)
- 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' -w
interruttore 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 umount
il mountpoint due volte se hai associato una 000
directory 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/device
per 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-point
quali implicazioni . Fondamentalmente, se il mountpoint è montato sotto il /
filesystem, dovresti evitarlo.