Linux: Quel processus provoque "périphérique occupé" lors de l'exécution de umount?
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.
Juste au cas où ... vous appelez parfois umount depuis le terminal et que votre répertoire actuel appartient au système de fichiers monté.
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
).
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.
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
.
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é.
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.
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.
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).
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.
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>
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
Les inodes anonymes peuvent être créés par:
open
avec O_TMPFILE
)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) .
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'