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.
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
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.
chemin de démontage
Sudo umount /your_path
supprimer le chemin d'accès mout dans/etc/fstab
Sudo nano /etc/fstab
redémarrer
Sudo reboot
supprimer le répertoire
Sudo rm -rf /your_path
D'après mon expérience, les opérations suivantes sont asynchrones sous Linux:
close()
, umount()
peut renvoyer EBUSY
lorsqu’il effectue une validation asynchrone. Voir la discussion ici: page 1 , page 2 .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 commandesreboot(8)
ethalt(8)
en tiennent compte en restant en veille quelques secondes après l'appel desync(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.)