Обнаружение извлечения / размонтирования USB-накопителя в Linux - PullRequest
3 голосов
/ 28 августа 2009

Я использую гаджет g_file_storage в Linux, чтобы экспортировать раздел как съемное запоминающее устройство USB для хост-компьютеров (Windows, Linux, MAC).

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

Единственный способ, который я нашел, ограничен Windows XP. Когда пользователи выбирают «Безопасное извлечение устройства», XP переводит USB-устройство в режим ожидания, который можно обнаружить на удаленном конце. По какой-то причине это не работает в Vista.

Ответы [ 4 ]

4 голосов
/ 08 сентября 2009

Я тоже затронул эту проблему.

Мой встроенный проект USB, предназначенный только для чтения, запоминает команды SCSI от хоста. В Mac OS X (10.5): при подключении к плагину драйвер OS X довольно неплохо сообщает устройству о необходимости удаления носителя (команда SCSI PREVENT / ALLOW MEDIUM REMOVAL). Мое устройство принимает эту команду. Позже, когда пользователь сообщает, что устройство должно быть извлечено, OS X, опять же, довольно приятно, снова отправляет PREVENT / ALLOW REMOVAL с флагом ALLOW, а затем отправляет SCSI START / STOP с указанием остановки (или извлечения, не может запомнить). Красивые.

Однако Windows XP, похоже, просто перестает отправлять команду SCSI TEST UNIT READY. Я смотрел; «безопасно удалить оборудование» вообще не посылает сигнал SCSI, он просто заставляет сигнал TEST UNIT READY перестать поступать, что он делал каждую секунду или около того. В основном Windows просто замолкает.

Время ожидания TEST UNIT READY может работать с Windows, но это плохой способ обнаружить состояние остановки устройства. Кроме того, он не будет работать с OS X, поскольку OS X не пингует мое устройство каждую секунду, как Windows; Я бы получил ложное срабатывание.

ОБНОВЛЕНИЕ 15 НОЯБРЯ 2009

Зондергаард здесь отчитывается.

Многое зависит от того, идентифицирует ли устройство ответ на команду SCSI «Запрос» SCSI класса запоминающего устройства самостоятельно как «съемный» или «фиксированный».

Если флаг говорит «съемный», то единственный способ узнать, «остановил» ли мой пользователь Windows XP мое устройство, - это то, что команды, готовые для тестирования, перестают поступать каждую секунду. Если флаг не говорит «съемный», то нет регулярного потока команд test-unit-ready. Нельзя было рассчитывать на USB-приостановку, примерно в 1/4 моих тестов «безопасно удалить» НЕ отправлял USB-приостановку. Понятия не имею, почему это не соответствует. Поэтому, если вы хотите быть уверенным, лучшая рекомендация, которую я могу дать для совместимости только с WINDOWS XP, - это отвечать на запрос как «съемный», искать обычные команды TEST UNIT READY, а затем, когда они перестанут, считать себя удаленным.

OS X (10.6) - это отдельная история. Как я уже писал выше, это гораздо более вежливо. Он отправляет SCSI START / STOP для ускорения или замедления устройства, иногда само по себе, без участия пользователя. Но это означает, что если вы интерпретируете STOP как сообщение о том, что пользователь прошел, и отключаете его любым уродливым способом, внутренним для вашего устройства, OS X может очень запутаться, когда попытается снова раскрутить диск. Если ваше устройство помечено как съемное, OS X перед STOP отправит команду ALLOW REMOVAL (или это было EJECT в этом случае?), Это было бы довольно хорошим признаком того, что оно прошло.

Я не исчерпывающе пробовал разные конфигурации. Мое приложение доступно только для чтения с двумя разделами и должно быть идентифицировано как НЕ Съемное, потому что Windows XP отказывается подтверждать более одного раздела для съемных USB-накопителей (OS X не имеет проблем в любом случае). Поэтому большая часть моего тестирования была в этой конфигурации.

Надеюсь, это поможет.

1 голос
/ 29 августа 2009

К сожалению, я не могу выдать решение, так как я не очень знаком с этой темой, но несколько указателей.

Но есть несколько вариантов, где вы можете начать проверять решения.

  • Mer (maemo opensource fork) делает (afaik) прошивку / дистрибутив для множества различных гаджетов. Когда вы подключаете устройство такого типа к USB-хосту, оно автоматически монтируется и также замечает отключение от USB-хоста. Там обязательно будет что-то для вас работать. Вы также можете перейти на #mer в irc.freenode.net
  • Если вы экспортируете только через USB, вы могли бы как-то контролировать драйвер USB, если к нему подключены клиенты? usb apis libusb и гаджет, вероятно, обеспечивает подходящий способ ...
0 голосов
/ 28 августа 2009

Я не думаю, что хост-ОС обязана что-либо сигнализировать гаджету. Я понимаю, что действие Извлечь состоит в том, что хост-операционная система больше не имеет ничего общего с гаджетом.

0 голосов
/ 28 августа 2009

РЕДАКТИРОВАТЬ: вы, вероятно, ищете решение для Windows, даже если вы пометили свой вопрос как Linux ...

вы можете проверить вывод dmesg следующим образом:

[31027.944083] USB 2-2: USB отключить, адрес 2

...