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 umount
ne 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?
cd
à dir monté, puis vous êtes redevenu root ou connectez-vous alors l'autre shell est piégé. Faitesexit
sur tous les obus.Réponses:
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:
REMARQUE:
la source
-l
voici un minusculeL
(pour "démontage paresseux"). (Voir cette réponse connexe .)-l
/--lazy
ne 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é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é)la source
lsof
:# opkg install lsof
Assurez-vous que vous n'êtes pas encore dans l'appareil monté lorsque vous essayez de démonter.
la source
umount
.Essayez ce qui suit, mais avant de l'exécuter, notez que l'
-k
indicateur tuera tous les processus en cours en gardant l'appareil occupé.Le
-i
drapeau faitfuser
demander avant de tuer.la source
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.Éviter
umount -l
Au moment de la rédaction, la réponse la plus votée recommande l'utilisation
umount -l
.umount -l
est dangereux ou au mieux dangereux . En résumé:Contournement / alternative
Le comportement utile de
umount -l
cache 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
000
sur 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,ro
badge, vous savez que: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 :
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
fuser
plus tôt? Eh bien, vous pourriez avoir, maisfuser
opè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'utiliserfuser
, vous auriez besoin de:mount -o bind /media/hdd /mnt
vers un autre emplacementVoici comment:
Vous auriez alors:
fuser
.C'est plus compliqué [1] , mais vous permet d'utiliser:
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-dessus
umount -l
, sans aucun danger.Le
-w
commutateur se limite aux processus d'écriture et-i
est interactif, donc après un remontage en lecture seule, si vous êtes pressé, vous pouvez alors utiliser: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
umount
le point de montage deux fois si vous avez lié un mode monté000
répertoire de sur le dessus.)Ou utiliser:
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/device
pour 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écessitemount --make-private /parent-mount-point
ce qui a des implications . Fondamentalement, si le point de montage est monté sous le/
système de fichiers, vous voudriez éviter cela.la source
--lazy
c'est si dangereux, pourquoi n'y a-t-il pas autant d'avertissement dans laumount
page 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é. "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.
la source
Découvrez
umount2
:la source
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-unmounted
devez avoir une sortie ci-dessous:la source
Une autre alternative lorsque quelque chose fonctionne est l'édition
/etc/fstab
, l'ajout d'unnoauto
indicateur 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.la source
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,
lsof
n'affichera pas l'utilisation. Mais vous pouvez simplement exécuterpuis démonter.
la source