Como determinar qual sd * é usb? [duplicado]

26

A saída de ls /dev/sd* no meu sistema é -

sda  sda1  sda2  sda3  sda4  sda5  sda6  sda7  sdb  sdc  sdc1  sdc2

Como devo determinar qual unidade é qual?

    
por Kshitiz Sharma 04.01.2013 / 16:28

8 respostas

23

Supondo que você esteja no Linux.

Tente:

sudo /lib/udev/scsi_id --page=0x80 --whitelisted --device=/dev/sdc

ou:

cat /sys/block/sdc/device/{vendor,model}

Você também pode obter informações (incluindo rótulos) dos sistemas de arquivos nas diferentes partições com

sudo blkid /dev/sdc1

O pathid ajudará a determinar o tipo de dispositivo:

readlink -f /sys/class/block/sdc/device

Veja também:

find /dev/disk -ls | grep /sdc

Com um udev funcionando corretamente, você obterá todas as informações dos outros comandos acima.

O conteúdo de /proc/partitions fornecerá informações sobre o tamanho (embora não em formato amigável como lsblk já mencionado por @Max).

sudo blockdev --getsize64 /dev/sdc

Irá dar-lhe o tamanho em bytes do dispositivo de bloco correspondente.

sudo smartctl -i /dev/sdc

(multi-plataforma), também lhe dará muitas informações, incluindo marca, modelo, tamanho, números de série, revisões de firmware ...

    
por 04.01.2013 / 16:53
10

Amostra bash finalizada

Existe uma pequena parte de um script que escrevi para criar e instalar chave usb ao vivo , (dual boot ubuntu - debian):

A primeira parte USBKEYS=... é a resposta para essa pergunta

Em suma, isso:

list removable devices, driven by sd and having non zero size.

Nota Este script usa dialog , que parece não estar instalado por padrão no Ubuntu. Mas dialog pode ser substituído por gdialog , whiptail ou 'zenity or even easybashbui'.

#!/bin/bash

export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))

export STICK
case ${#USBKEYS[@]} in
    0 ) echo No USB Stick found; exit 0 ;;
    1 ) STICK=$USBKEYS ;;
    * )
    STICK=$(
    bash -c "$(
        echo -n  dialog --menu \
            \"Choose wich USB stick have to be installed\" 22 76 17;
        for dev in ${USBKEYS[@]} ;do
            echo -n \ $dev \"$(
                sed -e s/\ *$//g </sys/block/$dev/device/model
                )\" ;
            done
        )" 2>&1 >/dev/tty
    )
    ;;
esac

[ "$STICK" ] || exit 0

echo $STICK...

Amostra (acabei de conectar 3 pen drives USB - além dos meus 3 discos rígidos):

Substituindodialogporgdialog(nalinha24),dê:

Mas a sintaxe pode ser usada com outro utilitário diálogo , como whiptail ...

Parte essencial

export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
    echo $dev \"$(
        sed -e s/\ *$//g </sys/block/$dev/device/model
        )\" ;
  done

sdd "Storage Media"
sde "Freecom Databar"
sdf "silicon-power"

Explicação detalhada

Isso usa alguns bashisms :

