
Как узнать, локальный ли это 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/sdc
USB-накопитель (это может быть SD-карта или любой другой съемный носитель).