Obtém o nome do dispositivo do disco USB conectado

8

Eu preciso obter os nomes dos dispositivos de todos os discos USB conectados (por exemplo, sdd ).

Eu tenho 3 discos USB conectados e 2 discos SATA:

$ find /sys/devices/ -name block        
/sys/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host5/target5:0:0/5:0:0:0/block
/sys/devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host6/target6:0:0/6:0:0:0/block
/sys/devices/pci0000:00/0000:00:14.0/usb4/4-5/4-5:1.0/host4/target4:0:0/4:0:0:0/block
/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block
/sys/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block

Eu quero ignorar os discos SATA, mas preciso listar todos os discos USB.

No terminal, eu posso usar ls e ele me dará sdd :

$ ls /sys/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host5/target5:0:0/5:0:0:0/block
sdd

Mas eu preciso usar isso em um script. Eu preciso fazer uma iteração sobre todos os discos USB e não sei o caminho exato com antecedência, então eu tenho que usar curingas ( * ou ? ):

for DISK in $(ls /sys/devices/pci0000:00/0000:00:14.0/usb?/*/*:1.0/host?/target?:0:0/?:0:0:0/block) ; do
echo /dev/$DISK
done

o acima só funciona se um disco USB estiver conectado. Se dois ou mais discos forem plugend, receberei sdd e também o /sys caminho, o que não quero, ou seja:

/dev//sys/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host5/target5:0:0/5:0:0:0/block:
/dev/sdd
/dev//sys/devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host6/target6:0:0/6:0:0:0/block:
/dev/sde
/dev//sys/devices/pci0000:00/0000:00:14.0/usb4/4-5/4-5:1.0/host4/target4:0:0/4:0:0:0/block:
/dev/sdc

como posso iterar apenas mais de sdd sde sdc ?

Estou procurando uma solução que não use udev infrastructure, ou seja, /dev/disk/by-path/

    
por Martin Vegter 29.05.2017 / 13:16

2 respostas

8

Você pode fazer isso com o comando lsblk .

lsblk -l -o name,tran

NAME TRAN
sda  sata
sda1 
sdb  usb
sdc  usb
sr0  sata

-l significa formato de "lista", por isso é mais fácil analisar. Caso contrário, você obteria um formato de árvore assim:

NAME   TRAN
sda    sata
└─sda1
sdb    usb
sr0    sata

A especificação de outros sinalizadores fornecerá mais informações, como FSTYPE, LABEL, UUID, MOUNTPOINT e muitas outras, apenas execute lsblk --help para ver todas as opções.

Você pode querer usar --paths --noheadings --scsi flags para ter uma saída impressa assim:

sata   /dev/sda
usb    /dev/sdb
usb    /dev/sdc
sata   /dev/sr0

e, em seguida, grep sobre a entrada para filtrar essas linhas com usb no início da linha.

    
por 29.05.2017 / 14:24
5

Faça lsusb , ele fornece o nome dos dispositivos conectados via barramento USB.

Como em:

$ lsusb
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0421:0802 Nokia Mobile Phones CA-42 Phone Parent
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Veja também man lsusb

Description

lsusb is a utility for displaying information about USB buses in the system and the devices connected to them.

    
por 29.05.2017 / 13:27