Woher wissen Sie, ob / dev / sdX ein angeschlossener USB-Stick oder eine angeschlossene Festplatte ist?

23

Woher weiß ich, ob es sich um eine lokale Festplatte oder einen lokalen USB-Stick handelt? Ich würde es vorziehen, dies ohne Root-Rechte zu tun./dev/sdX

OK, hat udevadmmir 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
Gänseblümchen
quelle

Antworten:

15

Es gibt ein paar Möglichkeiten, ohne Root-Rechte zu entscheiden, viele davon knifflig:

Verwenden von /dev/disk/by-id:

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

Wenn dies mit so etwas wie reagiert /dev/disk/by-id/usb-blah-blah-blah, dann ist es ein USB-Laufwerk. Andere Präfixe enthalten ata, dm, memstick, scsietc.

Die Verwendung unterscheidet /dev/disk/by-pathsich nicht wesentlich:

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

Sie werden so etwas bekommen /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 grober Pfad PCI → USB → Festplatte. (Beachten Sie die -usb-).

Verwenden von udev (Ich starte Debian. Mein udevadmist, in /sbindem nicht auf meinem steht $PATH- Ihr könnte anderswo sein, auf oder neben Ihrem $PATH):

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

Sie erhalten den Bustyp, auf dem sich das Gerät befindet. Entfernen Sie die | grep ID_BUSfür die vollständige Auflistung der Informationen (müssen Sie möglicherweise hinzufügen |less).

Wenn Sie lshwinstalliert haben, funktioniert möglicherweise auch Huygens 'Antwort :

lshw -class disk -class storage | less

Suchen Sie in der Ausgabe nach Ihrer Festplatte. In lessVersuchen /sdX und Blick auf die vorhergehenden, bus infoLinien - die erste wird nur sagen scsi@…, aber die man mehrere Linien , bevor es wird mehr erhellend. Sie sollten dies jedoch unbedingt als Superuser ausführen, damit es möglicherweise nicht geeignet ist. (Symptome: Auf dem Laptop, den ich ausprobiert habe, ist die SATA-Festplatte aufgeführt, aber nicht die USB-Festplatte - läuft mit sudobeiden)

Es gibt auch andere, mehr oder weniger direkte als diese.

Alexios
quelle
Gibt es Möglichkeiten, ein internes SATA-Laufwerk von einem externen SATA-Laufwerk zu unterscheiden, über das eine Verbindung besteht esatap?
CMCDragonkai
10

Ich kenne eine Lösung, aber leider erfordert sie Root-Rechte. Vielleicht finden Sie es trotzdem nützlich:

sudo lshw -class disk -class storage

Für jedes Gerät werden der logische Name (z. B. /dev/sda) und die Businformationen gedruckt , die im Falle eines USB-Geräts etwa "usb @ 1: 2" lauten.

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
[...]
Huygens
quelle
8

Sie könnten verwenden lsblk:

lsblk-do name, tran
NAME TRAN
sda  sata
sdb  sata
sdd  usb

wobei -doder --nodepsbedeutet, dass keine Slaves gedruckt werden, und -o name,tranoder --output name,tranbedeutet, dass nur der Name des Geräts und der Transporttyp des Geräts aufgeführt werden. Fügen Sie rmder Liste der Ausgabespalten hinzu, um zu sehen, welche Geräte entfernbar sind ( 1falls true):

lsblk --nodeps --output NAME, TRAN, RM
NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1
don_crissti
quelle
Ich suchte dies in den Antworten
Eduard Florinescu
4

Hierfür sind keine Root-Rechte erforderlich (viele dieser Befehle verwenden jedoch Bashismen und sind von diesen abhängig, sodass sie nicht in allen POSIX-kompatiblen Shells funktionieren):

Es gibt eine schnelle Möglichkeit, nach einem der folgenden Punkte zu fragen :sdX

