Wie erkenne ich, ob es sich bei /dev/sdX um ein angeschlossenes USB-Gerät oder eine Festplatte handelt?

Wie erkenne ich, ob es sich bei /dev/sdX um ein angeschlossenes USB-Gerät oder eine Festplatte handelt?

Wie kann ich feststellen, ob es sich um eine lokale Festplatte oder einen USB-Stick handelt? Ich bevorzuge eine Möglichkeit, dies ohne Root-Rechte zu tun./dev/sdX

Ok, udevadmhat sehr geholfen:

Für lokale Festplatte:

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

Für USB-Stick:

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

Antwort1

Es gibt einige Möglichkeiten, dies ohne Root-Rechte herauszufinden, viele davon sind schwierig bzw. kompliziert:

Verwendung von /dev/disk/by-id:

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

Wenn die Antwort etwas wie ist /dev/disk/by-id/usb-blah-blah-blah, handelt es sich um eine USB-Festplatte. Andere Präfixe sind ata, dm, memstick, scsi, usw.

Die Verwendung /dev/disk/by-pathunterscheidet sich nicht wesentlich:

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

Sie erhalten etwas wie /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Dies zeigt den Gerätepfad, der zur Festplatte führt. In diesem Fall ist ein ungefährer Pfad PCI → USB → Festplatte. (Beachten Sie das -usb-).

Verwenden von udev (ich verwende Debian. Meins udevadmbefindet sich in /sbin, das sich nicht auf meinem befindet $PATH– Ihrs kann sich woanders befinden, auf oder außerhalb Ihres $PATH):

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

Sie erhalten den Bustyp, an dem sich das Gerät befindet. Entfernen Sie das , | grep ID_BUSum die vollständige Liste der Informationen anzuzeigen (möglicherweise müssen Sie hinzufügen |less).

Wenn Sie lshwinstalliert haben, Huygens' AntwortMaiauch Arbeit:

lshw -class disk -class storage | less

Und schauen Sie sich die Ausgabe für Ihre Festplatte an. lessVersuchen Sie in /sdX und schauen Sie sich die vorhergehenden bus infoZeilen an – in der ersten steht nur scsi@…, aber die Zeile mehrere Zeilen davor wird aufschlussreicher sein. SiesollenFühren Sie dies als Superuser aus, daher ist es möglicherweise nicht geeignet. (Symptome: Auf dem Laptop, auf dem ich es probiert habe, wurde die SATA-Festplatte aufgelistet, aber nicht die USB-Festplatte – beim Ausführen wurden sudobeide aufgelistet.)

Es gibt noch weitere, mehr oder weniger direkte als diese.

Antwort2

Sie können lsblkzur Meldung TRAN (Gerätetransporttyp) Folgendes verwenden:

lsblk -do name,tran

NAME TRAN
sda  sata
sdb  sata
sdd  usb

wobei „ -dor“ --nodepsbedeutet, dass keine Slaves gedruckt werden, und „ -o name,tranor“ --output name,tranbedeutet, dass nur der Gerätename und der Gerätetransporttyp aufgelistet werden. Fügen Sie rmder Liste der Ausgabespalten hinzu, um zu sehen, welche Geräte entfernbar sind ( 1wenn true):

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

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

oder -num Kopfzeilen zu entfernen, um zB nur den Transporttyp für ein bestimmtes Laufwerk auszudrucken:

lsblk -ndo tran /dev/sdb

sata

Beachten Sie, dass moderne Versionen von lsblk( 2.27und neuer) JSONdie Ausgabe unterstützen, sodass Sie auch Folgendes tun können:

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

um nur Blockgeräte aufzulisten, die mit dem USBBus verbunden sind.

Antwort3

Ich kenne eine Lösung, aber leider erfordert sie Root-Rechte. Trotzdem könnte sie für Sie nützlich sein:

sudo lshw -class disk -class storage

Für jedes Gerät werden der logische Name (z. B. /dev/sda) und die Businformationen ausgedruckt, die im Fall eines USB-Geräts etwa „usb@1:2“ lauten würden.

Beispielausgabe:

[...]
  *-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
[...]

Antwort4

Lesen Sie einfach den Wert von /sys/block/sdX/removable.

Zum Beispiel:

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

/dev/sdcist ein USB-Stick (es könnte auch eine SD-Karte oder ein anderer Wechseldatenträger sein).

verwandte Informationen