Russian Qt Forum

Компиляторы и платформы => Linux => Тема начата: andrew.k от Июль 02, 2010, 10:43



Название: Определение серийного номера 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()) {
        struct stat buf;
        if (::stat(this->m_name.toLocal8Bit().constData(), &buf))
            result.clear();
        else {
            result.append("/LCK.%1.%2");
            result = result.arg(major(buf.st_rdev)).arg(minor(buf.st_rdev));
        }
    }

где 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
дык:
Код:
...
minor(buf.st_rdev)
...

или я не понял?
---
аа.. вроде понял...

смотрите тогда в сторону : struct stat
там есть поле:
Цитировать
st_ino  
    Serial number for the file.

мож оно?

может даже не понадобится libusb


Название: Re: Определение серийного номера USB-накопителя
Отправлено: andrew.k от Июль 02, 2010, 13:23
дык:
Код:
...
minor(buf.st_rdev)
...

или я не понял?
---
аа.. вроде понял...

смотрите тогда в сторону : 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. Метод плохой, но такого
У меня тоже был такой вариант решения. Правда это делал всего лишь скрипт. Но я решил, что извлекать информацию из логов более не круто, чем запрещать монтирование новых флеш, при одной запрещенной. Тут я хотя бы уверен.
"А лог-файл и подделать можно" - Матроскин (С)