Como faço para descobrir qual / dev é uma unidade flash USB?

160

Quero montar uma unidade USB, duas delas e preciso de dois pontos de montagem diferentes. Infelizmente, o kernel do Linux passou por uma mudança de nome e não consigo descobrir qual /devlocal é o correto. Existe uma maneira de procurar por dmesgou em /procalgum outro lugar para descobrir qual nó do dispositivo é uma unidade USB.

(Estou usando o ArchLinux, se isso ajudar alguém ... /dev/sdaé o primeiro disco rígido, /dev/sr0é uma unidade de DVD, etc.)

editar: a unidade USB está conectada a um hub USB. Eu olhei através dmesge diz que o hub estava conectado e procurou os 3 dispositivos conectados a ele. Ainda não consigo ver onde está minha unidade USB.

Rudolf Olah
fonte
1
Não consegue ver? Talvez espere um pouco. Ou tente outra porta USB. Veja o que diferenças há em 'lsusb'
Nick Devereaux
Talvez queira reformular a pergunta de alguma forma - nem todos os dispositivos USB são discos, afinal.
Arafangion
3
O dfcomando mostra onde foi montado
Will Sheppard

Respostas:

83

Maneira mais fácil: observe a saída dmesgapós conectar o dispositivo USB. Ele deve mostrar qual /devnó foi atribuído a ele.

zigdon
fonte
2
dmesgfunciona muito bem, mas tenho um caso em dmesgque não mostra o /devnó: o [421963.864281] usb 3-6: new high-speed USB device number 32 using xhci_hcdque isso significa? Como posso montar este dispositivo? O dispositivo aparece em lsusb...
modulitos
1
Na verdade, eu descobri. Houve uma atualização do kernel desde a minha última reinicialização que estava causando esse problema. Após uma reinicialização, meu usb monta muito bem. Espero que isso ajude alguém!
Modulitos
54

Desde que você esteja executando o udev , você pode fazer isso facilmente referenciando / dev / disk / by-id / usb- manufacturername _ serialnumber . Eles aparecem como links simbólicos que você pode referenciar diretamente no seu fstab ou que pode ser desreferenciado usando o readlink -e para determinar o dispositivo de bloco associado.

Aqui está um exemplo do mundo real. Na minha máquina, tenho 3 discos rígidos USB conectados. Cada um deles aparece em / dev / disk / by-id com números de série exclusivos (embora compartilhem uma sequência de caracteres comum do fabricante). Criei links simbólicos para cada uma dessas três entradas exclusivas e agora posso determinar rapidamente qual unidade é qual (e qual dispositivo está associado a cada unidade) executando o readlink -e linkname . Por exemplo, a execução do readlink -e / root / disk2 na minha máquina atualmente exibe " / dev / sde ", enquanto o readlink -e / root / disk3 não produz nenhuma saída.


fonte
15
Curto e simples:for devlink in /dev/disk/by-id/usb*; do readlink -f ${devlink}; done
Felipe Alcacibar 25/11
54

Todas essas são boas sugestões, mas o método mais rápido e menos detalhado é digitar apenas o seguinte no terminal:

mount

que fornecerá uma lista de todos os dispositivos montados (isso pressupõe que a unidade USB esteja montada, o que geralmente acontece com as distribuições modernas do Linux).

AnotherLongUsername
fonte
5
Não, ele não monta magicamente o seu dispositivo. Você precisa especificá-lo com mount /dev/id /mount/point, para que não funcione.
polym
9
Minha resposta aborda a pergunta do usuário 'Existe uma maneira de pesquisar no dmesg ou / proc ou em outro lugar para descobrir qual nó do dispositivo é uma unidade USB.' 'E não se destina a fornecer orientações sobre a praticidade de montar uma unidade no Linux .
AnotherLongUsername
Essa resposta resolveu uma pergunta quase idêntica para mim.
Matthew Brown aka Lord Matt
1
Eu acho que o comportamento da montagem automática depende muito do tipo de distribuição.
Jiggunjer # 02/16
1
dftambém, suponho.
Alexey
24

Experimente o comando udevinfo -q all -n /dev/sda, onde /dev/sdaestá o caminho para o seu disco. Isso fornece uma grande quantidade de informações sobre o disco que você está vendo - há uma entrada que informa sobre o barramento ao qual está conectado.

Obviamente, isso evita que você precise grep através do dmesg e / ou logs.

Atualizar

udevadm info --query=all -n /dev/sda 

Desde pelo menos julho de 2010 [ 1 ] udevinfo foi substituído no Debian (e derivado) por udevadm infoum pouco transitório, com o qual havia links simbólicos que foram descontinuados e removidos (você ainda pode encontrá-los em máquinas antigas e não atualizadas). Sempre de [ 1 ] podemos ler:

No udev 117, udevadmfoi introduzido udevinfoe outros programas transformados em links simbólicos de compatibilidade. Os links simbólicos foram descontinuados no udev 128 e removidos definitivamente no udev 147 .

Eltariel
fonte
8
No Debian, udevinfoé renomeado udevadm.
22611 Steve Pomeroy #
8
No Ubuntu, o comando parece ser "udevadm info --query = all -n / dev / sda"
machineghost
Suponho que eles renomeado o comando em algum momento - quando eu escrevi as respostas (há muito tempo) o comando trabalhou no sistema ubuntu que eu postei isso de;)
Eltariel
Comando ainda funciona no ubuntu,udevadm info --query=all -n /dev/ttyUSB1
Siddharth
1
udevadm info --query=all -n /dev/ttyUSBno Fedora também.
SLM
22

o método mais simples de ver o que está acontecendo é apenas digitar (como raiz, é claro):

blkid -c /dev/null

Isso fornece uma visão geral completa de todos os dispositivos de bloco, mesmo que não estejam montados

toh
fonte
Nem todas as distros têm isso. Qual você estava usando?
New Alexandria
Isso não gera nada na minha distro Raspbian.
IgorGanapolsky 8/08/16
Comando não encontrado: blkid
IgorGanapolsky 28/09
Nenhuma saída deste comando no Ubuntu 14.04 de 64 bits.
Gbmhunter 17/04
11

/dev/disk/by-* é a maneira mais fácil nesse caso, se por algum motivo você quiser tornar a vida mais interessante, pode usar o HAL.

Para listar todos os dispositivos que você usa:

hal-device

Para obter uma propriedade específica que você usa (isso retornará /dev/sd*em um dispositivo de armazenamento USB):

hal-get-property --udi $UDI --key block.device

Há também:

hal-find-by-capability
hal-find-by-property

Se você quiser torná-lo ainda mais complicado, pode escrever com facilidade um montador automático baseado em HAL , o que pode ser bastante útil se você quiser automatizar as coisas completamente.

E apenas para completar, também existem:

lsusb -v
lshw

O que fornece algumas informações gerais sobre USB e seu hardware em geral.

Grumbel
fonte
2
/ dev / disk / by-id / * usb * é muito útil.
12117 Rob
/ dev / disk / por etiqueta ftw. Obrigado :)
Triptych
10
sudo fdisk -l

E apenas analise o resultado.

Felipe
fonte
1
Página man fdisk "Se nenhum dispositivo for fornecido, os mencionados em / proc / partitions (se houver) serão usados." Executar o fdisk pode não ser uma opção ... Baseado em um sistema Debian que eu sei que não o tem instalado, meu palpite é que alguns sistemas GPT podem não instalar o software desnecessário. Ainda assim, a verificação de / proc / partitions deve ser uma opção.
TOOGAM
Esta foi a única opção que funcionou bem para mim. Lamento se não funcionou para você!
Felipe
8

Usar

ls -l /dev/disk/by-id/usb*

Sob as regras padrão do udev, isso mostrará a maioria dos dispositivos USB e mostrará o link simbólico para o nome do dispositivo de bloco no sistema.

Se isso não funcionar, olhe /dev/disk/by-id/diretamente.

DJ Capelis
fonte
6

Para dispositivos USB, você pode simplesmente fazer

REMOVABLE_DRIVES=""
for _device in /sys/block/*/device; do
    if echo $(readlink -f "$_device")|egrep -q "usb"; then
        _disk=$(echo "$_device" | cut -f4 -d/)
        REMOVABLE_DRIVES="$REMOVABLE_DRIVES $_disk"
    fi
done
echo Removable drives found: "$REMOVABLE_DRIVES"
lemsx1
fonte
1
+1. Script simples e conciso para executar a tarefa automaticamente.
Leesei
2

Dê uma olhada na árvore embaixo /dev/disk. Ele lista os discos e suas partições (sistemas de arquivos) por vários esquemas.

Ted Percival
fonte
2

/ var / log / message se o dmesg não tiver mais as informações.


fonte
0

Se você desconectar a unidade USB e conectá-la novamente, deverá vê-la inicializada no kernel (dmesg)

Furo
fonte
0

Com base na excelente resposta do stormlash e com a dependência do udev para preencher a árvore de dispositivos "/ dev / disk / by-id / usb", você pode definir um predicado (Bash) da seguinte maneira:

is_usb_device() {
    local device_path=$1        # such as /dev/sdc
    for devlink in /dev/disk/by-id/usb*; do
        if [ "$(readlink -f "$devlink")" = "$device_path" ]; then
            return 0
        fi
    done
    return 1
}

E então use-o:

if is_usb_device "/dev/sdg"; then
    echo "/dev/sdg is a usb device"
else
    echo "/dev/sdg is not a usb device"
fi
user30747
fonte