Appareil occupé sur Umount

41

Je rencontre souvent un problème pour démonter un répertoire:

umount / mnt / dir
umount: / mnt / dir: le périphérique est occupé

Il y a plusieurs raisons pour lesquelles l'appareil est occupé. Parfois, des processus en cours d'exécution ont des verrous ouverts, parfois d'autres répertoires sont montés dessus /mnt/dir.

Ma question:

Quelles sont les étapes à suivre pour vérifier pourquoi un répertoire ne peut pas être démonté.

Je sais qu'il y a beaucoup de raisons, mais ça va si vous expliquez une solution spécifique.

[MODIFIER]

[X] exécution de processus sur des volumes montés.
[X] un autre volume est monté sur un volume que vous souhaitez démonter
[_] NFS verrouille le volume que vous souhaitez démonter.


la source

Réponses:

76

Le moyen de vérifier est fuser -vm /mnt/dir, qui doit être exécuté en tant que root. Il vous indiquera quels processus accèdent au point de montage.

Une alternative est lsof /mnt/dir, qui montrera chaque fichier ouvert sur le montage. Encore une fois mieux courir en tant que root.

Vous pouvez exécuter l'un ou l'autre en tant qu'utilisateur non root, mais le résultat sera alors limité à vos processus. Les processus d'autres utilisateurs seront simplement masqués, même s'ils empêcheront le démontage du système de fichiers.

Exemple:

Watt:~# fuser -vm /mnt/Zia/src
                     USER        PID ACCESS COMMAND
/mnt/Zia/src:        root     kernel mount /mnt/Zia/src
                     anthony   24909 ..c.. bash
                     anthony   25041 F.c.. gvim

Le champ "accès" vous indique comment on y accède. Dans ce cas, le noyau l’utilise comme montage (duh, mais démonter sera OK avec seulement cela). bashl'a comme répertoire de travail actuel (il devra être dans cdun répertoire différent avant de démonter) et gvim a le répertoire actuel et a un fichier ouvert (devra fermer ce gvim).

Watt:~# lsof /mnt/Zia/src
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    24909 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony    6u   REG   0,26    16384 3526219 /mnt/Zia/src/perl/.utf8.c.swp (zia.vpn.home:/home/anthony/src)

Dans cette sortie, vous pouvez voir les répertoires actuels de bash et de gvim (en tant que type DIR). Vous pouvez également voir quel fichier gvim a ouvert en écriture.

Comment forcer le problème:

fusera une -koption qui enverra un signal (valeur par défaut:) SIGKILLà chaque processus utilisant le montage. C'est un moyen assez puissant pour empêcher la monture d'être occupée. (Et bien sûr, faites attention à ce que vous faites SIGKILL!)

umounta une -loption pour effectuer un démontage paresseux. Le montage sera supprimé de l'espace de noms du système de fichiers (afin que vous ne le voyiez /mnt/Zia/srcplus sous , dans l'exemple), mais il reste monté, afin que les programmes qui y ont accès puissent continuer à le faire. Lorsque le dernier programme accédant à ce programme sera fermé, le démontage aura lieu.

Il y a une dernière cause réparable d'échec de démontage, et c'est un serveur NFS en panne. Ici, vous pouvez utiliser umount -f, mais vous risqueriez de perdre des données si vous le faites. (Le client a peut-être mis en cache des écritures qui n'ont pas encore été confirmées par le serveur, et ces écritures sont ignorées. Cependant, les applications ont déjà été prévenues que l'écriture réussissait.)

derobert
la source
4
Notez que fuser -kc'est extrêmement risqué, car vous le ferez en tant que root et si vous n'êtes pas très sûr des processus qui seront tués, vous pouvez faire des dégâts vraiment spectaculaires avec une commande négligente ...
Shadur
1
@Shadur, j'espère que vous l'avez déjà exécuté sans l' -koption, vous saurez ainsi quels processus vous allez tuer. Mais je vais ajouter un avertissement.
Derobert
1
fuser -vma montré "le montage du noyau". dû faire systemctl stop opt.mountau lieu de manuel umount.
Lkraav
2
Pour une raison quelconque, umount -f ne fonctionne pas pour moi, mais exécuter umount -l fonctionne parfaitement.
Firze
Merci pour la note à propos de umount -fet NFS. Mon problème était lié à NFS où mes machines de développement changeaient les adresses IP et je ne pouvais pas obtenir le partage supprimé.
Eric
19

Tu devrais utiliser:

