LINUX.ORG.RU

Определить тип накопителя, подключённого по USB (флешка, карта памяти, диск, оптика,...)

 , ,


0

3

Хочу странного: определить концептуальный тип накопителя, подключенного по USB (флешка, карта памяти, внешний жёсткий диск, внешний ssd, оптический привод). Уповал на ROTA в lsblk для разделения внешних жёстких и флешек, но он, подлец, рапортует «1» для всех USB устройств, и т.о. работает только для локальных SATA/PATA приводов. Можно в lsblk задетектить rom через тип устройства, и т.о. определить оптический привод, но неизвестно, насколько надёжно, но пока пусть будет так. Остальные устройства друг от друга ничем вроде бы не отличаются. Идея угадывать (читай: регекспами) по названию девайса мне кажется изначально порочной. Есть какой-нибудь способ это сделать по-человечески (и без привилегий рута)?

UPD: отличать оптику/hdd/ssd можно через специфические записи в выводе udevadm info. С флешками и картами памяти в кард-ридерах сложнее. Кроме того, lsblk помечает внешние usb диски как несъёмные, так что нужно ориентироваться на HOTPLUG.

★★★★★

Последнее исправление: Smacker (всего исправлений: 1)
Ответ на: комментарий от anonymous

Тоже не панацея. udevadm может отрапортовать о кард-ридере как о flash_media_xxx, а может как об обычном диске. Хотя вроде бы отличить внешний привод можно по RPM, SSD по нулевым RPM, а оптику ещё и по ATA_CDROM_xxx

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Irma

Я тут разные кард-ридеры проверил, и встроенные, и внешние. Большинство никак себя не выдают. Вот в рабочем ноуте — да, есть в выдаче udevadm поля вроде

E: MMC_TYPE=SD
E: ID_DRIVE_FLASH_SD=1
E: ID_DRIVE_MEDIA_FLASH_SD=1

А в другом ноуте (нетбуке) — ни гу-гу. Один мелкий кардридер признался, что он SD_DRIVE что-то там. Остальные прикидываются обычным mass storage, и от флешки не отличаются.

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Irma

Так а чем мне это поможет? Найти съёмные устройства я могу и через lsblk. Мне нужно их друг от друга после этого по типам отличать. Кстати, если под removable имеется в виду RM, то оно 0 только у внешних дисков, а у флешек-то как раз 1. А HOTPLUG 1 и у тех, и у других.

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Irma

Это голяк. Я посмотрел по таблице ID, там куча всяких ридеров, и далеко не все из них называются однозначно трактуемыми именами. Про некоторые фиг поймёшь, ридер чего это, а в некоторых именах нет слова «ридер» («flash media device» — это что?).

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Irma

Ну откуда ж я знаю, я его в таблице только видал. У меня такого нет. Впрочем, даже если бы и был, rotation тут не поможет, он у всех твердотельных устройств нулевой должен быть (если, конечно, smartctl по этой части не норовит приврать на манер lsblk).

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Smacker

Про твердотельные он так и пишет solid, а для крутящихся указывает скорость вращения. Для сидиромов, видимо, покажет тоже ее, только у них в пределах 250 оборотов, можно на это ориентироваться.

Irma ★★
()
Ответ на: комментарий от Irma

Да проехали уже с дисками. В udevadm info можно ID_ATA_ROTATION_RATE_RPM посмотреть. У сидиромов её нет, кстати, зато есть ID_CDROM_xxx всякие. А вот флешки от кардридеров нормально не отличить.

Smacker ★★★★★
() автор топика
Последнее исправление: Smacker (всего исправлений: 1)
Ответ на: комментарий от Smacker

У флешек removable должно относиться ко всему устройству, но не к памяти, а у ридеров и к тому, и к другому. И если наркоманы производители не указали правильно то место, в котором removable, тут уж ничего не сделаешь.

Irma ★★
()
Ответ на: комментарий от Irma

А вот и нифига подобного. Это у меня прокатило только со встроенным кардридером (sdc флешка):

NAME        RM HOTPLUG TYPE
sdc          1       1 disk
└─sdc1       1       1 part
mmcblk0      0       1 disk
└─mmcblk0p1  0       1 part