export USBKEYS=($(                         # Declaration of *array* 'USBKEYS'
    grep -Hv ^0$ /sys/block/*/removable |  # search for *not 0* in 'removable' flag of all devices
    sed s/removable:.*$/device\/uevent/ | # replace 'removable' by 'device/uevent' on each line of previous answer
    xargs grep -H ^DRIVER=sd |             # search for devices drived by 'SD'
    sed s/device.uevent.*$/size/ |         # replace 'device/uevent' by 'size'
    xargs grep -Hv ^0$ |                   # search for devices having NOT 0 size
    cut -d / -f 4                          # return only 4th part '/' separated
))
for dev in ${USBKEYS[@]} ;do               # for each devices in USBKEY...
    echo $dev \"$(r                        # echo device name and content of model file
        sed -e s/\ *$//g </sys/block/$dev/device/model
        )\" ;
  done

Depois de inserir três pen drives na minha mesa:

grep -H . /sys/block/*/removable
/sys/block/loop0/removable:0
/sys/block/loop1/removable:0
...
/sys/block/sdc/removable:0
/sys/block/sdd/removable:1
/sys/block/sde/removable:1
/sys/block/sdf/removable:1
/sys/block/sr0/removable:1

(Sim, minha mesa possui 3 discos rígidos físicos: sda , sdb e sdc . Primeiro, removíveis se tornam sdd e sde ).

Então:

grep -Hv ^0$ /sys/block/*/removable
/sys/block/sdd/removable:1
/sys/block/sde/removable:1
/sys/block/sdf/removable:1
/sys/block/sr0/removable:1

Eu tenho a lista de dispositivos removíveis ,

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\/uevent/
/sys/block/sdd/device/uevent
/sys/block/sde/device/uevent
/sys/block/sdf/device/uevent
/sys/block/sr0/device/uevent

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\/uevent/ |
    xargs grep -H ^DRIVER=sd
/sys/block/sdd/device/uevent:DRIVER=sd
/sys/block/sde/device/uevent:DRIVER=sd
/sys/block/sdf/device/uevent:DRIVER=sd

Eu tenho a lista de dispositivos removíveis que são acionados pelo driver sd (ou seja, não sr , nem floppy )

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/
/sys/block/sdd/size
/sys/block/sde/size
/sys/block/sdf/size

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$
/sys/block/sdd/size:15224832
/sys/block/sde/size:7834944
/sys/block/sdf/size:7831552

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
sdd
sde
sdf

Além disso:

export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))
set | grep ^USBKEYS=
USBKEYS=([0]="sdd" [1]="sde" [2]="sdf")

E finalmente:

cat /sys/block/$USBKEYS/device/model
Storage Media   

cat /sys/block/${USBKEYS[2]}/device/model
silicon-power   

mas

printf "|%s|\n" "$(</sys/block/$USBKEYS/device/model)"
|Storage Media   |

É porque eu escrevi:

echo ${USBKEYS[2]} \"$(sed -e s/\ *$//g </sys/block/${USBKEYS[2]}/device/model)\"
sde "silicon-power"

Encolhido - jogado no golfe:

Existe uma versão abreviada

US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
    sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:))))

(Nota: <(:) do pseudo arquivo vazio por garfo para : isto é menor que /dev/null mas não é realmente equivalente)

Duas linhas e uma variável UsbSticks mantendo:

set | grep ^US=
US=([0]="sde" [1]="sdf" [2]="sdg")

Então, o script (começo do meu) pode se tornar:

#/bin/bash

US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
    sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:))))
case ${#US[@]} in 0)echo "No USB stick found.";exit 0;;1)S=$US;;*)S=$(sh -c "$(
    sed -nre 's@/sys/block/(.*)/device/model:(.*)$@ ""@;H;${x;s/\n/ /g;
      s/^/whiptail --menu "Choose an USB stick" 22 76 14/;p}' <(grep -H . $(
     printf /sys/block/%s/device/model\n ${US[@]})))" 2>&1 >/dev/tty) ;; esac
whiptail --defaultno --yesno "Could I destroy content of $S!?" 10 70 6 || exit 0
    
por 05.01.2013 / 00:15
9

Na versão recente do Linux, existem /dev/disk/by-{id,label,path,uuid} diretórios que contêm links simbólicos automáticos para as várias entradas / dev / sdX e / dev / sdXN (acredito que todas elas sejam configuradas pelo udev). Estes fornecem nomes mais estáveis e informativos para seus discos e partições. Eu acho /dev/disk/by-label/ o mais útil (especialmente se você rotular suas partições do sistema de arquivos), mas by-path pode ser mais útil para o seu caso de uso.

    
por 04.01.2013 / 22:00
7

udev conhece seu sistema. assim você pode obter informações através de udevadm , sob /sys/ como este (executado como root, ou com sudo dependendo da sua distribuição)

udevadm info -a -p /sys/block/sdb

udevadm info -a -p /sys/block/sdc

lendo a saída, você encontrará alguns resultados significativos, como

ATTRS{vendor}
ATTRS{model}

você deve ser capaz de obter algumas informações sobre qual é o usb. adicionalmente a variável

SUBSYSTEM=="usb"

deve dar uma boa dica de que estamos falando de um usb.

leia a variável KERNEL para entender qual dispositivo sd * é o usb.

Outros comandos que podem ajudar, são lshw , que lista todo o seu hardware por conexão, lsusb , que lista dispositivos usb, mas não mostra a letra sd * que foi fornecida. Além disso, dmesg fornecerá todas as informações necessárias se você as digitar logo após conectar o usb ao seu computador.

Estes são todos os comandos da CLI, se você preferir algo mais GUI, como qualquer outro rapaz será capaz de ajudá-lo mais nessa direção.

    
por 04.01.2013 / 17:02
3

Você também pode usar o comando lsscsi , que imprime várias informações sobre dispositivos SCSI conectados (obtidos de / proc e / sys). Você está interessado nas informações de transporte, por isso lsscsi -t | grep usb informará qual dispositivo está usando o transporte USB.

    
por 04.01.2013 / 17:01
2

É muito provável que sua unidade do sistema tenha sda , dado o grande número de partições. Para ter certeza disso, você poderia usar a saída de mount , df -h ou lsblk e procurar onde / está localizado. Evite essa unidade.

Além disso, sdb e sdc são candidatos válidos. Montá-los e olhar para o conteúdo é a maneira mais segura. O que poderia ser mais rápido é tão simples quanto puxar o bastão e ver qual deles desaparece (ou comparar com a saída de dmesg após reinseri-lo (ele deve lhe dizer qual /dev/ nome tem)

    
por 04.01.2013 / 16:43
1

Meu favorito, supondo que a unidade não seja necessária para manter o sistema funcionando, é comparar a listagem de diretórios com e sem a unidade USB no sistema.

    
por 04.01.2013 / 22:12
1

Uma maneira simples é procurar em / dev / disk / by-id / - ele contém um farm de links simbólicos apontando para todos os nós de dispositivo de unidade e partição reais no sistema. Os nomes dos links simbólicos identificam o tipo de interface da unidade, marca & modelo e número de série, e pode ser usado como um identificador exclusivo persistente para cada unidade.

Por exemplo

$ ls -lF /dev/disk/by-id/usb-Generic_Flash_Disk*
lrwxrwxrwx 1 root root  9 Jan  5 11:10 /dev/disk/by-id/usb-Generic_Flash_Disk_CAAE91F7-0:0 -> ../../sdo
lrwxrwxrwx 1 root root 10 Jan  5 11:10 /dev/disk/by-id/usb-Generic_Flash_Disk_CAAE91F7-0:0-part1 -> ../../sdo1

isso parece muito melhor em um terminal de coluna larga, é claro:)

Eu acho o seguinte apelido útil para obter uma listagem rápida de todos os discos (mas não partições) no sistema:

alias list_disks='ls -lF /dev/disk/by-id/{scsi,usb}-* | grep sd.$'

Eu teria incluído a saída de exemplo do meu servidor de arquivos zfsonlinux para minha casa, mas parece muito feio aqui, a largura do campo de texto não é nem de perto o suficiente.

    
por 05.01.2013 / 01:31