sudo umount -l <path>
Felipe
la source
7
⁺¹, je n'ai aucune idée de quelle personne idiote pourrait revenir en arrière. Le -lest exactement l'option à utiliser quand même -fne fonctionne pas.
Bonjour-Angel
@ Hi-Angel Parce que ce n'est pas ce que l'OP demande?
xhienne
@xheinne stack exchange ne consiste pas seulement à répondre à une question comme un bot stupide, cette réponse est utile. beaucoup de gens viennent aussi de google search. J'ai personnellement trouvé cela utile. Le op op accepte la réponse qu’il trouve pertinente, c’est pourquoi le bouton Accepter est là.
user1735921
6

Un autre volume est monté au-dessus d'un volume que vous souhaitez démonter:

La mountcommande vous permet de connaître tous les volumes montés s’ils sont invoqués sans arguments ni options (sauf -v). Vous pouvez avoir une liste de points de montage actifs en ajoutant un peu de perl:

mount | perl -pe 's/.*on (\S+) type.*/\1/'

Ensuite, placez simplement le point de repère à partir duquel vous souhaitez démonter le système et vous saurez s’il existe des systèmes de fichiers montés sur celui-ci.

mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'

Ensuite, vous avez deux solutions . Démontez les systèmes de fichiers ou déplacez-les avec mount --move olddir newdir(noyau> 2.5.1)

mveroone
la source
1
Oui merci. / etc / mtab et / proc / mounts sont également possibles.
Ah c'est vrai, j'ai toujours oublié ceux-là. Disons que taper "mount" nécessite moins de caractères (mais plus de ressources à exécuter?)
mveroone
1
J'ai un périphérique de stockage USB externe "en permanence" monté sur un répertoire spécifique de mon ordinateur portable. Parfois, le câble est déconnecté par erreur. Il était très pénible de remonter l'appareil sur le répertoire (à cause de "appareil occupé") jusqu'à ce que je lise cette réponse. Maintenant, je savais utiliser mount --move olddir newdir. Merci.
Silvio Levy
3

Ouvrir des fichiers

Les processus avec des fichiers ouverts sont les coupables habituels. Les afficher:

lsof +f -- <mountpoint or device>

Il y a un avantage à utiliser /dev/<device>plutôt que /mountpoint: un point de montage disparaît après un umount -lou peut être caché par un montage superposé.

fuserpeut également être utilisé, mais à mon avis lsofa une sortie plus utile. Cependant, il fuserest utile de tuer les processus qui causent vos drames afin que vous puissiez continuer votre vie.

Liste des fichiers sur <mountpoint>(voir l'avertissement ci-dessus):

fuser -vmM <mountpoint>

Ne supprimez de manière interactive que les processus dont les fichiers sont ouverts à l'écriture:

fuser -vmMkiw <mountpoint>

Après avoir remonté read-only ( mount -o remount,ro <mountpoint>), il est prudent de tuer tous les processus restants:

fuser -vmMk <mountpoint>

Points de montage

Le coupable peut être le noyau lui-même. Un autre système de fichiers monté sur le système de fichiers que vous essayez d'essayer umountcausera des problèmes. Vérifier avec:

mount | grep <mountpoint>/

Pour les montages en boucle, vérifiez également la sortie de:

losetup -la

Inodes anonymes (Linux)

Les inodes anonymes peuvent être créés par:

  • Fichiers temporaires ( openavec O_TMPFILE)
  • inotify montres
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Ce type de pokemon est le plus insaisissable et apparaît dans lsofla TYPEcolonne 's sous la forme a_inode(non documenté dans la lsofpage de manuel ).

Ils n'apparaîtront pas dans lsof +f -- /dev/<device>, vous devrez donc:

lsof | grep a_inode

Pour plus d'informations sur les processus contenant des inodes anonymes, voir: Liste des surveillances inotify actuelles (nom du chemin, PID) .

Tom Hale
la source
1

La question de savoir comment vérifier si NFS accède à un répertoire qui va être démonté reste toujours sans réponse.

Ce que j'ai est seulement ceci:

Vérifiez si nfsd est en cours d'exécution:

pidof nfsd

Afficher les répertoires montés par les clients:

showmount -a

et showmountsans arguments ne montre que les hôtes clients, même s’ils sont hors ligne. Je suppose que ceci est un comportement spécial de NFS.


la source
1

Pour moi, le problème était que je me suis connecté plus d'une fois (via ssh) et que, à l'une des connexions, j'étais à l'invite de commande où le mot de passe se trouvait dans un dossier subordonné au point de montage.

Lonniebiz
la source