Избегайте 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
дважды запустить точку монтирования, если вы установили привязку к 000
каталогу mode сверху.)
Или используйте:
fuser -vmMki <mountpoint>
в интерактивном режиме уничтожить оставшиеся процессы только для чтения, блокирующие размонтирование.
Черт возьми, я все еще получаю target is busy
!
Открытые файлы - не единственный размонтируемый блокировщик. Смотрите здесь и здесь о других причинах и способах их устранения.
Даже если у вас есть скрывающийся гремлин, который мешает вам полностью размонтировать устройство, вы, по крайней мере, получили свою файловую систему в согласованном состоянии.
Затем вы можете использовать lsof +f -- /dev/device
список всех процессов с открытыми файлами на устройстве, содержащем файловую систему, а затем уничтожить их.
[1] Это менее замысловато для использования mount --move
, но это требует, mount --make-private /parent-mount-point
что имеет последствия . По сути, если точка монтирования монтируется под /
файловой системой, вы бы хотели этого избежать.