Determine o tamanho de um dispositivo de bloco

121

Como posso descobrir o tamanho de um dispositivo de bloco, como /dev/sda ? A execução de ls -l não fornece informações úteis.

    
por lfaraone 22.06.2009 / 14:49

19 respostas

68

fdisk não entende o layout de partição usado pelo meu Mac que executa o Linux, nem qualquer outro formato de partição não-PC. (Sim, há mac-fdisk para as antigas tabelas de partição do Mac e gdisk para a nova tabela de partição do GPT, mas elas não são os únicos outros layouts de partições disponíveis.)

Como o kernel já varreu os layouts de partição quando o dispositivo de bloco entrou em serviço, por que não perguntar diretamente a ele?

$ cat /proc/partitions
major minor  #blocks  name

   8       16  390711384 sdb
   8       17     514079 sdb1
   8       18  390194752 sdb2
   8       32  976762584 sdc
   8       33     514079 sdc1
   8       34  976245952 sdc2
   8        0  156290904 sda
   8        1     514079 sda1
   8        2  155774272 sda2
   8       48 1465138584 sdd
   8       49     514079 sdd1
   8       50 1464621952 sdd2
    
por 22.06.2009 / 19:50
159

blockdev --getsize64 /dev/sda retorna o tamanho em bytes.

blockdev --getsize /dev/sda retorna o tamanho em setores.

Fonte: man page no meu sistema Ubuntu.

    
por 10.05.2010 / 15:32
30
cat /sys/class/block/sda/size

Isso lhe dá o tamanho em blocos de 512 bytes.

    
por 22.02.2010 / 09:33
30

Este código simples. Não foi possível encontrar a documentação any , mas é um bom truque:

#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
    
por 28.04.2010 / 07:56
15

Que tal:

fdisk -l

Isso fornecerá uma lista de todos os seus discos com a respectiva capacidade, uso e muito mais.

    
por 22.06.2009 / 14:53
9

blockdev --getsize /dev/sda

    
por 01.04.2010 / 23:08
7

lsblk fornece as informações que você está procurando, incluindo tipos de dispositivos e pontos de montagem (se houver), com uma exibição em árvore e em um formato legível por humanos.

O tipo de dispositivo significa que ele funciona para unidades de CD, conforme solicitado por Ganesh Sittampalam.

Para obter apenas o tamanho de um determinado dispositivo em bytes:

lsblk -rbno SIZE /dev/block-device
    
por 27.10.2013 / 21:55
6
echo "'cat /sys/class/block/sda2/size'*512" | bc

ou se você usar bash ou qualquer outro shell parecido com POSIX cujos operadores aritméticos funcionem com números inteiros de 64 bits, você nem precisa chamar bc

echo "$((512*$(cat /sys/class/block/sda2/size)))"

dá o tamanho em byte.

A chamada para cat e fork (exceto para bash ) pode ser otimizada com bash , ksh93 e zsh com:

echo "$((512*$(</sys/class/block/sda2/size)))"
    
por 17.03.2010 / 23:20
4

O blockdev (8) tem uma resposta diferente? As opções --getsz e reprovated --getsize não são as mesmas.

  • BLKSSZGET ( blockdev --getss ) é para o tamanho do setor físico e
  • BLKBSZGET ( blockdev --getbsz ) é para tamanho de setor lógico.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
    
por 26.04.2012 / 14:48
4

Primeiro, agradeço a todos que contribuíram. Eu aprendi alguns coisas úteis.

Ainda assim, minha experiência é que a maioria dessas respostas é um pouco incompleta, pelo menos em CD e DVDs, notavelmente sobre se eles estão disponíveis para usuários normais em vez de restrito ao superusuário.
Isso é baseado em testes no Linux Mageia 2.

Os comandos destinados ao superusuário podem sempre ser acessados por um usuário normal. usuário prefixando-os com /sbin/ ou às vezes com / usr / sbin /. Agora eles podem ou não funcionar para um usuário normal.

Muitos podem funcionar, para um usuário normal, para um DVD na unidade de DVD, mesmo quando não está montado, enquanto eles não funcionam para um disco rígido (novamente quando invocado como usuário normal).

Por exemplo, /sbin/fdisk -l /dev/cdrom funcionará no meu sistema e dar a "geometria" do DVD na unidade ... que é aparentemente na maior parte absurdo. Mas dá o tamanho do DVD em bytes e em setores, e um tamanho de setor correto (de 2048 bytes, como é usual para o DVD).

O mesmo acontece com /usr/sbin/gdisk -l /dev/cdrom , que dão apenas o tamanho em setores de 2048 bytes.

outros exemplos (como usuário não-root, normal)

$ /sbin/blockdev --getss /dev/cdrom   # DVD sector size
2048
$ /sbin/blockdev --getsize64 /dev/cdrom  # DVD byte size
5453316096

$ cat /proc/partitions  # see below
...
   8        8  416027241 sda8
  11        0    5325504 sr0
   8       16 1465138584 sdb
...

Isso funciona para a unidade de DVD, aqui chamada de sr0 , já que o dispositivo para isso é na verdade /dev/sr0 , /dev/cdrom sendo apenas um link simbólico para ele. O tamanho é dado em blocos de 1k.

Da mesma forma, como usuário normal, o comando

