Размонтирование съемных устройств (eSATA, USB-накопители) в Linux

Размонтирование съемных устройств (eSATA, USB-накопители) в Linux

Съемное устройство, такое как eSATA, USB-накопитель, можно отключить внезапно (просто выдернув вилку из розетки).

Если на разделе есть открытые дескрипторы файлов, то этот раздел не будет размонтирован, т.е. umountкоманда Linux завершится ошибкой, даже ПОСЛЕ того, как диск будет физически отключен.

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

Я не вижу опции «принудительного размонтирования», она есть -f, но она только для NFS.

Это звучит очень странно, разве Linux не учитывает этот сценарий, когда пользователь просто выдергивает диск? Кто-нибудь знает, как изящно обработать этот сценарий в Linux?

Есть ли способ узнать, какие дескрипторы файлов открыты на определенном разделе/устройстве или выборочно очистить и закрыть все дескрипторы файлов только для определенного устройства?

Примечание: эта lsofкоманда недоступна во встраиваемой системе Linux, которую я использую (busybox).


«fuser» недоступен в моем встроенном Linux.

Я попробовал ленивый umount -l. Однако, похоже, он не всегда работает. Например, я держу открытым дескриптор файла (с "tail -f" на каком-то файле на устройстве). Затем я отсоединяю диск, а затем выполняю "umount -l", и он отмонтируется. А затем я снова подключаю диск и пытаюсь снова смонтировать его в той же точке монтирования, пока tail все еще работает. Он не всегда работает. Иногда это удается, а иногда нет. Это делает мне неудобным использование ленивого параметра, что если он оставит файловую систему в несогласованном состоянии. И также я не уверен, был ли этот ленивый параметр предназначен для использования в таких сценариях.

Я не могу завершить процесс, у которого открыты дескрипторы файлов.


Кажется, если я смонтировал устройство, скажем, в /mnt/abc, и если я отключу диск, а затем снова подключу, Linux, похоже, снова подключит файловую систему устройства к той же точке монтирования "/mnt/abc", без выполнения нами какого-либо размонтирования или монтирования. И затем те же старые открытые файловые дескрипторы, похоже, начинают работать после повторного присоединения (по крайней мере, для операции чтения файла). Это мое наблюдение. Я не уверен, является ли это ожидаемым поведением.. Однако это также, похоже, не работает последовательно.

У меня был открытый дескриптор файла для чтения ("tail -f"), который я оставил открытым, затем я отсоединил и снова присоединил, а затем изменил отслеживаемый файл и увидел, что вывод "tail -f" обновляется с изменениями. Однако, если я пытаюсь изменить файл после того, как устройство исчезло (как и ожидалось, выдается ошибка), а затем я снова присоединяюсь, файловая система устройства не подключается должным образом к той же точке монтирования. В случае записи файла (когда устройства не было) это, похоже, не работает.

Существует ли стандартное/последовательное поведение Linux при резком извлечении диска без закрытия всех дескрипторов и корректного размонтирования всех разделов?

решение1

Вы можете написать bash-скрипт для сканирования всех файловых дескрипторов, перечисленных в /proc(предположим, они у вас есть), а также для вывода списка или завершения процессов.

/proc/$m/fd/$nявляется n-ным файловым дескриптором для PID m, представленным в виде символической ссылки. busyboxимеет поддержку readlink, поэтому вы можете автоматизировать ее.

Редактировать: По сути, это повторная реализация lsof, но на самом деле все довольно просто.

решение2

Вы можете использовать lsofдля просмотра списка открытых файлов в определенном каталоге с помощью lsof +D /path/to/mountpoint.

решение3

Попытался ли ты:

umount -l /path/to/mountpoint
Или

fuser -km /path/to/mountpoint
?


Хорошо, мои предыдущие предложения не сработали. Я знаю, что это может быть глупо, но вы действительно пробовали:

umount -f /path/to/mountpoint

Согласно документации Busybox, это должна быть опция принудительного размонтирования (в качестве примера показан NFS).

Если это не сработало, пробовали ли вы:

eject -s /dev/my-sata-or-usb-device

решение4

Быстрое решение, когда у вас не хватает, lsof— заменить find /proc/*/fd | xargs readlink | grep /mount_pointmount_point на фактическую точку монтирования. Это основано на ответе billc.cn выше.

Связанный контент