как получить серийный номер с USB-устройства в Unix-подобных системах

Бинарный файл находится на USB-ключе, используемом в качестве ключа.

Мне нужно получить уникальный идентификатор из ключа. VendorID + DeviceID не может быть и речи, потому что они могут быть одинаковыми, если модели USB-ключа одинаковы.

В Windows я использую функцию GetVolumeInformation(), которая дает мне серийный номер, который меняется каждый раз при форматировании устройства (не проблема).

Используя Unix, чтобы получить тот же серийный номер, мне нужно прочитать соответствующий файл монтирования в каталоге /dev/. Но для этой операции требуется доступ root, или, по крайней мере, мне нужно быть частью определенной группы.

Уникальный идентификатор может отличаться от серийного номера в системах Win32. Но он должен быть разным для каждого USB-ключа, который я буду использовать для доставки.

Любые идеи ?


person perelo    schedule 15.05.2012    source источник
comment
Vendor_ID+Product_ID+USB_SerialNumber уникален. VID+PID очевидно, что это то же самое, если модели USB-ключей одинаковы, по определению одной и той же модели.   -  person MSalters    schedule 15.05.2012
comment
GetVolumeInformation() указывает серийный номер файловой системы на USB-ключе, а не серийный номер USB-ключа. Больше можно найти в этих дубликатах: stackoverflow.com/q/4327032/79455 и stackoverflow.com/q/2432759/79455   -  person rve    schedule 15.05.2012


Ответы (3)


Вы можете посмотреть в каталоге /dev/disk/by-uuid/. Есть символические ссылки на узлы устройств, а имена символических ссылок - это идентификаторы разделов.

person ArtifTh    schedule 15.05.2012
comment
uuid изменяется при форматировании раздела, это как GetVolumeInformation() - person perelo; 23.05.2012

Вот несколько идей:

  • Устройство автоматически монтируется в системе? Если это так, он может быть смонтирован с именем устройства автоматическим монтированием, и команда mount сообщит вам имя устройства. Например. что-то монтируется в /media/ABCD-1234, тогда ABCD-1234 — это имя устройства, указанное в таблице разделов.
  • В файловой системе /sys существует некоторая информация об устройстве. Один размер, для каждого раздела. Вы можете разместить на устройстве несколько разделов и использовать один неформатированный раздел (который не будет монтироваться) определенного размера. Тогда размер этого раздела будет вашим серийным номером, доступным, например. на /sys/block/sdb/sdb1/size, который доступен для чтения всем.
person mistalee    schedule 15.05.2012
comment
Имя точки монтирования не является надежным, если пользователь вручную монтирует устройство, программа не работает ... Что касается размера раздела, пользователь может (по ошибке?) Изменить его или что-то в этом роде. - person perelo; 23.05.2012

Мне удалось получить серийный номер, получив файл /dev с помощью команды df

Затем использовал этот код и немного изменил его:

серийный номер USB-накопителя в Linux C++

3-й ответ (Оруэллофил)

Я не уверен, что это будет работать на всех системах Unix, но пока это нормально.

person perelo    schedule 23.05.2012