Название: Определение серийного номера USB-накопителя Отправлено: andrew.k от Июль 02, 2010, 10:43 Задача:
Запретить монтирование носителей, которые не зарегистрированы в системе. Монтирование произвожу сам (среда изолированная), поэтому мне достаточно определить можно ли монтировать данное устройство. Подход: Серийный номер определяю при помощи libusb. Далее, если номер зарегистрирован монтирую блочное устройство /dev/sdb1 например. Условия: Система МСВС 14 изм 2. udev там нет. Поэтому через него не реализовать, надо как-то выкручиваться. Суть проблемы: libusb различает устройства по номеру шины и номеру порта юсб. Поэтому все что я могу определить это сколько устройств подключено и их серийные номера. Но не могу определить какому блочному файлу они соотвествуют (/dev/sdb ? /dev/sdc) Пример: Имею два подключенных устройства (флешки). libusb их видит и сообщает, что они висят на шине 001 и на портах 010 и 011. Один серийный номер зарегистрирован, другой нет. Определяю номера 010 - не зарегистрирована, 011 - зарегистрирована. Далее я перехожу к этапу монтирования. смотрю список устройств. Вижу, что имеется /dev/sdb1 и /dev/sdc1. Вопрос: Как определить, кого монтировать можно, а кого нет? Как провести соответствие между номером порта юсб и блочным устройством? Можно еще попробовать определить минорный номер, но мне это не удалось. Пытался разобраться с usbdevice_fs.h, пытался извлеч какую-то инфу, но почему-то у меня ничего не вышло. Видимо не смог правильно воспользоваться. Призыв: Помогите! :) Название: Re: Определение серийного номера USB-накопителя Отправлено: kuzulis от Июль 02, 2010, 11:01 Цитировать Можно еще попробовать определить минорный номер, но мне это не удалось. вот небольшой примерчик для Linux для определения мажорного и минорного номеров устройства:Код: if (!result.isEmpty()) { где m_name - имя у-ва (например /dev/sda) смотрите в примере на struct stat buf и на major/minor , а на остальное не смотрите. ЗЫ: пример на Qt был Название: Re: Определение серийного номера USB-накопителя Отправлено: andrew.k от Июль 02, 2010, 11:06 Цитировать Можно еще попробовать определить минорный номер, но мне это не удалось. вот небольшой примерчик для Linux для определения мажорного и минорного номеров устройства:Проблема определить минорный при помощи libusb для заданного устройства это проблема или скорее вообще невозможно. Как мне определить какому устройству в libusb соответствует /dev/sdb? Мажорный и минорный номер присваивает kernel на сколько я понял по логам, может у кернеля как-то можно запросить? Название: Re: Определение серийного номера USB-накопителя Отправлено: kuzulis от Июль 02, 2010, 11:23 дык:
Код: ... или я не понял? --- аа.. вроде понял... смотрите тогда в сторону : struct stat там есть поле: Цитировать st_ino Serial number for the file. мож оно? может даже не понадобится libusb Название: Re: Определение серийного номера USB-накопителя Отправлено: andrew.k от Июль 02, 2010, 13:23 дык: Код: ... или я не понял? --- аа.. вроде понял... смотрите тогда в сторону : struct stat там есть поле: Цитировать st_ino Serial number for the file. мож оно? может даже не понадобится libusb Оно! Только где Вы взяли такое поле? У меня написано: ino_t st_ino; /* inode number */ Боюсь, что это какая-то ошибка. Название: Re: Определение серийного номера USB-накопителя Отправлено: andrew.k от Июль 02, 2010, 13:29 А если зайти с другой стороны. Допустим исходным значением имя блочного файла /dev/sdb1.
Как определить какому реальному устройству оно сопоставлено? должны же быть какие-то другие функции. ведь open его открывает и как-то узнает, к какому устройству нужно обращаться. Или ядро перенаправляет его запросы, скорее всего, и для него нет разницы что он открывает. Значит надо у ядра эту информацию как-то запросить. Довольно тривиальная задача с виду, неужели нет решения? Название: Re: Определение серийного номера USB-накопителя Отправлено: vladimir_l от Февраль 09, 2011, 13:50 Столкнулся с точно такой же проблемой. Из программы нужно распаролить (пользуюсь libusb), а потом монтировать и открыть устройство usb как флэшку, но как определить что монтировать не знаю. Неужели никто не нашел решение???????
Название: Re: Определение серийного номера USB-накопителя Отправлено: vladimir_l от Февраль 11, 2011, 10:37 Вопрос: Как определить, кого монтировать можно, а кого нет? Как провести соответствие между номером порта юсб и блочным устройством? Можно еще попробовать определить минорный номер, но мне это не удалось. Призыв: Помогите! :) :'( Неужели никто не знает? Название: Re: Определение серийного номера USB-накопителя Отправлено: andrew.k от Февраль 12, 2011, 14:01 Вопрос: Как определить, кого монтировать можно, а кого нет? Как провести соответствие между номером порта юсб и блочным устройством? Можно еще попробовать определить минорный номер, но мне это не удалось. Призыв: Помогите! :) :'( Неужели никто не знает? Как я решил проблему. Как говорится все гениальное просто. Когда я до этого додумался, удивился, что мне сразу не пришло это в голову. 1. При помощи libusb проверяем подключенные устройства, сверяем с базой зарегистрированных. Если все подключенные устройства "хорошие", то можно монтировать все обнаруженные символьные устройства (sdb, sdc...). 2. Если есть хотя бы одно устройство левое (которого нет в нашей базе), то монтирование запрещается и все примонтированные устройства нужно размонтировать. Все. Нет проблем :) Еще мне было предложено решение, но мне оно не понравилось, я не стал его использовать. Это постоянно сканировать /var/log/messages, и отслеживать системные сообщения относящиеся к флешкам, тогда можно установить соответствие между символьным именем и серийным номером. Название: Re: Определение серийного номера USB-накопителя Отправлено: Ashborn от Март 30, 2012, 09:50 От себя добавлю ещё 5 копеек, ибо тема редкая
В силу специфики работы, как и vladimir_l , занимался монтированием флешки, которая хитро дешифровалась и переподключалась. Для чего в нагрузку к приложению был написан демон-парсер /var/log/messages который, находя новое устройство ("hub.c: new USB device 02:00.0-1, assigned address 10"), искал в следующих строчках сообщение типа ("sd*: sd*1"), а после узнавал про него всё через /proc/bus/usb/devices. Метод плохой, но такого Цитировать Если есть хотя бы одно устройство левое (которого нет в нашей базе), то монтирование запрещается и все примонтированные устройства нужно размонтировать. себе позволить было нельзя. Но если у кого найдётся (ВНЕЗАПНО) ещё один вариант решения — милости прошу отписаться, рефакторинг в данном случае считаю вполне уместным, но, за неимением других вариантов...Название: Re: Определение серийного номера USB-накопителя Отправлено: andrew.k от Март 30, 2012, 11:52 От себя добавлю ещё 5 копеек, ибо тема редкая У меня тоже был такой вариант решения. Правда это делал всего лишь скрипт. Но я решил, что извлекать информацию из логов более не круто, чем запрещать монтирование новых флеш, при одной запрещенной. Тут я хотя бы уверен.В силу специфики работы, как и vladimir_l , занимался монтированием флешки, которая хитро дешифровалась и переподключалась. Для чего в нагрузку к приложению был написан демон-парсер /var/log/messages который, находя новое устройство ("hub.c: new USB device 02:00.0-1, assigned address 10"), искал в следующих строчках сообщение типа ("sd*: sd*1"), а после узнавал про него всё через /proc/bus/usb/devices. Метод плохой, но такого "А лог-файл и подделать можно" - Матроскин (С) |