umount - le périphérique est occupé

14

Parfois, quand je veux démonter un appareil, par exemple

sudo umount /dev/loop0

Je vais recevoir le message

umount: /mnt: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

Je résout généralement ce problème en fermant une fenêtre de console (dans mon cas xfce4-terminal), puis umount.

Que signifie ce problème? Existe-t-il une solution plus intelligente?

xralf
la source
2
Cela se produit par exemple si vous êtes toujours dans un shell dans ce répertoire à l'endroit où le périphérique est monté.
klapaucius
Je ne me souviens pas si j'étais là mais j'ai essayé et tu as raison, c'est arrivé.
xralf

Réponses:

14

Cela signifie que certains processus ont un répertoire de travail ou un descripteur de fichier ouvert sous le point de montage. La meilleure chose à faire est de mettre fin au processus incriminé, de modifier son répertoire de travail ou de fermer le descripteur de fichier avant le démontage.

Il existe cependant une alternative sous Linux. L'utilisation d' umount -lappels permet un démontage "paresseux". Le système de fichiers sera toujours monté mais vous ne pourrez pas le voir ou l'utiliser, sauf pour les processus qui l'utilisent déjà. Lorsque le programme incriminé se termine (par quelque moyen que ce soit), le système "termine" le démontage du système de fichiers.

bahamat
la source
2
Existe-t-il un moyen de savoir quel processus a le descripteur de fichier ouvert et doit être arrêté?
xralf
4
L'utilisation lsofest probablement la meilleure façon.
bahamat
1
par exemple lsof | grep loop0?
xralf
Non, grep pour le point de montage. Il devrait répertorier tous les fichiers en dessous. Je ne pense pas que cela montrera des choses qui ont simplement un répertoire de travail sous le point de montage, donc ce n'est pas une méthode parfaite.
bahamat
7

Vous pouvez également utiliser fuserpour tuer tous les processus à l'aide du système de fichiers monté.

fuser -cuk /mnt

Options:

-c     
    Same as -m option, used for POSIX compatibility.

-u, --user
    Append the user name of the process owner to each PID.

-k, --kill
    Kill  processes accessing the file. Unless changed with -SIGNAL, SIGKILL is sent. An fuser process
    never kills itself, but may kill other fuser processes. The  effective  user  ID  of  the  process
    executing fuser is set to its real user ID before attempting to kill.kill.

-m NAME, --mount NAME
    NAME specifies a file on a mounted file system or a block device that is  mounted.  All  processes
    accessing  files  on  that  file  system  are  listed.   If  a  directory file is specified, it is
    automatically changed to NAME/. to use any file system that might be mounted on that directory.

Vérifiez par vous-même à expliquehell .

sys0dm1n
la source
3

Compte tenu de votre "solution habituelle", cela signifie que le shell que vous exécutez dans la fenêtre de votre console a un répertoire dans un système de fichiers sur ce périphérique comme répertoire de travail actuel.

Linux, et Unix en général, veulent absolument garder un système de fichiers monté si un processus a un répertoire de travail actuel dans ce système de fichiers.

Vous pouvez simplement utiliser cddans la fenêtre de la console pour sortir d'un répertoire dans ou sous /mntplutôt que de tuer la fenêtre de la console et le shell qui y fonctionne.

Bruce Ediger
la source
0

J'ai découvert une situation qui peut interférer avec le démontage d'un appareil que je partagerai comme réponse même si cette question est très ancienne.

Si vous avez des partages NFS hébergés sur la machine et que l'un de ces partages NFS est soutenu par le périphérique que vous essayez de démonter, vous devrez arrêter de les partager (mieux vaut en arrêtant le service NFS, par exemple sudo service nfs-kernel-server stopsur les versions récentes d'Ubuntu ). Le serveur NFS peut ne pas apparaître dans lsof ou fuser, ce qui peut rendre le problème difficile à identifier.

Wug
la source