У меня есть несколько дисков Samba, к которым ежедневно обращаются несколько пользователей. У меня уже есть код для распознавания общих дисков (из таблицы SQL) и подключения их в специальный каталог, где все пользователи могут получить к ним доступ.
Я хочу знать, если я удаляю диск из таблицы SQL (фактически переводя его в автономный режим), каким образом или вообще существует способ размонтировать занятое устройство? До сих пор я обнаружил, что любая форма umount
не работает.
Игнорирование возможности уничтожения данных - возможно ли отключить устройство, которое в данный момент читается?
Ответ 8
Избегайте umount -l
На момент написания статьи, получивший наибольшее количество голосов, рекомендуется использовать umount -l
.
umount -l
опасен или в лучшем случае небезопасен. В итоге:
- На самом деле он не размонтирует устройство, он просто удаляет файловую систему из пространства имен. Пишет для открытия файлов можно продолжить.
- Это может привести к повреждению файловой системы btrfs
Обойти/альтернатива
Полезное поведение umount -l
скрывает файловую систему от доступа по абсолютным путям, сводя к минимуму дальнейшее использование точки монтирования.
Такое же поведение может быть достигнуто путем монтирования пустого каталога с разрешениями 000
над каталогом, который нужно размонтировать.
Тогда любой новый доступ к именам файлов в нижеприведенной точке монтирования ударит по вновь наложенному каталогу с нулевыми разрешениями - тем самым будут предотвращены новые блокирующие устройства для размонтирования.
Сначала попробуйте remount,ro
Основное размонтированное достижение, которое нужно разблокировать, - это перемонтирование только для чтения. Когда вы получаете значок remount,ro
, вы знаете, что:
- Все ожидающие данные были записаны на диск
- Все будущие попытки записи потерпят неудачу
- Данные находятся в согласованном состоянии, если вам необходимо физически отключить устройство.
mount -o remount,ro /dev/device
гарантированно потерпит неудачу, если есть файлы, открытые для записи, поэтому попробуйте это прямо. Возможно, тебе повезло, панк!
Если вам не повезло, сосредоточьтесь только на процессах с файлами, открытыми для записи:
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
После этого вы сможете перемонтировать устройство только для чтения и обеспечить согласованное состояние.
Если вы не можете перемонтировать только для чтения на этом этапе, выясните некоторые другие возможные причины, перечисленные здесь.
Разблокировано достижение повторной монтировки только для чтения 🔓☑
Поздравляем, ваши данные на точке монтирования теперь согласованы и защищены от записи в будущем.
Почему fuser
уступает lsof
Почему бы не использовать использовать fuser
раньше? Ну, вы могли бы, но fuser
работает с каталогом, а не с устройством, поэтому, если вы хотите удалить точку монтирования из пространства имен файлов и по-прежнему использовать fuser
, вам необходимо:
- Временно дублируйте точку монтирования с
mount -o bind /media/hdd /mnt
в другом месте
- Скройте исходную точку монтирования и заблокируйте пространство имен:
Вот как:
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"
Тогда у вас будет:
- Оригинальное пространство имен скрыто (больше не может быть открыто файлов, проблема не может ухудшиться)
- Каталог, подключенный к дубликатам (в отличие от устройства), на котором
запустить
fuser
.
Это более запутанный [1], но позволяет использовать:
fuser -vmMkiw <mountpoint>
который в интерактивном режиме попросит убить процессы с файлами, открытыми для записи. Конечно, вы могли бы сделать это, вообще не скрывая точку монтирования, но все вышеперечисленное повторяет umount -l
, без каких-либо опасностей.
Переключатель -w
ограничивает процессы записи, а -i
является интерактивным, поэтому после перемонтирования только для чтения, если вы торопитесь, вы можете использовать:
fuser -vmMk <mountpoint>
убить все оставшиеся процессы с файлами, открытыми под точкой монтирования.
Надеемся, что в этот момент вы можете размонтировать устройство. (Вам нужно будет дважды запустить umount
на точке монтирования, если вы связали подключенный каталог mode 000
сверху.)
Или используйте:
fuser -vmMki <mountpoint>
для интерактивного уничтожения оставшихся процессов только для чтения, блокирующих размонтирование.
Черт возьми, я все еще получаю target is busy
!
Открытые файлы - не единственный размонтируемый блокировщик. Смотрите здесь и здесь, чтобы узнать о других причинах и способах их устранения.
Даже если у вас есть какой-то скрывающийся гремлин, который мешает вам полностью размонтировать устройство, вы, по крайней мере, получили свою файловую систему в согласованном состоянии.
Затем у вас есть две возможности размонтировать устройство: маршрут lsof или XXX:
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.