Je rencontre souvent un problème pour démonter un répertoire:
umount /mnt/dir[.____.[umumount:/mnt/dir: le périphérique est occupé
Il y a plusieurs raisons pour lesquelles l'appareil est occupé. Parfois, il y a des processus en cours d'exécution qui ont des verrous ouverts, parfois il y a d'autres répertoires montés sur /mnt/dir
.
Ma question:
Quelles sont les étapes pour vérifier pourquoi un répertoire n'a pas pu être démonté.
Je sais qu'il y a plusieurs raisons, mais ce n'est pas grave si vous expliquez une solution spécifique.
[ÉDITER]
[X] exécution de processus sur des volumes montés.
[X] un autre volume est monté sur un volume que nous voulons démonter
[_] NFS verrouille le volume que nous voulons démonter
La façon 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 affichera chaque fichier ouvert sur le support. Encore une fois mieux exécuté en tant que root.
Vous pouvez exécuter l'un ou l'autre en tant que non root, mais la sortie sera limitée à vos processus - ceux des autres utilisateurs ne seront tout simplement pas affiché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 y accéder. Dans ce cas, le noyau l'utilise en tant que montage (duh, mais le démontage ne sera OK qu'avec cela). bash
l'a comme répertoire de travail actuel (devra cd
dans un autre répertoire avant de démonter) et gvim a le répertoire actuel et 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 pour bash et gvim (de type DIR
). Vous pouvez également voir quel fichier gvim a ouvert pour l'écriture.
Comment forcer le problème:
fuser
a un -k
option qui enverra un signal (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 SIGKILL
!)
umount
a un -l
option pour effectuer un démontage paresseux. Le montage sera supprimé de l'espace de noms du système de fichiers (vous ne le verrez donc pas sous /mnt/Zia/src
plus, dans l'exemple) mais il reste monté, donc les programmes qui y accèdent peuvent continuer à le faire. Lorsque le dernier programme y accédant se ferme, le démontage se produit réellement.
Il existe une dernière cause réparable d'échec du démontage, et c'est un serveur NFS qui tombe en panne. Ici, vous pouvez utiliser umount -f
, mais vous risquez de perdre des données si vous le faites. (Le client peut avoir mis en cache des écritures qui n'ont pas encore été confirmées par le serveur, et ces écritures seront rejetées. Cependant, les applications ont déjà été informées que l'écriture a réussi.)
Tu devrais utiliser:
Sudo umount -l <path>
De la page de manuel :
-l, --lazy
Démontage paresseux. Détachez maintenant le système de fichiers de la hiérarchie de fichiers et nettoyez toutes les références à ce système de fichiers dès qu'il n'est plus occupé.
Un redémarrage du système est attendu dans un avenir proche si vous comptez utiliser cette option pour un système de fichiers réseau ou un système de fichiers local avec des sous-montages. Cas d'utilisation recommandé pour
umount -l
est d'empêcher les blocages à l'arrêt en raison d'un partage réseau inaccessible où un umount normal se bloquera en raison d'un serveur en panne ou d'une partition réseau. Les remises de part ne seront pas possibles.
n autre volume est monté au-dessus d'un volume que nous voulons démonter:
La commande mount
vous permet de connaître tous les volumes montés si elle est invoquée 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, grep juste sur le mointpoint à partir duquel vous souhaitez démonter et vous saurez s'il y a des systèmes de fichiers montés sur celui-ci.
mount | Perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'
Vous avez alors deux solutions. Démontez les systèmes de fichiers ou déplacez-les avec mount --move olddir newdir
(noyau> 2.5.1)
Les processus avec des fichiers ouverts sont les coupables habituels. Affichez-les:
lsof +f -- <mountpoint or device>
Il y a un avantage à utiliser /dev/<device>
plutôt que /mountpoint
: un point de montage disparaîtra après un umount -l
, ou il peut être masqué par un support superposé.
fuser
peut également être utilisé, mais à mon avis lsof
a une sortie plus utile. Cependant, fuser
est utile lorsqu'il s'agit de tuer les processus à l'origine de vos drames afin que vous puissiez continuer votre vie.
Lister les fichiers sur <mountpoint>
(voir la mise en garde ci-dessus):
fuser -vmM <mountpoint>
Ne tuez interactivement que les processus avec des fichiers ouverts pour l'écriture:
fuser -vmMkiw <mountpoint>
Après remontage en lecture seule (mount -o remount,ro <mountpoint>
), il est sûr (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 que vous essayez de 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 peut être créé par:
open
avec O_TMPFILE
)Ce sont les pokémons les plus insaisissables et apparaissent dans la colonne lsof
de TYPE
sous la forme 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 montres inotify actuelles (chemin d'accès, PID) .
Pour moi, le problème était que j'étais connecté plus d'une fois (via ssh) et sur l'une des connexions, j'étais à l'invite de commande où le pwd était dans un dossier subordonné au point de montage.
La question de savoir si NFS accède à un répertoire qui va être démonté est toujours sans réponse.
Ce que j'ai, c'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 showmount
sans arguments affiche uniquement les hôtes clients même s'ils sont hors ligne. Je suppose que c'est un comportement spécial de NFS.