А вот USB кардридеры для SD
NAME   RM HOTPLUG TYPE
sdc     1       1 disk
└─sdc1  1       1 part

И для CF:
NAME   RM HOTPLUG TYPE
sdc     1       1 disk
└─sdc1  1       1 part

Smacker ★★★★★
() автор топика
Последнее исправление: Smacker (всего исправлений: 1)
Ответ на: комментарий от Irma

Флешка в первом сниппете это sdc. mmcblk0 это кардридер. В остальных двух сниппетах внешние usb кардридеры (со вставленными картами, конечно) идут как sdc (да, у меня мало usb портов, пришлось перетыкивать).

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Irma

Да нет же. Это кардридер:

mmcblk0      0       1 disk
└─mmcblk0p1  0       1 part

но и это кардридер:
sdc     1       1 disk
└─sdc1  1       1 part

а вот это флешка:
sdc          1       1 disk
└─sdc1       1       1 part

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

Smacker ★★★★★
() автор топика
Ответ на: комментарий от Smacker

Говорю же, наркоманы все портят, нет четкой информации. Зато можешь почувствовать себя гуманитарием и принять решение на основании интуиции.

Irma ★★
()

Мне кажется всякие дискофлешки сами не знают да их никто обычно и не спрашивает. Ну. может быть черзе параметры smart, но что то я ещё не видел чтобы смарт адекватно работал на юсб.

по названию девайса мне кажется изначально порочной

хз, или так, или эвристикой, прогнав по диску пару-тройку тестов чтения и записи и догадавись по результату.

kirill_rrr ★★★★★
()
Ответ на: комментарий от kirill_rrr

Я иконки к девайсам хочу нормальные подбирать. Поэтому ни от рута что-то делать, ни тем более тесты гонять мне не с руки. Пока что получается, что и правда — для выявления кардридера надо в названии девайса искать «card» или «reader», а если он назван как-то иначе, то смириться.

Smacker ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

Ну udevadm позволяет (насколько могу судить, довольно надёжно) определить внешний жёсткий диск, внешний ssd и оптический привод, а вот уже всякая флеш-память идёт большим трудноразделимым комом. В целом дифференциация иконок на уровне HDD-CD/DVD была всегда, сколько я себя помню (но на этом уровне и голым lsblk можно дифференцировать). Иногда к этому добавлялась флешка. У меня mate ещё умеет опознавать кардридер (который mmcblk0 как раз) и иконку рисует правильную. А вот к USB кард-ридеру уже пририсовывает «внешний жёсткий диск», как и к флешкам, хотя иконка для флешки в целом есть.

Сейчас для интереса нашёл кабель и подключил видео-камеру. Зацепиться в udevadm не за что, обычный mass-storage, ну и иконка «внешний диск». А вот смартфон опознался — и иконка «телефон» появилась. Но там через gvfs монтирование, и девайса отдельного в системе не появляется.

Smacker ★★★★★
() автор топика
Последнее исправление: Smacker (всего исправлений: 2)
Ответ на: комментарий от HE_KOT

Если имееся в виду rpi-imager, то он почти ничего не умеет определять, там угадалка основана на свойстве isUSB и isSCSI:

Image {
       source: isUsb ? "icons/ic_usb_40px.svg" : isScsi ? "icons/ic_storage_40px.svg" : "icons/ic_sd_storage_40px.svg"
       verticalAlignment: Image.AlignVCenter
       height: parent.parent.parent.height
       fillMode: Image.Pad
}

Smacker ★★★★★
() автор топика
Последнее исправление: Smacker (всего исправлений: 1)
Ответ на: комментарий от PPP328

Так а что именно-то показывал? Я вот имею на руках целый органайзер флешек, два внешних кардридера (ещё есть парочка в коробках на полке, но лень доставать), два встроенных кардридера (есть и в других ноутах, но тоже лень), внешний жёсткий диск (один, остальные, думаю работать будут так же), внешний SSD, внешний DVD-RW. И могу смело сказать, что результаты не носят постоянного характера по всем фронтам. Я не могу сказать, что девайсы всегда не детектятся правильно — нет, почему же, запросто можно получить корректный результат — но могу легко привести контр-примеры.

Smacker ★★★★★
() автор топика