2009-08-28 6 views
3

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

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

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

+0

Это не относится к суперпользователю. Решение, вероятно, связано с каким-то мониторингом sysfs или худшим хакером ядра. – shodanex

ответ

-1

EDIT: Вы, вероятно, ищете решения Windows, даже если помечен ваш вопрос, как Linux ...

вы можете проверить dmesg для вывода, как это:

[31027,944083] USB 2-2 : USB disconnect, address 2

+0

Нет, он находится в ящике Linux, пытаясь узнать, вынул ли/отключил диск Windows – shodanex

+0

. Извлечение/размонтирование * действие * происходит на хосте (может быть Window), но я бы хотел его обнаружить на стороне устройства (Linux). К сожалению, ничто на стороне устройства (dmesg, udevinfo) ничего не показывает о событии на стороне хоста. – Gertjan

+0

Да, когда хост подключается к гаджету, нет нового «устройства», которое становится доступным для гаджета Linux, поэтому нет связанного действия с hotplug, и это очень больно. – shodanex

0

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

+0

Вот что я думаю тоже. Bus, когда я использую гаджет в режиме «съемный», я надеюсь, что смогу каким-то образом обнаружить, что хост отключил устройство. Мой MP3-плеер, например, * может * обнаружить его, поэтому должен быть какой-то способ сделать это. – Gertjan

1

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

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

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

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

Мой встроенный 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

Sondergaard здесь отчетное.

Очень многое зависит от того, является ли ответ устройства на команду SCSI «Запрос» USB Mass-Storage-Class самоопределяется как «съемный» или «фиксированный».

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^