Зайнятий пристрій на Umount


41

У мене часто виникає проблема, щоб вимкнути каталог:

umount / mnt / dir
umount: / mnt / dir: пристрій зайнятий

Є багато причин, чому пристрій зайнятий. Іноді запущені процеси, які мають відкриті блокування, іноді є інші каталоги, встановлені поверх /mnt/dir.

Моє запитання:

Які дії можна перевірити, чому каталог не вдалося відключити.

Я знаю, що є багато причин, але це нормально, якщо ви поясните конкретне рішення.

[EDIT]

[X] запуску процесів на встановлених томах.
[X] інший том встановлений поверх тома, який ми хочемо зняти
[_] NFS блокує гучність, яку ми хочемо відключити


Відповіді:


76

Спосіб перевірки полягає в тому fuser -vm /mnt/dir, який повинен бути запущений як root. Він підкаже, які процеси отримують доступ до точки монтажу.

Альтернативою є те lsof /mnt/dir, що буде показано кожен відкритий файл на горі. Знову найкраще запустити як root.

Ви можете запустити будь-яке з них як некореневе, але тоді вихід буде обмежений вашими процесами - ті, що надходять від інших користувачів, просто мовчки не відображатимуться, хоча вони не дозволять відключити файлову систему.

Приклад:

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

Поле "доступ" повідомляє вам про доступ до нього. У цьому випадку ядро ​​використовує його як кріплення (duh, але відключення буде гаразд лише з цим). bashмає це як поточний робочий каталог (доведеться cdпереходити в інший каталог, перш ніж відключити), і у gvim обидва є поточна директорія та відкритий файл (потрібно буде закрити цей 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)

На цьому виході ви можете побачити поточні каталоги як для bash, так і для gvim (як тип DIR). Ви також можете побачити, який файл gvim відкритий для запису.

Як змусити проблему:

fuserє -kопція, яка надсилатиме сигнал (за замовчуванням:) SIGKILLдо кожного процесу за допомогою кріплення. Це досить потужний спосіб запобігти зайнятості кріплення. (І звичайно, будьте обережні, що ви SIGKILL!)

umountє -lможливість виконати ледачий відключення. Монтаж буде видалено з простору імен файлової системи (тому ви більше не бачите його /mnt/Zia/srcв прикладі), але він залишається змонтованим, тому програми, що отримують доступ до нього, можуть продовжувати це робити. Коли остання програма, що отримує доступ до неї, закривається, деактивація дійсно відбудеться.

Є одна остаточна виправлена ​​причина відключення несправності, і це NFS-сервер знижується. Тут ви можете використовувати umount -f, але ви ризикуєте втратою даних, якщо це зробите. (Клієнт, можливо, кеширує записи, які ще не були підтверджені сервером, і ці записи будуть відкинуті. Проте програми вже сказали, що запис успішний.)


4
Зауважте, що fuser -kце надзвичайно ризиковано, оскільки ви будете робити це як корінь, і якщо ви не дуже впевнені, які процеси будуть вбиті, ви можете зробити справді вражаючий збиток за допомогою недбалої команди ...
Шадур

1
@Shadur добре, сподіваємось, ви вже запустили його без -kможливості, так що ви будете знати, які процеси ви збираєтеся вбити. Але додам у попередження.
дероберт

1
fuser -vmпоказав "кріплення ядра". довелося робити systemctl stop opt.mountзамість ручного umount.
lkraav

2
Чомусь umount -f не працює для мене, але працює umount -l працює чудово.
Фірз

Дякуємо за замітку про umount -fта NFS. Моя проблема стосувалася NFS, коли мої розробники змінили IP-адреси, і я не зміг видалити частку.
Ерік

19

Ви повинні використовувати:

sudo umount -l <path>

7
⁺¹, я не маю уявлення про те, що дурна людина могла це спричинити. Саме -lтакий варіант використовувати, коли навіть -fце не працює.
Привіт-Ангел

@ Привіт-Ангел Тому, що це не те, що задають ОП?
xhienne

