
У меня есть USB-флешка, с которой я хотел бы считать серийный номер. Если я вызову команду,
lsusb -v
вывод в строке iSerial
будет следующим:
iSerial 3
Если я зайду /proc/scsi/usb-storage
и посмотрю в файл, то получу следующий вывод:
Host scsi10: usb-storage
Vendor: USB
Product: Disk 2.0
Serial Number: 92071573E1272519149
Protocol: Transparent SCSI
Transport: Bulk
Quirks:
Почему с одной стороны нет последовательного вывода с lsusb
командой, но с другой стороны я получаю серийный номер из /proc/scsi/usb-storage
. В чем разница между двумя методами сбора серийного номера?
решение1
lsusb
можете попробовать открыть USB-устройство как O_RDWR
(чтение/писатьmode) и у вашего пользователя может не быть прав на это (в таком случае между выводом должно быть сообщение об ошибке «Не удалось открыть устройство, часть информации будет отсутствовать»). Запущенный как root, он lsusb
также должен иметь возможность выводить все значение iSerial.
решение2
В целом существует множество различных USB-устройств (клавиатуры, мыши, веб-камеры, ...). lsusb
имеет дело с подключенными устройствами на уровне протокола USB.
Некоторые USB-устройства являются устройствами хранения данных (USB-накопители, жесткие диски USB, ...). Они понимают другой протокол (более или менее SCSI) поверх протокола USB. В рамках этого протокола USB-устройство хранения данных имеет серийный номер (как и устройство ATA). Это то, что вы видите в /proc/scsi/usb-storage
.
Число iSerial
, которое вы видите, lsusb
не имеет к этому никакого отношения.
Вот почему вы видите серийный номер, который вас интересует, одним методом, но не другим методом. И вот почему вы не можете использовать, lsusb
чтобы получить тот серийный номер, который вас интересует
решение3
Вы можете использовать lsusb
флаг verbose, но вам нужно убедиться, что вы используете sudo
его, иначе серийный номер будет неверным.
sudo lsusb -v
Если это слишком многословно, то выполните команду lsusb
, чтобы получить идентификатор устройства:
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 012: ID 1ab1:0e11 Rigol Technologies
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Затем запустите lsusb
с -s
флагом, чтобы отобразить только указанное устройство, и выполните grep для поиска серийного номера.
Итак, для серийного номера устройства Rigol:
$ sudo lsusb -s 012 -v|grep -i iserial
iSerial 3 DP8C221100000
Более подробную информацию об lsusb
использовании --help
флага можно найти здесь:
$ lsusb --help
Usage: lsusb [options]...
List USB devices
-v, --verbose
Increase verbosity (show descriptors)
-s [[bus]:][devnum]
Show only devices with specified device and/or
bus numbers (in decimal)
-d vendor:[product]
Show only devices with the specified vendor and
product ID numbers (in hexadecimal)
-D device
Selects which device lsusb will examine
-t, --tree
Dump the physical USB device hierarchy as a tree
-V, --version
Show version of program
-h, --help
Show usage and help