web-dev-qa-db-fra.com

rmdir a échoué en raison de "Périphérique ou ressource occupé"

il y a beaucoup de problèmes similaires comme "Périphérique ou ressource occupé". Mais je pense que mon problème est différent avec eux.

J'utilise mount --bind pour lier un répertoire

mount --bind /tmp/Origin /tmp/mount

et puis pourrait démonter avec succès

umount /tmp/mount

Et puis si j'appelle rm à la fois

rm -rf /tmp/mount

Je pourrais obtenir une erreur Device or resource busy. Si j'attends 2 à 3 secondes, puis que j'appelle rm, cela pourrait réussir.

Donc, ce comportement est très étrange ici. J'essaye d'utiliser 

lsof +D /tmp/mount

ne pouvait rien voir.

J'utilise aussi fuser -vm /tmp/mount, aucun processus ne peut contenir ce dossier.

Je compare le /proc/mounts avant umount /tmp/mount et après umount /tmp/mount. /tmp/mount a déjà été supprimé.

Je compare le stat /proc/mounts avant umount /tmp/mount et après umount /tmp/mount. L'inode également différent, cela signifie que /tmp/mount a déjà été supprimé.

Même si j'appelle sync && echo 2 > /proc/sys/vm/drop_caches et tente de supprimer les caches de fichiers, cela ne fonctionne toujours pas.

J'essaie ceci à la fois dans Ubuntu 14.04 et CentOS 6.6. Ils ont les mêmes résultats.

4
haosdent

Merci pour la réponse de @ g-v. Mais j'ai trouvé le résultat est un autre problème. Nous utilisons l'indicateur CLONE_NEWNS lorsque vous lancez un processus. Plus de détails peuvent être trouvés dans drapeau CLONE_NEWNS et MESOS-3349 Bug lié à un périphérique occupé

Dans un court mot, nous montons dans le processus parent. Et puis umount dans le processus enfant, en raison de CLONE_NEWNS, le point de montage existe toujours et est géré par le processus parent. Ainsi, lorsque l'appel rmdir obtiendrait le code d'erreur EBUSY.

Pour éviter les problèmes ci-dessus, nous pourrions utiliser un montage partagé ou un montage esclave. Plus de détails peuvent être trouvés dans LWN 159092

1
haosdent

Je rencontrais un problème comme celui-ci car je montais le dossier partagé dans VM et je voulais supprimer le répertoire après le démontage et je voulais simplement partager ma solution.

  1. chemin de démontage

    Sudo umount /your_path
    
  2. supprimer le chemin d'accès mout dans/etc/fstab

    Sudo nano /etc/fstab
    
  3. redémarrer

    Sudo reboot
    
  4. supprimer le répertoire

    Sudo rm -rf /your_path
    
7
thyahan

D'après mon expérience, les opérations suivantes sont asynchrones sous Linux:

  • Fichier de fermeture. Immédiatement après le retour de close(), umount() peut renvoyer EBUSY lorsqu’il effectue une validation asynchrone. Voir la discussion ici: page 1 , page 2 .
  • Système de fichiers de montage. Le périphérique monté peut être occupé jusqu'à ce que toutes les données soient écrites sur le disque.

Même si j'appelle sync && echo 2 > /proc/sys/vm/drop_caches et tente de supprimer les caches de fichiers, cela ne fonctionne toujours pas.

Voir sync(8) :

Sous Linux, sync ne garantit que la planification de l'écriture des blocs modifiés; cela peut prendre un peu de temps avant que tous les blocs soient enfin écrits. Les commandes reboot(8) et halt(8) en tiennent compte en restant en veille quelques secondes après l'appel de sync(2).

En ce qui concerne /proc/sys/vm/drop_caches, voir ici :

Cette opération est non destructive et ne libérera aucun objet sale.

Ainsi, immédiatement après votre commande, les données peuvent toujours être mises en file d'attente pour écriture et le démontage n'est pas encore terminé.


Mettre à jour

Toutefois, lorsque le démontage asynchrone est actif, le noyau renvoie EBUSY pour les opérations sur périphérique monté, mais pas pour point de montage.

Donc, les cas ci-dessus ne pourraient pas être la raison de votre problème: P


PS.

En fait, je ne comprends pas pourquoi la page de manuel indique que sync(8) n'est pas synchrone sous Linux. Il appelle sync(2) qui indique:

Selon la spécification standard (par exemple, POSIX.1-2001), sync() planifie les écritures, mais peut revenir avant l’écriture proprement dite. Cependant, depuis la version 1.3.20, Linux attend réellement. (Cela ne garantit toujours pas l'intégrité des données: les disques modernes ont de grands caches.)

4
gavv