GNU/Linux >> Tutoriels Linux >  >> Linux

Comment démonter un appareil occupé

Si possible, localisons/identifions le processus occupé, tuons ce processus, puis unmount le partage/lecteur samba pour minimiser les dommages :

  • lsof | grep '<mountpoint of /dev/sda1>' (ou quel que soit l'appareil monté)

  • pkill target_process (tue les processus occupés par nom | kill PID | killall target_process )

  • umount /dev/sda1 (ou quel que soit l'appareil monté)


Évitez umount -l

Au moment de la rédaction, la réponse la plus votée recommande d'utiliser 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 dans les fichiers ouverts peuvent continuer.
  • Cela peut entraîner une corruption du système de fichiers btrfs

Contourner/alternative

Le comportement utile de umount -l cache le système de fichiers de l'accès par absolu chemins d'accès, minimisant ainsi l'utilisation ultérieure des points de connexion.

Ce même comportement peut être obtenu en montant un répertoire vide avec les permissions 000 sur le répertoire à démonter.

Ensuite, tout nouvel accès aux noms de fichiers sous le point de montage atteindra le répertoire nouvellement superposé avec zéro autorisation - les nouveaux bloqueurs du démontage sont ainsi empêchés.

Essayez d'abord le 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 :

  1. Toutes les données en attente ont été écrites sur le disque
  2. Toutes les futures tentatives d'écriture échoueront
  3. Les données sont dans un état cohérent, si vous avez besoin de 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-le directement. Tu te sens peut-être chanceux, punk !

Si vous n'avez pas de chance, concentrez-vous uniquement sur les processus avec des fichiers ouverts en écriture :

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

Vous devriez alors être en mesure de remonter l'appareil en lecture seule et d'assurer un état cohérent.

Si vous ne pouvez pas remonter en lecture seule à ce stade, recherchez certaines des autres causes possibles répertoriées ici.

Succès de remontage en lecture seule déverrouillé ð☑

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 fuser plus tôt? Eh bien, vous auriez pu, mais fuser fonctionne sur un répertoire , pas un appareil , donc si vous vouliez supprimer le point de montage de l'espace de nom de fichier et toujours utiliser fuser , vous devez :

  1. Dupliquer temporairement le point de montage avec mount -o bind /media/hdd /mnt à un autre endroit
  2. Masquer le point de montage d'origine et bloquer 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 :

  1. L'espace de noms d'origine est masqué (plus aucun fichier ne peut être ouvert, le problème ne peut pas s'aggraver)
  2. Un répertoire monté en double (par opposition à un périphérique) sur lequel exécuter fuser .

C'est plus compliqué, mais vous permet d'utiliser :

fuser -vmMkiw <mountpoint>

qui demandera interactivement de tuer les processus avec des fichiers ouverts en écriture. Bien sûr, vous pouvez le faire sans masquer du tout le point de montage, mais ce qui précède imite umount -l , sans aucun danger.

Le -w switch se limite aux processus d'écriture, et le -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 pourrez démonter l'appareil. (Vous devrez exécuter umount sur le point de montage deux fois si vous avez lié monté un mode 000 répertoire en haut.)

Ou utilisez :

fuser -vmMki <mountpoint>

pour tuer interactivement les processus en lecture seule restants bloquant le démontage.

Merde, j'obtiens toujours target is busy !

Les fichiers ouverts ne sont pas le seul bloqueur de démontage. Voir ici et ici pour d'autres causes et leurs remèdes.

Même si vous avez un gremlin caché qui vous empêche de démonter complètement le périphérique, vous avez au moins votre système de fichiers dans un état cohérent.

Vous pouvez alors utiliser lsof +f -- /dev/device pour lister tous les processus avec des fichiers ouverts sur le périphérique contenant le système de fichiers, puis les tuer.


OUI !! Il existe un moyen de détacher immédiatement un appareil occupé - même s'il est occupé et ne peut pas être démonté de force. Vous pourrez tout nettoyer plus tard :

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

REMARQUE/ATTENTION

  1. Ces commandes peuvent perturber un processus en cours d'exécution, entraîner une perte de données OU corrompre des fichiers ouverts. Les programmes accédant aux fichiers DEVICE/NFS cibles peuvent générer des erreurs OU ne pas fonctionner correctement après le démontage forcé.
  2. Ne pas exécuter au-dessus de umount commandes à l'intérieur du chemin monté (dossier/lecteur/périphérique) lui-même. Tout d'abord, vous pouvez utiliser pwd commande pour valider votre chemin de répertoire actuel (qui ne doit pas être le chemin monté), puis utilisez cd commande pour sortir du chemin monté - pour le démonter plus tard en utilisant les commandes ci-dessus.

Assurez-vous que vous n'êtes pas encore dans l'appareil monté lorsque vous essayez de démonter.


Linux
  1. Comment installer un pilote de périphérique sous Linux

  2. Linux – Comment reconnecter un périphérique USB logiquement déconnecté ?

  3. Comment créer un périphérique de bloc virtuel (périphérique de boucle/système de fichiers) sous Linux

  4. Comment remplacer un périphérique Btrfs défaillant

  5. Comment savoir si un disque est un SSD ou un HDD

Comment monter et démonter des systèmes de fichiers sous Linux

Comment se connecter via Bluetooth dans GNOME sous Linux

Comment suivre votre ordinateur portable Linux

Comment monter/démonter manuellement un périphérique USB sur Ubuntu 20.04 et 22.04

Comment détecter et gérer les appareils sous Linux

Comment démarrer un émulateur Android dans Ubuntu 16.04 ?