Éviter umount -l
Au moment de la rédaction, la réponse la plus votée recommande l'utilisation umount -l
.
umount -l
est dangereux ou au mieux dangereux . En résumé:
- Il ne démonte pas réellement le périphérique, il supprime simplement le système de fichiers de l'espace de noms. Les écritures pour ouvrir les fichiers peuvent continuer.
- Cela peut endommager le système de fichiers btrfs
Contournement / alternative
Le comportement utile de umount -l
cache le système de fichiers de l'accès par des noms de chemin absolus , minimisant ainsi l'utilisation ultérieure de moutpoint.
Ce même comportement peut être obtenu en montant un répertoire vide avec des autorisations 000
sur le répertoire à démonter.
Ensuite, tout nouvel accès aux noms de fichiers dans le dessous du point de montage atteindra le répertoire nouvellement superposé avec zéro autorisations - les nouveaux bloqueurs au démontage sont ainsi empêchés.
Essayez d'abord de remount,ro
La principale réalisation de démontage à débloquer est le remontage en lecture seule. Lorsque vous gagnez le remount,ro
badge, vous savez que:
- Toutes les données en attente ont été écrites sur le disque
- Toutes les futures tentatives d'écriture échoueront
- Les données sont dans un état cohérent, si vous devez déconnecter physiquement l'appareil.
mount -o remount,ro /dev/device
est garanti d'échouer s'il y a des fichiers ouverts pour l'écriture , alors essayez directement. Vous avez peut-être de la chance, punk!
Si vous n'avez pas de chance, concentrez-vous uniquement sur les processus avec des fichiers ouverts pour l'écriture :
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
Vous devriez alors pouvoir remonter le périphérique en lecture seule et garantir un état cohérent.
Si vous ne pouvez pas remonter en lecture seule à ce stade, examinez certaines des autres causes possibles répertoriées ici .
Réussite du montage en lecture seule déverrouillée 🔓☑
Félicitations, vos données sur le point de montage sont désormais cohérentes et protégées contre toute écriture future.
Pourquoi fuser
est inférieur àlsof
Pourquoi ne pas utiliser utiliser fuser
plus tôt? Eh bien, vous pourriez avoir, mais fuser
opère sur un répertoire , pas sur un périphérique , donc si vous vouliez supprimer le point de montage de l'espace de nom de fichier et continuer à l'utiliser fuser
, vous auriez besoin de:
- Dupliquez temporairement le point de montage avec
mount -o bind /media/hdd /mnt
vers un autre emplacement
- Masquez le point de montage d'origine et bloquez l'espace de noms:
Voici comment:
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"
Vous auriez alors:
- L'espace de noms d'origine est caché (plus aucun fichier n'a pu être ouvert, le problème ne peut pas empirer)
- Un répertoire monté de liaison en double (par opposition à un périphérique) sur lequel exécuter
fuser
.
C'est plus compliqué [1] , mais vous permet d'utiliser:
fuser -vmMkiw <mountpoint>
qui demandera de manière interactive de tuer les processus avec des fichiers ouverts pour l'écriture. Bien sûr, vous pouvez le faire sans cacher le point de montage, mais les imitations ci-dessusumount -l
, sans aucun danger.
Le -w
commutateur se limite aux processus d'écriture et -i
est interactif, donc après un remontage en lecture seule, si vous êtes pressé, vous pouvez alors utiliser:
fuser -vmMk <mountpoint>
pour tuer tous les processus restants avec des fichiers ouverts sous le point de montage.
J'espère qu'à ce stade, vous pouvez démonter l'appareil. (Vous devrez exécuter umount
le point de montage deux fois si vous avez lié un mode monté000
répertoire de sur le dessus.)
Ou utiliser:
fuser -vmMki <mountpoint>
pour tuer de manière interactive les processus en lecture seule restants bloquant le démontage.
Bon sang, je reçois toujours target is busy
!
Les fichiers ouverts ne sont pas le seul bloqueur à démonter. Voir ici et ici pour d'autres causes et leurs remèdes.
Même si vous avez du gremlin caché qui vous empêche de démonter complètement l'appareil, vous avez au moins mis votre système de fichiers dans un état cohérent.
Vous pouvez ensuite utiliser lsof +f -- /dev/device
pour répertorier tous les processus avec des fichiers ouverts sur le périphérique contenant le système de fichiers, puis les tuer.
[1] Il est moins alambiqué à utiliser mount --move
, mais cela nécessite mount --make-private /parent-mount-point
ce qui a des implications . Fondamentalement, si le point de montage est monté sous le /
système de fichiers, vous voudriez éviter cela.