Обмін стеками @xheinne - це не лише відповідь на запитання, як убогий бот, ця відповідь корисна. багато людей також надходять із пошуку в Google. Я особисто вважав це корисним. Оп повинен прийняти відповідь, яку він вважає відповідною, тому кнопка прийняття існує.
користувач1735921

6

Інший том встановлений поверх тома, який ми хочемо зняти:

mountКоманда дозволяє знати всі томи встановлений , якщо invoqued без аргументів , ні варіантів (крім -v). Ви можете мати список активних точок монтування, додавши трохи perl:

mount | perl -pe 's/.*on (\S+) type.*/\1/'

Потім просто переведіть курсор на точку, з якої ви хочете відключити, і ви дізнаєтесь, чи є над цим файлами змонтовані файлові системи.

mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'

Тоді у вас є два рішення . Або від'єднайте файлові системи, або перемістіть їх mount --move olddir newdir(ядро> 2.5.1)


1
Так дякую. / etc / mtab та / proc / mount також можливі.

Так, я завжди забував про них. Скажімо, для набору тексту "mount" потрібно менше символів (але більше ресурсів для виконання?)
mveroone

1
У мене зовнішній USB-накопичувач "постійно" встановлений на певному каталозі на моєму ноутбуці. Іноді кабель відключається помилково. Мені було великим болем перекомпонувати пристрій у каталозі (через "пристрій зайнято"), поки я не прочитав цю відповідь. Тепер я знаю, що використовую mount --move olddir newdir. Спасибі.
Сільвіо Леві

3

Відкрити файли

Процеси з відкритими файлами - звичні винуватці. Показати їх:

lsof +f -- <mountpoint or device>

Є перевага використання, /dev/<device>а не /mountpoint: точка монтування зникне після umount -l, або вона може бути прихована накладеним кріпленням.

fuserтакож можна використовувати, але на мій погляд lsof, є більш корисний вихід. Однак fuserкорисно, коли мова йде про вбивство процесів, що викликають ваші драми, щоб ви могли продовжувати своє життя.

Список файлів на <mountpoint>(див. Попередження вище):

fuser -vmM <mountpoint>

Інтерактивно вбивайте лише процеси з відкритими для запису файлами:

fuser -vmMkiw <mountpoint>

Після повторного перенаправлення лише для читання ( mount -o remount,ro <mountpoint>) безпечно (r) знищити всі процеси, що залишилися:

fuser -vmMk <mountpoint>

Точки горі

Винуватцем може бути саме ядро. Інша файлова система, встановлена ​​на файловій системі, яку ви намагаєтеся umountвикликати горе. Перевірте:

mount | grep <mountpoint>/

Для контурних кріплень також перевірте вихід:

losetup -la

Анонімні введення (Linux)

Анонімні вводи можна створити:

  • Тимчасові файли ( openз O_TMPFILE)
  • прищеплювати годинник
  • [eventfd]
  • [опитування подій]
  • [timerfd]

Це найбільш невловимий тип покемону, і вони з'являються у стовпці lsof's (що недокументовано на сторінці man ).TYPEa_inodelsof

Вони не відображатимуться lsof +f -- /dev/<device>, тому вам потрібно:

lsof | grep a_inode

Про вбивство процесів, що містять анонімні іноди, див.: Список списку поточних інотифікованих годин (ім'я шляху, PID) .


1

На питання, як перевірити, чи NFS отримує доступ до каталогу, який буде відключено, все ще не відповідає.

Я маю лише це:

Перевірте, чи працює nfsd:

pidof nfsd

Показати змонтовані каталоги клієнтами:

showmount -a

і showmountбез аргументів відображаються лише хости клієнта, навіть якщо вони не в мережі. Я припускаю, що це особлива поведінка NFS.


1

Для мене проблема полягала в тому, що я не раз входив (через ssh), і на одному з входів я був у командному рядку, де pwd знаходився всередині папки, підпорядкованої точці монтажу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.