grep -H . /sys/block/sda/{capability,uevent,removable,device/{model,type,vendor,uevent}}
/sys/block/sda/capability:52
/sys/block/sda/uevent:MAJOR=8
/sys/block/sda/uevent:MINOR=0
/sys/block/sda/uevent:DEVNAME=sda
/sys/block/sda/uevent:DEVTYPE=disk
/sys/block/sda/removable:0
/sys/block/sda/device/model:WDC WD360GD-00FN
/sys/block/sda/device/type:0
/sys/block/sda/device/vendor:ATA     
/sys/block/sda/device/uevent:DEVTYPE=scsi_device
/sys/block/sda/device/uevent:DRIVER=sd
/sys/block/sda/device/uevent:MODALIAS=scsi:t-0x00

Die wirklich interessante Datei ist capability. Auf meinem Debian habe ich eine genhd.hDatei, also:

eval $(sed -ne '
   s/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p
  ' /usr/src/linux-headers-2.6.32-5-common-openvz/include/linux/genhd.h)
diskCapa=$(</sys/block/sda/capability)
for i in ${!GENHD_FLAGS[@]};do
    (( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
  done
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO

diskCapa=$(</sys/block/sdd/capability)
    for i in ${!GENHD_FLAGS[@]};do
    (( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
  done
REMOVABLE
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO

Nur um zu wissen, ob das Flag removablegesetzt ist:

grep REMOVABL /usr/src/linux-headers-3.2.0-4-common/include/linux/genhd.h 
#define GENHD_FL_REMOVABLE                      1

so

for disk in sd{a,b,c,d,e,f,g,h} ; do
 (( $(< /sys/block/$disk/capability ) & 1 ))  &&  echo $disk is removable
done

Testet, ob für den capabilityWert (in meinem sdaobigen Beispiel 52 ) das 1Bit gesetzt ist (dh ob es sich um eine ungerade Zahl handelt).

Aber Linux rendert alle Flags in /sys, also /sys/block/sdX/removableist es viel einfacher , danach zu fragen ! ;-)

So ein USB - Schlüssel sein könnte removable, aber da es viele ist abnehmbarer Geräte, würde ich sicherstellen mag , dass die Größe des Mediums größer als 0 ist (wie ein unbelastetes CD-ROM-Laufwerk, für Probe) und dass das Gerät ist nicht in Verwendung: Beim Anschauen sdX/trace/enableist das nicht gebunden:

Hinweis: All dies ist auf bash v4.2 + gut getestet.

Unter können Sie diese sehr schnelle und effiziente Methode verwenden:

for disk in /sys/block/* ; do
    [ -f "$disk/removable" ]    && [ $(<"$disk/removable") -gt 0 ]   &&
    [ -f "$disk/size" ]         && [ $(<"$disk/size") -gt 0 ]        &&
    [ -f "$disk/trace/enable" ] && [ -z "$(<"$disk/trace/enable")" ] &&
    echo "${disk##*/} $(($(<"$disk/size")/1953125))G $(<"$disk/device/model")"
  done

Auf meinem System gibt es 4 USB-Sticks, von denen einer ( sde) bereits gemountet ist, sodass der vorherige Befehl Folgendes ausgibt:

sdd 8G Trans-It Drive
sdf 7G Storage Media
sdg 4G silicon-power

Mein Drehbuch:

Es gibt eine kleine Funktion, die ich geschrieben habe, um das aktualisierte Debian Live zu installieren.

#!/bin/bash

txtsize() {
    local _c=$1 _i=0 _a=(b K M G T P)
    while [ ${#_c} -gt 3 ] ; do
        ((_i++))
        _c=$((_c>>10))
      done
    _c=000$(( ( $1*1000 ) >> ( 10*_i ) ))
    ((_i+=${3:-0}))
    printf -v ${2:-REPLY} "%.2f%s" ${_c:0:${#_c}-3}.${_c:${#_c}-3} ${_a[_i]}
}

# Der erste Teil gibt nur die für Menschen lesbare Größe wieder. Die Funktion beginnt dort.

chooseFreeUsbKey() {
    local _lUdisk _lUsize _lUdialog=dialog # whiptail # gdialog
    local -A _lUdevices
    unset ${1:-REPLY}
    for _lUdisk in /sys/block/*; do
        [ -f $_lUdisk/removable ] && [ $(<$_lUdisk/removable) -gt 0 ] &&
        [ -f $_lUdisk/size ] && [ $(<$_lUdisk/size) -gt 0 ] &&
        txtsize $(<$_lUdisk/size)*512 _lUsize &&
        [ -f $_lUdisk/trace/enable ] && [ -z "$(<$_lUdisk/trace/enable)" ] &&
        _lUdevices[${_lUdisk##*/}]="$_lUsize $(<$_lUdisk/device/model)"
    done
    case ${#_lUdevices[@]} in
        0 ) ;; # echo Sorry no key found. ;;
        1 ) IFS read -a ${1:-REPLY} \
            <<< "${!_lUdevices[@]}§${_lUdevices[@]%% *}§${_lUdevices[@]#* }";;
        * ) declare -a menu
           for _lUdisk in ${!_lUdevices[@]}; do
               menu+=($_lUdisk "${_lUdevices[$_lUdisk]}")
           done
           _lUdisk=$($_lUdialog --menu "Choose a USB stick" \
               $((LINES-3)) $((COLUMNS-3)) $((LINES-8)) \
               "${menu[@]}" 2>&1 >/dev/tty)
           IFS read -a ${1:-REPLY} \
           <<< "$_lUdisk§${_lUdevices[$_lUdisk]%% *}§${_lUdevices[$_lUdisk]#* }"
    esac
}

Dies weist die Antwort als Array der Variablen zu, die als erstes Argument angegeben wurde, oder der Variablen $REPLY:

chooseFreeUsbKey stick

echo "$stick"
sdf

echo "${stick[1]}"
7.26G

echo "${stick[2]}"
Storage Media

(Das letzte Feld kann Leerzeichen enthalten.)

F. Hauri
quelle
Vielen Dank an @StephaneChazelas, der den ersten Teil meiner Antwort lesbarer gemacht hat.
F. Hauri
1
(1) Warum hast du geschachtelte geschweifte Klammern? Meinst du …,device/{model,type,vendor,uevent}? (2) Können Sie bitte Ihre GENHD-Befehle und Ihre "trace / enable" -Befehle erläutern? (3) Ihr [ $(( $(< $file ) & 1 )) -ne 0 ]Test kann vereinfacht (verkürzt) werden (( $(< $file ) & 1 )).
G-Man sagt, dass Monica
@ G-Man (1) Ja, +1 dafür! Ich verstehe nicht, wie dieses Tipo eingeführt wurde. (2) Die Header- Datei der generischen Festplatte muss in vorhanden sein /usr/src/*/include/linux. Versuchen Sie es sed -ne 's/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p;' /usr/src/*/include/linux/genhd.h. (3) Ja
F. Hauri
0

Ich schlage vor, nur hdparmoder lshw(was Sie möglicherweise installieren müssen) zu verwenden und sudoes als root auszuführen.

sudo hdparm -I /dev/sda
sudo lshw -short -C disk
sudo lshw -class disk -class storage

sollten Ihnen alle Informationen geben.

EightBitTony
quelle
hdparm auf einer virtuellen Festplatte:hdparm -i /dev/sda /dev/sda: HDIO_DRIVE_CMD(identify) failed: Invalid exchange HDIO_GET_IDENTITY failed: Invalid argument
Tim
Nun, ich sagte sollte und es funktioniert hier mit virtuellen Festplatten.
EightBitTony
0

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

Beispielsweise:

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

/dev/sdc ist ein USB-Stick (es kann sich um eine SD-Karte oder ein anderes Wechselmedium handeln).

Jérôme Pouiller
quelle
Dies dupliziert Informationen in der Antwort von F. Hauri und fügt keinen neuen Inhalt hinzu. Bitte posten Sie keine Antwort, es sei denn, Sie können neue Aspekte hinzufügen, die in vorhandenen Antworten nicht gefunden wurden.
G-Man sagt, dass Monica
0

dmesg ist die einfachste Methode:

dmesg | grep sd X

( Ist der Name Ihres Geräts, z. B. )sdXsda

Aus dem obigen Befehl sehen Sie Folgendes:

  • Angeschlossene SCSI-Festplatte
  • Angeschlossenes SCSI-Wechselmedium (Wechselmedium, z. B. USB-Flash-Laufwerk)
jncc99
quelle
dmesgLiest den zirkulären Nachrichtenpuffer des Kernels, so dass diese Lösung erst vor relativ kurzer Zeit nach einem Neustart
funktioniert
0

Mit den folgenden Befehlen können Sie SD-, USB- und SATA-Geräteknoten abrufen.

usb_device="/dev/`ls -lR /dev/disk/by-id/  | grep ^l | grep 'usb' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"

sata_device="/dev/`ls -lR /dev/disk/by-id/ | grep ^l | grep 'ata' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"

sd_device="/dev/`ls -lR /dev/disk/by-id/   | grep ^l | grep 'mmc' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"
Lovek
quelle
1
(1) Es ist mir nicht klar, wie dies die Frage beantwortet, nämlich " /dev/sdXWie kann ich im Einzelfall feststellen, ob es sich um eine lokale Festplatte oder einen USB-Stick handelt?". Bitte erläutern Sie, wie das OP Ihre Befehle dazu verwenden kann Entschlossenheit. (2) Wir bevorzugen Antworten, die Befehle geben, und erklären sie gegenüber Antworten, die nur Befehle geben. Bitte erklären Sie, was Sie tun. Bitte antworten Sie nicht in Kommentaren; Bearbeiten Sie Ihre Antwort, um sie klarer und vollständiger zu gestalten. … (Fortsetzung)
G-Man sagt, dass Monica
(Fortsetzung)… (3)  awkist ein sehr mächtiges Werkzeug. Viele Anfänger posten Antworten, die a tun grepund leiten ihre Ausgabe an awk. Dies ist selten notwendig; awkkann Pattern Matching machen und kann die gewünschte Eingabe ohne Hilfe von auswählen grep. Sie haben eine Pipeline von zwei grepBefehlen, die in awkund dann in einen zweiten awk Befehl weitergeleitet werden. Dies kann stark vereinfacht werden; bitte versuche. (4) Auch für Klarheit, könnten Sie ändern möchten , `…`um $(…)- sehen dies , dies und dies .
G-Man sagt, dass Monica
0

Ich bin faul, inxi sagt mir das leicht:

inxi -D
Drives:    HDD Total Size: 1220.3GB (33.2% used)
           ID-1: /dev/sda model: ST380817AS size: 80.0GB
           ID-2: /dev/sdb model: WDC_WD1003FZEX size: 1000.2GB
           ID-3: USB /dev/sdc model: USB_Flash_Drive size: 140.0GB

Ich glaube, es sagt mir auch, ob es sich um Firewire und vielleicht um einen anderen Typ handelt, aber ich müsste noch einmal überprüfen, ob ich diese Typen eine Weile nicht mehr verwendet habe.

Es sagt mir auch mit -p, ob Partitionen remote sind, wie Samba oder NFS-Mounts.

Lizardx
quelle
-1

Führen Sie nach dem Anschließen des USB-Geräts dmesgein Konsolenfenster aus. Sie erhalten einige Hinweise.

Zum Beispiel sagt es etwas in der Art von "Gerät angeschlossen, Massenspeicher / dev / sdd".

Tim
quelle
2
Bitte geben Sie weitere Informationen / Erläuterungen an, damit Ihre Antwort nützlich ist.
George M
2
Wie wäre es, wenn Sie bei der Beantwortung einer Frage nicht beleidigend wären?
Shadur