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

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

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

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

192
задан Javier Arias 12 March 2019 в 00:52
поделиться

1 ответ

Избегайте umount -l

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

umount -l опасно или в лучшем случае небезопасный . Таким образом:

  • Это на самом деле не размонтировало устройство, это просто удаляет файловую систему из пространства имен. Записи для открытия файлов могут продолжиться.
  • Это может вызвать btrfs повреждение файловой системы

Работа вокруг / альтернатива

, полезное поведение umount -l скрывает файловую систему от доступа [1 137] абсолютный пути, таким образом, минимизируя далее moutpoint использование.

Это то же поведение может быть достигнуто путем монтирования пустого каталога с полномочиями 000 по каталогу, который будет размонтирован.

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

Первая попытка к [1 110]

основной успех размонтирования, который будет разблокирован, является перемонтированием только для чтения. Когда Вы получаете remount,ro значок, Вы знаете что:

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

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

, Если Вы неудачны, сфокусируйтесь только на [1 132] процессы с файлами, открытыми для записи :

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

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

, Если Вы не можете повторно смонтироваться только для чтения в этой точке, займитесь расследованиями, некоторые из других возможных причин перечислили здесь .

успех перемонтирования Только для чтения разблокировал рџ” “⠘ ‘

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

, Почему fuser является нижним к [1 114]

, Почему бы не использовать использование fuser ранее? Ну, Вы могли иметь, но fuser работает на каталог , не устройство , поэтому если бы Вы хотели удалить точку монтирования из пространства имен файлов и все еще использовать fuser, то Вы должны были бы:

  1. Временно копируют точку монтирования с [1 118] к другому местоположению
  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 или XXX:

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

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

3
ответ дан 23 November 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: