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

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

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

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

Ответ 1

ДА!! Существует способ немедленно отсоединить занятое устройство (даже если оно занято и не может быть принудительно размонтировано). Вы можете очистить все позже:

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

НОТА:

  1. Эти команды могут нарушить работающий процесс, привести к потере данных или повреждению открытых файлов. Программы, обращающиеся к целевым файлам DEVICE/NFS, могут выдавать ошибки ИЛИ не работать должным образом после принудительного отключения.
  2. Попробуйте выполнить эти команды, когда НЕ находятся внутри смонтированной папки/диска/устройства.

Ответ 2

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

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

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

  • umount/dev/sda1 (или каким-либо другим образом подключенным устройством)

Ответ 3

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

Ответ 4

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

Флаг -i задает fuser запрос перед убийством.

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

Ответ 5

Отъезд 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 - установите надлежащим образом.

Ответ 6

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

Ответ 7

Другой альтернативой, когда что-то работает, является редактирование /etc/fstab, добавление флага noauto и перезагрузка компьютера. Устройство не будет подключено, и когда вы закончите делать что-либо, снимите флажок и перезагрузите компьютер снова.

Ответ 8

Избегайте 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 на точке монтирования, если вы связали подключенный каталог mode 000 сверху.)

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

fuser -vmMki <mountpoint>

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

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

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

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

Затем у вас есть две возможности размонтировать устройство: маршрут lsof или XXX:

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

[1] It is less convoluted to use [TG427], but that requires [TG428] which has implications. Basically, if the mountpoint is mounted under the [TG429] filesystem, you'd want to avoid this.