Как отключить занятое устройство

246

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

Я хочу знать, если я удаляю диск из своей таблицы SQL (фактически переводя его в автономный режим), каким образом или вообще существует способ размонтировать занятое устройство? До сих пор я обнаружил, что любая форма umountне работает.

Не обращая внимания на возможность уничтожения данных - возможно ли отключить устройство, которое в данный момент читается?

Максимум
источник
3
Более общий ответ, касающийся
Оле
2
Здравствуйте, возможно вы cdподключили dir, затем вы стали пользователем root или снова вошли в систему, а другая оболочка оказалась в ловушке. Делай 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
Вроде страшно. Я ленивый-размонтированный и перемонтированный, в то время как некоторые другие процессы все еще обращались к нему. Таким образом, я полагаю, что дважды смонтировал его в одном месте? Не уверен, что это сделал.
Судо
121

Если возможно, давайте найдем / идентифицируем занятый процесс, уничтожим процесс, а затем размонтируем общий ресурс samba, чтобы минимизировать ущерб.

  • lsof | grep '<mountpoint of /dev/sda1>' (или каким бы ни было установленное устройство)

  • pkill target_process(убивает занятого по имени | kill PID| killall target_process)

  • umount /dev/sda1 (или каким бы ни было установленное устройство)

Фрэнк Тюдор
источник
6
Это ничего не возвращает. Я предполагаю это, потому что это сетевой диск, и я не могу видеть процессы других компьютеров, обращающихся к диску. То же самое относится и к командам "fuser".
Макс
о черт ... вам нужны команды samba ... / usr / bin / smbclient service <пароль>: посмотрите, с чего это можно начать ... tldp.org/HOWTO/SMB-HOWTO-8.html
Фрэнк Тюдор
2
Команды smb фактически устарели и заменены на «umount.cifs» .... что также не работает. Похоже, что я застрял в неспособности размонтировать, пока он занят.
Макс
Если вы используете Asuswrt-Merlin, вам необходимо установить lsof:# opkg install lsof
Tonatio
1
вам нужно sudo lsof, чтобы получить некоторые результаты
aheigins
78

Убедитесь, что вы все еще не подключены к устройству, когда пытаетесь подключиться.

Luci
источник
4
Точно, просто открыв текущую папку (расположенную на целевом устройстве) в вашем терминале (например, с помощью команды cd), можно остановить процесс размонтирования :)
jave.web
2
Да, у меня была оболочка, работающая в каталоге на устройстве.
Закрыл
Также убедитесь, что внутри той точки, которую вы пытаетесь установить, нет никаких других точек монтирования umount.
victe
@victe Спасибо; Я копировал папку с помощью pfexec mount -F vboxfs carpetacompartida ~ / Documents on Solaris 11; но у Документов были подпапки, и это было проблемой.
Дани Ая
44

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

В -iфлаг марки fuserспросить , прежде чем убить.

fuser -kim /address  # kill any processes accessing file
unmount /address
user3751769
источник
5
lsof | grep '/dev/<my-device>ничего не вернул, но это прекрасно работает! Может также предложить, fuser -m /dev/<my-device>если вы хотите узнать процесс, прежде чем убить его.
modulitos
3
Запуск команды fuser сразу отключил меня от 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каталогу mode сверху.)

Или используйте:

fuser -vmMki <mountpoint>

в интерактивном режиме уничтожить оставшиеся процессы только для чтения, блокирующие размонтирование.

Черт возьми, я все еще получаю target is busy!

Открытые файлы - не единственный размонтируемый блокировщик. Смотрите здесь и здесь о других причинах и способах их устранения.

Даже если у вас есть скрывающийся гремлин, который мешает вам полностью размонтировать устройство, вы, по крайней мере, получили свою файловую систему в согласованном состоянии.

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


[1] Это менее замысловато для использования mount --move, но это требует, mount --make-private /parent-mount-pointчто имеет последствия . По сути, если точка монтирования монтируется под /файловой системой, вы бы хотели этого избежать.

Том Хейл
источник
1
Если --lazyэто так опасно, почему на umountстранице руководства не так много предупреждений ? Все это говорит, « Ленивый размонтировать Detach файловую систему из файла иерархии теперь, и очистить все ссылки на эту файловую систему , как только он не занят больше.. »
bitinerant
7

Проверьте экспортированные файловые системы NFS с помощью exportfs -v. Если найдено, удалите с помощью команды exportfs -d share: / directory. Они не отображаются в списке fuser / lsof и могут помешать успешному выполнению umount.

numberer6
источник
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флага и перезагрузка компьютера. Устройство не будет подключено, и когда вы закончите делать что-либо, снимите флажок и перезагрузите компьютер снова.

jesjimher
источник
0

Ниша Ответ:

Если у вас есть пул zfs на этом устройстве, по крайней мере, если это пул на основе файлов, lsofне будет отображаться использование. Но вы можете просто запустить

sudo zpool export mypoo

а затем размонтировать.

lucidbrot
источник