Как узнать, подключен ли /dev/sdX к USB или жесткому диску?

Как узнать, подключен ли /dev/sdX к USB или жесткому диску?

Как узнать, локальный ли это HDD или USB-ключ? Я бы предпочел способ сделать это без прав root./dev/sdX

Хорошо, udevadmочень помогло:

Для локального жесткого диска:

udevadm info --query=all --name=sdb | grep ID_BUS
E: ID_BUS=ata

Для USB-ключа:

udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb

решение1

Есть несколько способов узнать это без прав root, многие из которых сложны/хитры:

С использованием /dev/disk/by-id:

find /dev/disk/by-id/ -lname '*sdX'

Если ответ будет таким /dev/disk/by-id/usb-blah-blah-blah, то это USB-диск. Другие префиксы включают ata, dm, memstick, scsi, и т.д.

Использование /dev/disk/by-pathне имеет существенных отличий:

find /dev/disk/by-path/ -lname '*sdX'

Вы получите что-то вроде /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Это показывает путь устройства, ведущий к диску. В этом случае грубый путь будет PCI → USB → диск. (обратите внимание на -usb-).

Используя udev (я использую Debian. Мой udevadmнаходится в /sbin, которого нет на моем $PATH— ваш может быть в другом месте, на вашем или за его пределами $PATH):

/sbin/udevadm info --query=all --name=sdX | grep ID_BUS

Вы получите тип шины, на которой находится устройство. Удалите | grep ID_BUSдля полного списка информации (вам может потребоваться добавить |less).

Если вы lshwустановили, ответ Гюйгенсаможеттакже работают:

lshw -class disk -class storage | less

И просмотрите вывод для вашего диска. В less, попробуйте /sdX и посмотрите на предыдущие, bus infoстроки — первая просто скажет scsi@…, но та, что несколькими строками раньше, будет более проясняющей. Однако вы действительнодолжензапустите это как суперпользователь, поэтому это может не подойти. (симптомы: на ноутбуке, где я это пробовал, был указан диск SATA, но не USB — при запуске были sudoуказаны оба)

Есть и другие, более или менее прямые, чем эти.

решение2

Вы можете использовать lsblkдля отчета TRAN (тип транспорта устройства):

lsblk -do name,tran

NAME TRAN
sda  sata
sdb  sata
sdd  usb

где -dили --nodepsозначает не печатать подчиненные устройства и -o name,tranили --output name,tranозначает перечислить только имя устройства и тип транспорта устройства. Добавьте rmв список выходных столбцов, чтобы увидеть, какие устройства являются съемными ( 1если true):

lsblk --nodeps --output NAME,TRAN,RM

NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1

или -nудалить заголовки, например, чтобы напечатать только тип транспорта для определенного диска:

lsblk -ndo tran /dev/sdb

sata

Обратите внимание, что современные версии lsblk( 2.27и более новые) поддерживают JSONвывод, поэтому вы также можете сделать что-то вроде:

lsblk -Jdo name,tran | jq -r '.blockdevices[] | select(.tran=="usb") | .name'

для вывода списка только блочных устройств, подключенных к USBшине.

решение3

Я знаю решение, но, к сожалению, оно требует привилегий root. В любом случае, оно все равно может оказаться полезным:

sudo lshw -class disk -class storage

Для каждого устройства будет выведено логическое имя (например, /dev/sda) и информация о шине, которая в случае USB-устройства будет выглядеть примерно так: «usb@1:2».

Пример вывода:

[...]
  *-storage
       description: SATA controller
       physical id: d
       bus info: pci@0000:00:0d.0
       configuration: driver=ahci latency=64
[...]
     *-disk:0
          description: ATA Disk
          physical id: 0
          bus info: scsi@2:0.0.0
          logical name: /dev/sda
[...]
  *-scsi
       physical id: 3
       bus info: usb@1:2
       configuration: driver=usb-storage
     *-disk
          description: SCSI Disk
          physical id: 0.0.0
          bus info: scsi@6:0.0.0
          logical name: /dev/sdc
[...]

решение4

Только что прочитал значение /sys/block/sdX/removable.

Например:

$ cat /sys/block/sda/removable
0
$ cat /sys/block/sdc/removable
1

/dev/sdcUSB-накопитель (это может быть SD-карта или любой другой съемный носитель).

Связанный контент