Як відключити зайнятий пристрій


246

У мене є кілька накопичувачів samba, до яких щодня звертаються кілька користувачів. У мене вже є код для розпізнавання спільних накопичувачів (з таблиці SQL) та монтажу їх у спеціальний каталог, де всі користувачі можуть отримати до них доступ.

Хочу знати, якщо я видаляю диск зі своєї таблиці SQL (фактично переносячи його в режим офлайн), як, і навіть є спосіб, як відключити зайнятий пристрій? Поки я виявив, що будь-яка форма umountне працює.

Ігноруючи можливість знищення даних - чи можна відключити пристрій, який зараз читається?


3
Більш загальний відповідь адресації більше причин для відсутності демонтувати знайдений тут oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Танга

2
Здравствуйте, напевно, ви cdвстановили dir, тоді ви знову отримали root або login, а потім інша оболонка потрапила в пастку. Робіть exitна всіх оболонках.
Smeterlink

Відповіді:


458

ТАК!! Існує спосіб негайно від'єднати зайнятий пристрій (навіть якщо він зайнятий і його неможливо відключити насильно). Ви можете почистити пізніше:

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

ПРИМІТКА:

  1. Ці команди можуть порушити запущений процес, спричинити втрату даних АБО пошкодити відкриті файли. Програми, що отримують доступ до цільових файлів DEVICE / NFS, можуть призвести до помилок АБО не можуть працювати належним чином після відключення сили.
  2. Спробуйте виконати ці команди, коли НЕ знаходиться всередині встановленої папки / диска / пристрою.

22
Примітка. -lОсь нижній регістр L(для "ледачого відключення"). (Див. Відповідну відповідь .)
ジ ョ ー ジ

4
Працювали. Один нюанс: якщо ви увійшли через FTP-клієнт, вам потрібно вийти з системи, щоб успішно відключити папку.
Олександр Кім

Вони не працюють. Вони обоє просто вішають навіки. (Debian 8, cifs-utils 2: 6.4-1)
Hubro

1
-l/ --lazyне буде пошкоджено відкриті файли, але в Linux, здається, ви не можете знати, коли пристрій насправді відключено і його можна буде видалити
Том Хейл,

1
Ніби страшно. Я ліниво-невміряний потім переказав, поки деякі інші процеси ще до нього зверталися. Тож я здогадуюсь, я встановив його двічі в кінці того ж місця? Не впевнений, що це зробив.
судо

120

Якщо можливо, давайте знайдемо / визначимо зайнятий процес, вбиймо процес, а потім демонтуємо частку samba, щоб мінімізувати шкоду.

  • lsof | grep '<mountpoint of /dev/sda1>' (або будь-який встановлений пристрій)

  • pkill target_process(вбиває зайнятих прок. по імені | kill PID| killall target_process)

  • umount /dev/sda1 (або будь-який встановлений пристрій)


6
Це нічого не повертає. Я припускаю, що це тому, що це мережевий диск, і я не бачу процесів інших комп'ютерів, що мають доступ до накопичувача. Те саме розібратися з командами "термовідвід".
Макс

Про , чорт ... вам потрібна самба команд ... / USR / bin / smbclient обслуговування <пароль>: Дивіться , якщо це допоможе вам почати роботу ... tldp.org/HOWTO/SMB-HOWTO-8.html
Франк Tudor

2
Команди smb фактично застаріли та замінені на "umount.cifs" .... що також не працює. Здається, я застряг у тому, що я не маю змоги перерахувати, поки він зайнятий.
Макс

Якщо ви використовуєте Asuswrt-Merlin, вам потрібно встановити lsof:# opkg install lsof
Tonatio

1
вам потрібно судо lsof, щоб отримати деякі результати
aheigins

78

Переконайтесь, що ви все ще не знаходяться на змонтованому пристрої, коли ви намагаєтесь зробити мутант.


4
Точно, просто відкривши поточну папку (розташовану на цільовому пристрої) у своєму терміналі (через команду cd), можливо, зупинити процес відключення :)
jave.web

2
Так, у мене на пристрої працює оболонка в каталозі. Закрили вікно терміналу і вуаля
sh78

Також переконайтесь, що всередині тієї, яку ви намагаєтеся, немає інших точок кріплення umount.
вікт

@victe Спасибі; Я матував папку за допомогою монтажу pfexec -F vboxfs carpetacompartida ~ / Документи на Solaris 11; але документи мали підпапки, і це було проблемою.
Дані Айя

44

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

В -iпрапор марки fuserзапитати , перш ніж вбити.

fuser -kim /address  # kill any processes accessing file
unmount /address

5
lsof | grep '/dev/<my-device>нічого не повернув, але це чудово працює! Можливо, ви хочете також запропонувати, fuser -m /dev/<my-device>якщо ви хочете дізнатися процес, перш ніж вбити його.
modulitos

3
Запуск команди термовідвідника негайно відключив мене від VPS.
giorgio79

21

Уникайте umount -l

На момент написання відповіді, голосуючий на вершині радить використовувати umount -l.

umount -lнебезпечно або в кращому випадку небезпечно . Підсумовуючи:

  • Він фактично не відключає пристрій, він просто видаляє файлову систему з простору імен. Записи на відкриття файлів можуть продовжуватися.
  • Це може призвести до пошкодження файлової системи btrfs

Подолання / альтернатива

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

Такої ж поведінки можна досягти, встановивши порожній каталог з дозволами 000на каталог, який потрібно відключити.

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

Спочатку спробуйте remount,ro

Основне досягнення, яке потрібно розблокувати, - це перерахунок лише для читання. Коли ви отримуєте remount,roзначок, ви знаєте, що:

  1. Усі очікувані дані були записані на диск
  2. Усі майбутні спроби запису не зможуть
  3. Дані перебувають у постійному стані, якщо вам потрібно фізично відключити пристрій.

