web-dev-qa-db-fra.com

Linux: Quel processus provoque "périphérique occupé" lors de l'exécution de umount?

Linux: Quel processus provoque "périphérique occupé" lors de l'exécution de umount?

68
flybywire

Regardez la commande lsof (liste des fichiers ouverts) - elle peut vous dire quels processus tiennent quels sont ouverts. Parfois, c'est délicat, mais quelque chose d'aussi simple que Sudo lsof | grep (your device name here) peut le faire pour vous.

95
MarkusQ

Juste au cas où ... vous appelez parfois umount depuis le terminal et que votre répertoire actuel appartient au système de fichiers monté.

41
alvatar

Vous devez utiliser la commande fuser.

Par exemple. fuser /dev/cdrom renverra le (s) pid (s) du processus en utilisant /dev/cdrom.

Si vous essayez de démonter, vous pouvez arrêter ce processus en utilisant le commutateur -k (voir man fuser).

21
Ben

Recherchez les périphériques en boucle ouverte mappés sur un fichier du système de fichiers avec "losetup -a". Ils ne se présenteront ni avec lsof ni avec le fuser.

17
Jay

Vérifiez également /etc/exports. Si vous exportez des chemins dans le point de montage via NFS, cette erreur s'affichera lors de la tentative de démontage et rien ne s'affichera dans fuser ou lsof.

15
Malvineous
lsof +f -- /mountpoint

(as liste les processus utilisant des fichiers sur le montage monté sur/mountpoint. Particulièrement utile pour déterminer le ou les processus qui utilisent une clé USB ou un CD/DVD monté.

8
mas

lsof et fuser sont en effet deux manières de trouver le processus qui garde un certain fichier ouvert . Si vous voulez juste que umount réussisse, vous devriez explorer ses options -f et -l.

7
Anonymous

C'est exactement pourquoi le "fuser -m/mount/point" existe.

En passant, je ne pense pas que "fuser" ou "lsof" indique le moment où une ressource est détenue par le module du noyau, bien que je n’ai généralement pas ce problème.

4
Carter Galle

lsof et fuser ne m'ont rien donné non plus.

Après avoir renommé tous les répertoires possibles en .old et redémarré le système chaque fois que j'ai apporté des modifications, j'ai trouvé un répertoire particulier (relatif à postfix) responsable.

Il s’est avéré que j’avais déjà créé un lien symbolique entre/var/spool/postfix et/disk2/pers/mail/postfix/varspool afin de réduire les écritures sur disque sur un système de fichiers racine basé sur SDCARD (Sheeva Plug).

Avec ce lien symbolique, même après avoir arrêté les services postfix et dovecot (les fichiers ps aux, ainsi que netstat -tuanp, n'ont rien révélé), je n'ai pas pu démonter/disk2/pers.

Lorsque j'ai supprimé le lien symbolique et mis à jour les fichiers de configuration postfix et dovecot pour qu'ils pointent directement vers les nouveaux répertoires de/disk2/pers /, j'ai pu arrêter les services et démonter le répertoire.

La prochaine fois, je regarderai de plus près le résultat de:

ls -lR /var | grep ^l | grep disk2

La commande ci-dessus listera récursivement tous les liens symboliques dans une arborescence de répertoires (ici à partir de/var) et filtrera les noms qui pointent vers un point de montage cible spécifique (ici disk2).

2
captcha

Si vous ne pouvez toujours pas démonter ou remonter votre appareil après avoir arrêté tous les services et processus contenant des fichiers ouverts, il est possible qu'un fichier d'échange ou une partition d'échange maintienne votre appareil occupé. Cela n'apparaîtra pas avec fuser ou lsof. Désactiver l'échange avec:

Sudo swapoff -a

Vous pouvez vérifier au préalable et afficher un résumé de toutes les partitions ou fichiers d'échange avec:

swapon -s

ou:

cat /proc/swaps

Au lieu d'utiliser la commande Sudo swapoff -a, vous pouvez également désactiver le swap en arrêtant un service ou systemd unit. Par exemple:

Sudo systemctl stop dphys-swapfile

ou:

Sudo systemctl stop var-swap.swap

Dans mon cas, désactiver le swap était nécessaire, en plus d'arrêter tous les services et processus avec des fichiers ouverts en écriture, afin que je puisse remonter ma partition racine en lecture seule afin d'exécuter fsck sur ma partition racine sans redémarrer. Cela était nécessaire sur un Raspberry Pi exécutant Jessie Raspbian. 

1
Simon Gould

Ouvrir des fichiers

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

lsof +f -- <mountpoint or device>

Il existe un avantage à utiliser /dev/<device> plutôt que /mountpoint: un point de montage disparaît après un umount -l ou il peut être masqué par un montage superposé.

fuser peut également être utilisé, mais je pense que lsof a une sortie plus utile. Cependant, fuser est utile pour éliminer les processus à l'origine de vos drames afin que vous puissiez continuer votre vie.

Lister les fichiers sur <mountpoint> (voir l'avertissement ci-dessus):

fuser -vmM <mountpoint>

Ne coupez interactivement que les processus dont les fichiers sont ouverts à l'écriture:

fuser -vmMkiw <mountpoint>

Après avoir remonté en lecture seule (mount -o remount,ro <mountpoint>), il est prudent (r) 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 sur lequel vous essayez umount causera 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 (open avec O_TMPFILE)
  • inotify montres
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Ce type de pokémon est le plus insaisissable et apparaît dans la colonne lsof de TYPE en tant que a_inode (non documenté dans la page de manuel lsof ).

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

lsof | grep a_inode

Pour tuer les processus contenant des inodes anonymes, voir: Liste des surveillances inotify actuelles (nom du chemin, PID) .

1
Tom Hale

Les systèmes de fichiers montés sur le système de fichiers que vous essayez de démonter peuvent provoquer l'erreur target is busy en plus des fichiers en cours d'utilisation. (Par exemple, lorsque vous mount -o bind /dev /mnt/yourmount/dev afin d'utiliser chroot ici.)

Pour rechercher les systèmes de fichiers montés sur le système de fichiers, exécutez la procédure suivante:

mount | grep '/mnt/yourmount'

Pour trouver quels fichiers sont en cours d'utilisation, les conseils déjà suggérés par d'autres ici:

lsof | grep '/mnt/yourmount'

0
Slobodan Pejic