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?


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.


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.


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)

9

ls /sys/block


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

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.


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ê.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.