mount -o remount,ro /dev/device гарантовано не вдасться, якщо є файли, відкриті для запису , тому спробуйте це прямо. Можливо, вам пощастить, панку!

Якщо вам не пощастило, зосередьтеся лише на процесах із відкритими для запису файлами :

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

Тоді ви маєте змогу перезавантажувати пристрій лише для читання та забезпечувати стабільний стан.

Якщо ви не можете перекомпонувати лише для читання в даний момент, дослідіть деякі інші можливі причини, перелічені тут .

Розблоковане досягнення для повторного монтажу лише для читання 🔓☑

Вітаємо, ваші дані на точці моменту тепер є послідовними та захищеними від подальших записів.

Чому fuserвона поступаєтьсяlsof

Чому б не використовувати використання fuserраніше? Ну, ви могли б мати, але fuserпрацює над каталогом , а не пристроєм , тому якщо ви хочете видалити місце монтажу з простору імен файлів і все-таки використовувати fuser, вам потрібно буде:

  1. Тимчасово скопіюйте mount -o bind /media/hdd /mntточку монтажу в інше місце
  2. Сховати початкову точку монтажу та заблокувати простір імен:

Ось як:

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"

Потім у вас буде:

  1. Прихована простора імен прихована (більше файлів неможливо відкрити, проблема не може погіршитися)
  2. Дублікат встановленого каталогу, що встановлюється (на відміну від пристрою), на якому потрібно запускати fuser.

Це більш складне [1] , але дозволяє використовувати:

fuser -vmMkiw <mountpoint>

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

У -wкомутаторі обмежує для написання процесів, і -iє інтерактивним, тому після того, як тільки для читання перемонтування, якщо ви це поспіхом ви могли б використовувати:

fuser -vmMk <mountpoint>

щоб знищити всі процеси, що залишилися, з файлами, відкритими під монтом.

Сподіваємось, що в цей момент ви можете відключити пристрій. (Вам потрібно буде запуститись umountна точку кріплення двічі, якщо ви прив’язали змонтований 000каталог режимів зверху.)

Або скористайтеся:

fuser -vmMki <mountpoint>

інтерактивно вбивати залишилися процеси лише для читання, блокуючи відключення.

Чорт, я все одно отримую target is busy!

Відкриті файли - не єдиний блокувальник відключення. Дивіться тут і тут про інші причини та способи їх усунення.

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

Потім ви можете скористатись lsof +f -- /dev/deviceсписком усіх процесів з відкритими файлами на пристрої, що містить файлову систему, а потім знищити їх.


[1] Використання менш складне mount --move, але це вимагає mount --make-private /parent-mount-pointнаслідків . В основному, якщо точка монтажу встановлена ​​під /файловою системою, ви хочете цього уникнути.


1
Якщо --lazyце так небезпечно, чому на umountсторінці "man" не так багато, як попередження ? Все це говорить, « Лінивий демонтувати Detach файлову систему з файлу ієрархії тепер, і очистити всі посилання на цю файлову систему , як тільки він не зайнятий більше .. »
bitinerant

7

Перевірте експортовані файлові системи NFS з exportfs -v. Якщо його знайдено, видаліть з каталогуfsfs -d share: /. Вони не відображаються в списку термінів / lsof, і це може запобігти успішному виконанню чисельності.


1
Дякую за цю пораду. Для видалення блокування довелося використовувати exportfs -ua.
FuePi

6

Перевірте umount2:

Linux 2.1.116 додав системний виклик umount2 (), який, як і umount (), відмикає ціль, але дозволяє додаткові прапори, що контролюють поведінку операції:

MNT_FORCE (з Linux 2.1.116) примусово відключається, навіть якщо він зайнятий. (Тільки для монтажу NFS.) MNT_DETACH (з Linux 2.4.11) Виконайте ледачий відключення: зробіть точку монтажу недоступною для нових доступів і фактично виконайте відключення, коли точка монтажу перестає бути зайнятою. MNT_EXPIRE (з Linux 2.6.8) Позначте точку монтажу як закінчену. Якщо точка монтажу наразі не використовується, то початковий дзвінок на umount2 () з цим прапором закінчується помилкою EAGAIN, але маркує точку монтажу як закінчену. Точка монтажу залишається закінченою до тих пір, поки жоден процес не отримає доступ до неї. Другий виклик umount2 () із зазначенням MNT_EXPIRE відключає термін монтажу, що минув. Цей прапор не можна вказати ні MNT_FORCE, ні MNT_DETACH. Повернене значення

При успіху повертається нуль. При помилці повертається -1, а errno встановлюється відповідним чином.


На жаль це не монтажі NFS, а CIFS. Я спробую MNT_DETACH, хоча. Однак якщо umount -l не працював, я не можу уявити, що це було б набагато інакше. Дякую, хоча!
Макс

2

Хтось згадав, що якщо ви використовуєте термінал і ваш поточний каталог знаходиться всередині шляху, який ви хочете відключити, ви отримаєте помилку.
Як доповнення, у цьому випадку ви lsof | grep path-to-be-unmountedповинні мати нижчий результат:

bash ... path-to-be-unmounted

1

Ще одна альтернатива, коли все працює - це редагування /etc/fstab, додавання noautoпрапора та перезавантаження машини. Пристрій не буде встановлено, і коли ви все закінчите, видаліть прапор і перезавантажте знову.


0

Ніша відповідь:

Якщо на цьому пристрої є пул zfs, принаймні, коли це пул на основі файлів, lsofвикористання не відображатиметься. Але можна просто бігати

sudo zpool export mypoo

а потім відключити.

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