Comment démonter un appareil occupé

246

J'ai quelques lecteurs de samba auxquels plusieurs utilisateurs accèdent quotidiennement. J'ai déjà du code pour reconnaître les lecteurs partagés (à partir d'une table SQL) et les monter dans un répertoire spécial où tous les utilisateurs peuvent y accéder.

Je veux savoir, si je supprime un lecteur de ma table SQL (le mettant effectivement hors ligne) comment, ou même existe-t-il, un moyen de démonter un périphérique occupé? Jusqu'à présent, j'ai constaté que toute forme de umountne fonctionne pas.

Ignorer la possibilité de détruire des données - est-il possible de démonter un périphérique en cours de lecture?

Max
la source
3
Une réponse plus générale adressant plus de causes d'échec de umount se trouve ici oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Tange
2
Bonjour, probablement cdà dir monté, puis vous êtes redevenu root ou connectez-vous alors l'autre shell est piégé. Faites exitsur tous les obus.
Smeterlink

Réponses:

458

OUI!! Il existe un moyen de détacher immédiatement un périphérique occupé (même s'il est occupé et ne peut pas être démonté de force). Vous pouvez nettoyer tout plus tard:

umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)

REMARQUE:

  1. Ces commandes peuvent perturber un processus en cours, entraîner une perte de données OU corrompre des fichiers ouverts. Les programmes accédant aux fichiers DEVICE / NFS cibles peuvent générer des erreurs OU ne peuvent pas fonctionner correctement après un démontage forcé.
  2. Essayez d'exécuter ces commandes lorsque vous n'êtes PAS dans un dossier / lecteur / périphérique monté.
Amit Verma
la source
22
Remarque: -lvoici un minuscule L(pour "démontage paresseux"). (Voir cette réponse connexe .)
ジ ョ ー ジ
4
Travaillé. Une nuance, si vous êtes connecté via le client FTP, vous devez vous déconnecter pour pouvoir démonter le dossier avec succès.
Alexander Kim
Ils ne fonctionnent pas. Ils pendent tous les deux pour toujours. (Debian 8, cifs-utils 2: 6.4-1)
Hubro
1
-l/ --lazyne corrompra pas les fichiers ouverts, mais sous Linux, il semble que vous ne puissiez pas savoir quand l'appareil est réellement démonté et peut être supprimé
Tom Hale
1
Un peu effrayant. J'ai paresseusement démonté puis remonté pendant que d'autres processus y accédaient encore. Donc je suppose que je l'ai monté deux fois au final au même endroit? Je ne sais pas ce que cela a fait.
sudo
121

Si possible, localisons / identifions le processus occupé, arrêtons le processus, puis démontons le partage samba pour minimiser les dommages.

  • lsof | grep '<mountpoint of /dev/sda1>' (ou quel que soit l'appareil monté)

  • pkill target_process(tue un processus occupé par son nom | kill PID| killall target_process)

  • umount /dev/sda1 (ou quel que soit l'appareil monté)

Frank Tudor
la source
6
Cela ne renvoie rien. Je suppose que c'est parce que c'est un lecteur réseau et je ne peux pas voir les processus des autres ordinateurs accédant au lecteur. Même chose avec les commandes "fuser".
Max
oh enfer ... vous avez besoin des commandes samba ... / usr / bin / smbclient service <mot de passe>: voyez si cela vous permet de démarrer ... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor
2
Les commandes smb ont en fait été dépréciées et remplacées par "umount.cifs" .... qui ne fonctionne pas non plus. Il semble que je suis coincé de ne pas pouvoir démonter pendant qu'il est occupé.
Max
Si vous utilisez Asuswrt-Merlin, vous devez installer lsof:# opkg install lsof
Tonatio
1
vous devez sudo lsof pour obtenir des résultats
aheigins
78

Assurez-vous que vous n'êtes pas encore dans l'appareil monté lorsque vous essayez de démonter.

Luci
la source
4
Exactement, le simple fait d'ouvrir le dossier actuel (situé sur le périphérique cible) dans votre terminal (via la commande cd, par exemple) est suffisant pour arrêter le processus de démontage :)
jave.web
2
Oui, j'avais un shell en cours d'exécution dans un répertoire sur l'appareil. Fermé la fenêtre du terminal et le tour est joué
sh78
Assurez-vous également qu'il n'y a pas d'autres points de montage à l'intérieur de celui que vous essayez umount.
victe
@victe Thanks; Je montais un dossier en utilisant le montage pfexec -F vboxfs Carpetacompartida ~ / Documents sur Solaris 11; mais Documents avait des sous-dossiers et c'était le problème.
Dani Aya
44

Essayez ce qui suit, mais avant de l'exécuter, notez que l' -kindicateur tuera tous les processus en cours en gardant l'appareil occupé.

Le -idrapeau fait fuserdemander avant de tuer.

fuser -kim /address  # kill any processes accessing file
unmount /address
user3751769
la source
5
lsof | grep '/dev/<my-device>n'a rien retourné, mais cela fonctionne très bien! fuser -m /dev/<my-device>Vous pouvez également suggérer au cas où vous voudriez découvrir le processus avant de le tuer.
modulitos
3
L'exécution de la commande de l'unité de fusion m'a immédiatement déconnecté du VPS.
giorgio79
21

Éviter umount -l

Au moment de la rédaction, la réponse la plus votée recommande l'utilisation umount -l.

umount -lest dangereux ou au mieux dangereux . En résumé:

  • Il ne démonte pas réellement le périphérique, il supprime simplement le système de fichiers de l'espace de noms. Les écritures pour ouvrir les fichiers peuvent continuer.
  • Cela peut endommager le système de fichiers btrfs

Contournement / alternative

Le comportement utile de umount -lcache le système de fichiers de l'accès par des noms de chemin absolus , minimisant ainsi l'utilisation ultérieure de moutpoint.

Ce même comportement peut être obtenu en montant un répertoire vide avec des autorisations 000sur le répertoire à démonter.

Ensuite, tout nouvel accès aux noms de fichiers dans le dessous du point de montage atteindra le répertoire nouvellement superposé avec zéro autorisations - les nouveaux bloqueurs au démontage sont ainsi empêchés.

Essayez d'abord de remount,ro

La principale réalisation de démontage à débloquer est le remontage en lecture seule. Lorsque vous gagnez le remount,robadge, vous savez que:

  1. Toutes les données en attente ont été écrites sur le disque
  2. Toutes les futures tentatives d'écriture échoueront
  3. Les données sont dans un état cohérent, si vous devez déconnecter physiquement l'appareil.

mount -o remount,ro /dev/device est garanti d'échouer s'il y a des fichiers ouverts pour l'écriture , alors essayez directement. Vous avez peut-être de la chance, punk!

Si vous n'avez pas de chance, concentrez-vous uniquement sur les processus avec des fichiers ouverts pour l'écriture :

lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'

Vous devriez alors pouvoir remonter le périphérique en lecture seule et garantir un état cohérent.

Si vous ne pouvez pas remonter en lecture seule à ce stade, examinez certaines des autres causes possibles répertoriées ici .

Réussite du montage en lecture seule déverrouillée 🔓☑

Félicitations, vos données sur le point de montage sont désormais cohérentes et protégées contre toute écriture future.

Pourquoi fuser est inférieur àlsof

Pourquoi ne pas utiliser utiliser fuserplus tôt? Eh bien, vous pourriez avoir, mais fuseropère sur un répertoire , pas sur un périphérique , donc si vous vouliez supprimer le point de montage de l'espace de nom de fichier et continuer à l'utiliser fuser, vous auriez besoin de:

  1. Dupliquez temporairement le point de montage avec mount -o bind /media/hdd /mnt vers un autre emplacement
  2. Masquez le point de montage d'origine et bloquez l'espace de noms:

Voici comment:

null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"

# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked.  https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"

# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"

# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"

Vous auriez alors:

  1. L'espace de noms d'origine est caché (plus aucun fichier n'a pu être ouvert, le problème ne peut pas empirer)
  2. Un répertoire monté de liaison en double (par opposition à un périphérique) sur lequel exécuter fuser.

C'est plus compliqué [1] , mais vous permet d'utiliser:

fuser -vmMkiw <mountpoint>

qui demandera de manière interactive de tuer les processus avec des fichiers ouverts pour l'écriture. Bien sûr, vous pouvez le faire sans cacher le point de montage, mais les imitations ci-dessusumount -l , sans aucun danger.

Le -wcommutateur se limite aux processus d'écriture et -iest interactif, donc après un remontage en lecture seule, si vous êtes pressé, vous pouvez alors utiliser:

fuser -vmMk <mountpoint>

pour tuer tous les processus restants avec des fichiers ouverts sous le point de montage.

J'espère qu'à ce stade, vous pouvez démonter l'appareil. (Vous devrez exécuter umountle point de montage deux fois si vous avez lié un mode monté000 répertoire de sur le dessus.)

Ou utiliser:

fuser -vmMki <mountpoint>

pour tuer de manière interactive les processus en lecture seule restants bloquant le démontage.

Bon sang, je reçois toujours target is busy !

Les fichiers ouverts ne sont pas le seul bloqueur à démonter. Voir ici et ici pour d'autres causes et leurs remèdes.

Même si vous avez du gremlin caché qui vous empêche de démonter complètement l'appareil, vous avez au moins mis votre système de fichiers dans un état cohérent.

Vous pouvez ensuite utiliser lsof +f -- /dev/devicepour répertorier tous les processus avec des fichiers ouverts sur le périphérique contenant le système de fichiers, puis les tuer.


[1] Il est moins alambiqué à utiliser mount --move, mais cela nécessite mount --make-private /parent-mount-pointce qui a des implications . Fondamentalement, si le point de montage est monté sous le /système de fichiers, vous voudriez éviter cela.

Tom Hale
la source
1
Si --lazyc'est si dangereux, pourquoi n'y a-t-il pas autant d'avertissement dans la umountpage de manuel? Tout ce qu'il dit est " Démontage paresseux. Détachez le système de fichiers de la hiérarchie des fichiers maintenant et nettoyez toutes les références à ce système de fichiers dès qu'il n'est plus occupé. "
bitinerant
7

Recherchez les systèmes de fichiers NFS exportés avec exportfs -v. S'il est trouvé, supprimez-le avec le répertoire exportfs -d share: /. Celles-ci n'apparaissent pas dans la liste des unités de fusion / lsof et peuvent empêcher umount de réussir.

numberer6
la source
1
Merci pour ce conseil. J'ai dû utiliser exportfs -ua pour supprimer le verrou.
FuePi
6

Découvrez umount2:

Linux 2.1.116 a ajouté l'appel système umount2 () qui, comme umount (), démonte une cible, mais permet des indicateurs supplémentaires contrôlant le comportement de l'opération:

MNT_FORCE (depuis Linux 2.1.116) Force le démontage même s'il est occupé. (Uniquement pour les montages NFS.) MNT_DETACH (depuis Linux 2.4.11) Effectuez un démontage paresseux: rendez le point de montage indisponible pour les nouveaux accès et effectuez le démontage lorsque le point de montage cesse d'être occupé. MNT_EXPIRE (depuis Linux 2.6.8) Marquer le point de montage comme expiré. Si un point de montage n'est pas actuellement utilisé, un appel initial à umount2 () avec cet indicateur échoue avec l'erreur EAGAIN, mais marque le point de montage comme expiré. Le point de montage reste expiré tant qu'il n'est accessible par aucun processus. Un deuxième appel umount2 () spécifiant MNT_EXPIRE démonte un point de montage expiré. Cet indicateur ne peut pas être spécifié avec MNT_FORCE ou MNT_DETACH. Valeur de retour

En cas de succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et errno est défini de manière appropriée.

chown
la source
Malheureusement, ce ne sont pas des montages NFS, mais CIFS. J'essaierai cependant le MNT_DETACH. Cependant, si umount -l ne fonctionnait pas, je ne peux pas imaginer que ce serait très différent. Merci quand même!
Max
2

Quelqu'un a mentionné que si vous utilisez un terminal et que votre répertoire actuel se trouve dans le chemin que vous souhaitez démonter, vous obtiendrez l'erreur.
En complément, dans ce cas, vous lsof | grep path-to-be-unmounteddevez avoir une sortie ci-dessous:

bash ... path-to-be-unmounted
Eugène
la source
1

Une autre alternative lorsque quelque chose fonctionne est l'édition /etc/fstab, l'ajout d'un noautoindicateur et le redémarrage de la machine. L'appareil ne sera pas monté, et lorsque vous aurez fini de faire quoi que ce soit, supprimez l'indicateur et redémarrez à nouveau.

jesjimher
la source
0

Réponse de niche:

Si vous avez un pool zfs sur cet appareil, au moins lorsqu'il s'agit d'un pool basé sur des fichiers, lsofn'affichera pas l'utilisation. Mais vous pouvez simplement exécuter

sudo zpool export mypoo

puis démonter.

lucidbrot
la source