4

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

Если в разделе есть дескрипторы открытых файлов, то эти разделы не будут размонтированы, т. Е. Команда Linux umount не будет работать, даже если диск физически отсоединен.

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

Я не вижу опции "принудительное отключение", есть опция -f , но она только для NFS.

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

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

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


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

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

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


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

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

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

4 ответа4

3

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

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

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

2

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

1

Ты пытался:

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .