Encontre todos os dispositivos de armazenamento conectados a uma máquina Linux [fechado]

109

Preciso encontrar todos os dispositivos de armazenamento graváveis ​​conectados a uma determinada máquina, estejam eles montados ou não .

A maneira estúpida de fazer isso seria tentar todas as entradas /devque correspondam a dispositivos graváveis ​​( hd* and sd*) ......

Existe uma solução melhor ou devo ficar com esta?

Warren
fonte
Use libsysfs , a forma recomendada de consultar o kernel sobre dispositivos anexados de todos os tipos.
David Schmitt,
Já que você fala sobre eles estarem montados, acho que quer uma lista de partições, não apenas de discos.
Mark Baker
partições também estão bem, sim :) .. se eu conheço as partições, também saberei quais dispositivos físicos estão disponíveis
warren
2
uma vez que o Unix e o Linux já estão disponíveis, esta questão deve ser migrada para lá
warren
3
@warren - oh não. Eles ainda devem ser fechados. Como você, como proprietário da postagem, deseja que isso seja movido, você deve sinalizá-lo para atenção do moderador. O fato de que você deseja movê-lo terá algum peso.
ChrisF

Respostas:

79

/proc/partitionsirá listar todos os dispositivos de bloco e partições que o sistema reconhece. Você pode então tentar file -s <device>determinar que tipo de sistema de arquivos está presente na partição, se houver.

Steve Baker
fonte
4
Isso omite unidades de CD / DVD, por exemplo (eu sei que geralmente não são graváveis)
pixelbeat
Existe uma espécie de limite para o que você pode fazer a partir de um shell. A maioria das outras sugestões com classificação mais alta não funcionam em um shell, não funcionarão a menos que o dbus esteja em execução ou listarão dispositivos que não estão realmente presentes / configurados. Isso é apenas mais rápido do que verificar todos os dispositivos / dev.
Steve Baker,
5
lsblk este é melhor
emj365
1
/ proc / partitions também fornece a letra da unidade no Cygwin.
katriel
72

Você sempre pode fazer o fdisk -lque parece funcionar muito bem, mesmo em configurações estranhas, como dispositivos EC2 xvda.

Aqui está um dump de uma instância m1.large:

root@ip-10-126-247-82:~# fdisk -l

Disk /dev/xvda1: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda1 doesn't contain a valid partition table

Disk /dev/xvda2: 365.0 GB, 365041287168 bytes
255 heads, 63 sectors/track, 44380 cylinders, total 712971264 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda2 doesn't contain a valid partition table

Disk /dev/xvda3: 939 MB, 939524096 bytes
255 heads, 63 sectors/track, 114 cylinders, total 1835008 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda3 doesn't contain a valid partition table

Enquanto mountdiz:

root@ip-10-126-247-82:~# mount
/dev/xvda1 on / type ext4 (rw)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/xvda2 on /mnt type ext3 (rw)

E /proc/partitionsdiz:

root@ip-10-126-247-82:~# cat /proc/partitions
major minor  #blocks  name

 202        1   10485760 xvda1
 202        2  356485632 xvda2
 202        3     917504 xvda3

Nota

Como fdisk -lfunciona é algo que eu adoraria saber.

Maxim Veksler
fonte
9
Não tenho certeza se você já descobriu como fdisk -lfunciona, mas achei que você gostaria de saber: ele lê /proc/partitionse, em seguida, itera através do /sys/dev/block/*qual contém um conjunto de links simbólicos para o representante verdadeiro dos dispositivos em sysfs. Você pode encontrar essas informações executando fdiskem strace:)
1
Ótimo! Obrigado. (OT: É uma pena ver esta questão bloqueada. Deveria haver um botão "votação para reverter o bloqueio").
Maxim Veksler
1
há para usuários de 3.000 repetições e superiores (um botão "reabrir").
sério? Então devo chegar a 3k o mais rápido possível.
Maxim Veksler
sim, consulte a página de privilégios para obter a lista completa de coisas que você pode fazer com mais representantes.
35

você também pode tentar o lsblk ... está no util-linux ... mas eu também tenho uma pergunta

fdisk -l /dev/sdl

sem resultado

grep sdl /proc/partitions      
   8      176   15632384 sdl
   8      177   15628288 sdl1

lsblk | grep sdl
sdl       8:176  1  14.9G  0 disk  
`-sdl1    8:177  1  14.9G  0 part  

O fdisk é bom, mas não tão bom ... parece que não consegue "ver" tudo

em meu exemplo particular, tenho um pendrive que também possui um leitor de cartão integrado e só consigo ver o pendrive usando fdisk:

fdisk -l /dev/sdk

Disk /dev/sdk: 15.9 GB, 15931539456 bytes
255 heads, 63 sectors/track, 1936 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xbe24be24

   Device Boot      Start         End      Blocks   Id  System
/dev/sdk1   *        8192    31116287    15554048    c  W95 FAT32 (LBA)

mas não o cartão (cartão sendo / dev / sdl)

além disso, o arquivo -s é ineficiente ...

file -s /dev/sdl1
/dev/sdl1: sticky x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", sectors/cluster 8, reserved sectors 0, Media descriptor 0xf8, heads 255, hidden sectors 8192, dos < 4.0 BootSector (0x0)

isso é bom ... MAS

fdisk -l /dev/sdb
/dev/sdb1            2048   156301487    78149720   fd  Linux raid autodetect
/dev/sdb2       156301488   160086527     1892520   82  Linux swap / Solaris

file -s /dev/sdb1
/dev/sdb1: sticky \0

para ver informações sobre um disco que não pode ser acessado pelo fdisk, você pode usar o parted:

parted /dev/sdl print

Model: Mass Storage Device (scsi)
Disk /dev/sdl: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  16.0GB  16.0GB  primary  ntfs




arted /dev/sdb print 
Model: ATA Maxtor 6Y080P0 (scsi)
Disk /dev/sdb: 82.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  80.0GB  80.0GB  primary                  raid
 2      80.0GB  82.0GB  1938MB  primary  linux-swap(v1)
O feiticeiro
fonte
9

ls /sys/block

Mihai Limbășan
fonte
não lista partições. Não tenho certeza se era isso que a pergunta original queria ou não.
Mark Baker
1
Nunca soube sobre / sys / block - embora também liste dispositivos que não são graváveis, como a unidade de DVD
warren
1
Na verdade, ele não lista as partições - você pode verificar os subdiretórios, no entanto, procurando por todos os subdiretórios que contenham no mínimo arquivos chamados "dev", "stat" e "uevent" e subdiretórios chamados "holder". DVDs ainda são dispositivos de classe de armazenamento :)
Mihai Limbășan
3
moocha, por que você não expande um pouco sua resposta?
SpoonMeiser,
2
@warren - presumivelmente / dev / dvd será apenas um apelido para um dispositivo / dev / sd * ou / dev / hd *, então você teria esse problema de qualquer maneira.
SpoonMeiser,
7

Usando HAL (kernel 2.6.17 e superior):


#! /bin/bash
hal-find-by-property --key volume.fsusage --string filesystem |
while read udi ; do
    # ignore optical discs
    if [[ "$(hal-get-property --udi $udi --key volume.is_disc)" == "false" ]]; then
        dev=$(hal-get-property --udi $udi --key block.device)   
        fs=$(hal-get-property --udi $udi --key volume.fstype) 
        echo $dev": "$fs
    fi 
done
ZungBang
fonte
4

Os sistemas Linux modernos normalmente só terão entradas em / dev para dispositivos existentes, portanto, passar por hda * e sda ​​* como você sugere funcionaria muito bem.

Caso contrário, pode haver algo em / proc que você possa usar. Olhando rapidamente, diria que / proc / partitions parece que pode fazer o que você precisa.

Mark Baker
fonte
2

libsysfs parece potencialmente útil, mas não diretamente de um script de shell. Há um programa que vem com ele, chamado systool, que fará o que você quiser, embora possa ser mais fácil apenas olhar em / sys diretamente em vez de usar outro programa para fazer isso por você.

Mark Baker
fonte