
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, udevadm
hat 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-path
unterscheidet 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 udevadm
befindet 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_BUS
um die vollständige Liste der Informationen anzuzeigen (möglicherweise müssen Sie hinzufügen |less
).
Wenn Sie lshw
installiert haben, Huygens' AntwortMaiauch Arbeit:
lshw -class disk -class storage | less
Und schauen Sie sich die Ausgabe für Ihre Festplatte an. less
Versuchen Sie in /sdX und schauen Sie sich die vorhergehenden bus info
Zeilen 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 sudo
beide aufgelistet.)
Es gibt noch weitere, mehr oder weniger direkte als diese.
Antwort2
Sie können lsblk
zur Meldung TRAN
(Gerätetransporttyp) Folgendes verwenden:
lsblk -do name,tran
NAME TRAN
sda sata
sdb sata
sdd usb
wobei „ -d
or“ --nodeps
bedeutet, dass keine Slaves gedruckt werden, und „ -o name,tran
or“ --output name,tran
bedeutet, dass nur der Gerätename und der Gerätetransporttyp aufgelistet werden. Fügen Sie rm
der Liste der Ausgabespalten hinzu, um zu sehen, welche Geräte entfernbar sind ( 1
wenn true
):
lsblk --nodeps --output NAME,TRAN,RM
NAME TRAN RM
sda sata 0
sdb sata 0
sdd usb 1
oder -n
um 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.27
und neuer) JSON
die 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 USB
Bus 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/sdc
ist ein USB-Stick (es könnte auch eine SD-Karte oder ein anderer Wechseldatenträger sein).