$ cat /sys/class/block/sr0/size
10651008

fornecerá o tamanho de um DVD no dispositivo /dev/sr0 , em blocos de 512 bytes (assim como o tamanho de outro disco, mesmo não montado). No entanto, cat /sys/class/block/cdrom/size não funcionará porque / dev / cdrom é apenas um link simbólico

O comando df , sugerido por alguns, fornece o tamanho do arquivo montado partições, não de discos inteiros. Além disso, para um CD ou DVD montado Dá menos do que o tamanho real do CD / DVD. Mais precisamente, existem dois tamanhos distintos em que um pode estar interessado:

  • o tamanho geral do dispositivo, incluindo o que é usado para sua organização interna. Normalmente, esse é o tamanho do arquivo obtido se for copiado inteiro com o comando dd ;
  • o tamanho do espaço disponível (possivelmente apenas no modo somente leitura) para o usuário quando ele é montado, o que é sempre menor. Esse é o tamanho indicado pelo comando df .
por 03.05.2013 / 14:54
3

Não há necessidade de ioctl em C. Basta procurar o final do arquivo e obter o tamanho (em bytes) dessa forma:

/* define this before any #includes when dealing with large files: */
#define _FILE_OFFSET_BITS 64
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// ...
int fd = open("/dev/sda", O_RDONLY);
off_t size = lseek(fd, 0, SEEK_END);
// Now size is the size of the file, in bytes, or -1 on error.
// lseek(fd, 0, SEEK_SET) to get back to the start of the file.
    
por 09.10.2012 / 11:31
2

Um bloco é uma seqüência de bits ou Bytes com um comprimento fixo, ou seja, 512 bytes, 4kB, 8kB, 16kB, 32kB, etc.

blockdev --getbsz partition

Exemplo

# blockdev --getbsz /dev/sda1 
4096

Portanto, o tamanho do bloco deste sistema de arquivos é de 4kB.

Analogia: número de garrafas em caixas.

    
por 20.04.2017 / 05:25
0

/sys/block/sda/size no tamanho do bloco? Se sim qual?

O ioctl BLKGETSIZE tem o mesmo problema que em unidades de 512 em vez de BLKSSZGET . BLKGETSIZE64 resolve esta ambiguidade. A contagem real de blocos é BLKGETSIZE64 / BLKSSZGET .

/*BINFMTC:
http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <assert.h>

int main(int argc, char **argv)
{
        int fd;
        long blk=0L;
        long ssz=0L;
        long long oct=0LL;

        if((fd=open(argv[1],O_RDONLY))<0) { perror(argv[1]); exit(1); }
        if(ioctl(fd,BLKGETSIZE,&blk)<0) { perror("BLKGETSIZE"); exit(1); }
        if(ioctl(fd,BLKSSZGET,&ssz)<0) { perror("BLKSSZGET"); exit(1); }
        if(ioctl(fd,BLKGETSIZE64,&oct)<0) { perror("BLKGETSIZE64"); exit(1); }
        if(close(fd)<0) { perror("close"); exit(1); }
        printf("BLKGETSIZE=%ld BLKSSZGET=%ld BLKGETSIZE64=%lld BLKGETSIZE64/BLKSSZGET=%ld SIZEGB=%f #%f0GiB\n\n",\
blk,ssz,oct,(long)(oct/(long long)ssz),(double)oct/1000000000.0,(double)oct/1073741824.0);

        fflush(stdout); /* before exec */

        execl("/bin/bash","bash","-c",\
"for i in \
/sys/block/?d?/{size,alignment_offset,?d??/size,?d??/alignment_offset,queue/*block*,queue/*sector*}; \
do test -f \"$i\" && echo \"$i: $(<$i)\"; done"\
,NULL);

        exit(127);
        return 127; /* not reached */
}

Veja o link

    
por 26.04.2012 / 13:07
0

Existe um utilitário da EMC chamado inq , que fornece informações sobre todos os tipos de dispositivos de bloco, como locais conectados, baseados em SAN, etc.

Experimente.

ftp://ftp.emc.com/pub/symm3000/inquiry/

Aqui está uma breve descrição do que faz: link

    
por 02.04.2013 / 03:38
0
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'

Acho muito útil que todas as ferramentas padrão ou entradas de proc

    
por 06.11.2015 / 11:36
0
echo "'blockdev --getbsz /dev/sdc'/1024"|bc

mostrará a saída em KB

[root@veritas datadg2]# echo "'blockdev --getbsz /dev/sdc'/1024"|bc
4
[root@veritas datadg2]#
    
por 03.02.2016 / 15:35
0

Se você estiver usando o Node.js, poderá usar esse complemento nativo para obter o tamanho do dispositivo de bloco, o tamanho do setor físico e o tamanho do setor lógico (com suporte para FreeBSD, Linux, macOS e Windows). Ele também tem alguns outros ajudantes para fazer IO direto:

link

    
por 27.09.2017 / 10:09
0

Mais simplesmente:

sudo parted -l /dev/sda

É para mim o mais fácil de lembrar e digitar

    
por 31.07.2018 / 20:02
-1
df -k | grep /dev/sda

fornecerá o tamanho em KB (primeiro número), bem como o espaço usado (segundo número) e o espaço disponível (terceiro número)

    
por 22.06.2009 / 14:53

Tags