Determinar el tamaño de un dispositivo de bloque


Respuestas:


73

fdiskno comprende el diseño de partición utilizado por mi Mac con Linux, ni ningún otro formato de partición que no sea PC (Sí, hay mac-fdiskpara las tablas de partición Mac antiguas y gdiskpara la tabla de partición GPT más nueva, pero esos no son los únicos diseños de partición disponibles).

Dado que el núcleo ya escaneó los diseños de partición cuando el dispositivo de bloque entró en servicio, ¿por qué no preguntar directamente?

$ cat / proc / particiones
mayor menor #bloques nombre

   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

Esto no funciona para cosas como unidades de CD
Ganesh Sittampalam

2
Y también solo informa nombres "nativos". En un servidor con iSCSI y / o multirrutas y / o LVM, obtienes muchos dispositivos sd * y dm- *, pero por lo general necesitas buscar el enlace simbólico del que realmente te interesa (por ejemplo, a / dev / mapper / * one)
Luke404

2
Los valores informados aquí son múltiplos de 1 KB, que pueden ser un sector (512 bytes) demasiado pequeño.
Lekensteyn

1
Esto me fue útil. Terminé haciendoawk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
suprjami

173

blockdev --getsize64 /dev/sda devuelve el tamaño en bytes.

blockdev --getsz /dev/sda devuelve el tamaño en sectores de 512 bytes.

En desuso: blockdev --getsize /dev/sdadevuelve el tamaño en sectores.

blockdev es parte de util-linux .


44
desafortunadamente necesita energía de superusuario
heinrich5991

66
@ heinrich5991 no tienes otra opción. Un usuario normal no puede acceder a un dispositivo de bloque directamente ("lectura cruda"), lo cual es bueno para la seguridad.
Totor

@Totor Claro, pero hay respuestas a esta pregunta específica que no requieren ningún derecho de superusuario.
heinrich5991

2
@ heinrich5991 cuando trabaje con sistemas de archivos, debe preguntar a statfs () y amigos. Más importante aún, debe no asume ninguna relación directa entre el tamaño del dispositivo de bloque total y / utilizable / efectivo / libre / lo que sea espacio en el sistema de archivos.
Luke404

2
La página de manual en linux.die.net/man/8/blockdev dice que --getsizeestá en desuso y sugiere --getszsectores consistentes de 512 bytes. Si --getsizedebe usarse, supongo --getssque también debe usarse para asegurarse de que el tamaño del sector sea el esperado.
mwfearnley

35
cat /sys/class/block/sda/size

Esto le da su tamaño en bloques de 512 bytes.


99
@ heinrich5991 ¿Cómo puede estar seguro de que el tamaño del bloque del dispositivo es siempre de 512 bytes?
Totor

55
El tamaño del sector es siempre de 512 bytes según la fuente . Para el futuro, estoy tratando de documentar esta interfaz .
Lekensteyn

Gracias por dejar eso claro. Noté que también hay un / sys / class / block / sda / queue / logical_block_size. No estaba seguro de si debería usar eso, o la constante 512.
Edward Falk

33

Este simple código. No se pudo encontrar ninguna documentación, pero funciona bien:

#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);

Corrección: en realidad te da el tamaño en SECTORES. Edítelo y lo votaré.
JCCyC

8
@JCCyC: BLKGETSIZE64devuelve el tamaño en bytes. Ver linux/fs.h, que señala "devolver el tamaño del dispositivo en bytes". Tenga en cuenta que BLKGETSIZE(no "64") lo devuelve "/ 512".
Thanatos

Trabajé una muestra más completa en parte basada en esto en stackoverflow.com/a/48490543/446106 . Para utilizar el fragmento anterior aquí, filedebe ser un descriptor de archivo (por ejemplo, de open()) y file_size_in_bytesdebe ser un size_t.
mwfearnley

(En realidad, file_size_in_bytesdebería ser un tipo de 64 bits, por lo que debería serlo unsigned long long.)
mwfearnley

16

Qué tal si:

fdisk -l

Esto le dará una lista de todos sus discos con su respectiva capacidad, uso y más.


3
Pruébelo con sudo, de lo contrario simplemente no imprime nada.
Alfe

10

blockdev --getsize /dev/sda


Use con sudo, de lo contrario obtendrá Permission denied.
Wimateeka

9

lsblk proporciona la información que está buscando, incluidos los tipos de dispositivos y los puntos de montaje (si corresponde), con una vista de árbol y en un formato legible para humanos.

El tipo de dispositivo significa que funciona para unidades de CD, como lo solicitó Ganesh Sittampalam.

Para obtener solo el tamaño de un dispositivo particular en bytes:

lsblk -rbno SIZE /dev/block-device

7
echo "`cat /sys/class/block/sda2/size`*512" | bc

o si usa bash o cualquier otro shell similar a POSIX cuyos operadores aritméticos funcionan con enteros de 64 bits, ni siquiera necesita llamar bc

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

da el tamaño en byte.

La llamada a caty tenedor (excepto para bash) puede ser optimizado de distancia con bash, ksh93y zshcon:

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

5

No es necesario usar ioctl en C. Solo busque el final del archivo y obtenga el tamaño (en bytes) de esa manera:

/* 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.

Si está buscando el tamaño de la unidad de disco sin formato, necesitará privilegios de root para abrir el archivo y buscar hasta el final.
Edward Falk

5

El blockdev (8) tiene una respuesta diferente? Las opciones --getszy en desuso --getsizeno son lo mismo.

  • BLKSSZGET ( blockdev --getss) es para el tamaño del sector físico y
  • BLKBSZGET ( blockdev --getbsz) es para el tamaño del sector lógico.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

En realidad, creo que tienes esos invertidos. (A menos que mi sistema tenga bloques físicos de 512 bytes y bloques lógicos de 4096 bytes).
Edward Falk

2
Bueno, me di cuenta de que block/ioctl.cen Linux la fuente del núcleo contiene comentarios engañosos. BLKPBSZGET (observe que la P) obtiene el tamaño del sector físico, BLKSSZGET obtiene el tamaño del sector lógico y BLKBSZGET (o BLKBSZGET_32 in block/compat_ioctl.c) obtiene el tamaño de la unidad de asignación del sistema de archivos (clúster). El tamaño del sector lógico y físico difiere cuando se utiliza el formato avanzado 512e. ( 512e @ WP )
Palec

@Palec El comentario más informado entre todas las respuestas y comentarios a esta pregunta.
Irfan Latif

5

Primero, mi agradecimiento a todos los que contribuyeron. Aprendí algunas cosas útiles.

Aún así, mi experiencia es que la mayoría de estas respuestas son algo incompletas, al menos en lo que respecta a CD y DVD, en particular si están disponibles para usuarios normales en lugar de restringirse al superusuario.
Esto se basa en pruebas en mi Linux Mageia 2.

Los comandos destinados al superusuario siempre pueden ser accedidos por un usuario normal prefijándolos /sbin/o, a veces, con / usr / sbin /. Ahora pueden o no funcionar para un usuario normal.

Muchos pueden funcionar, para un usuario normal, para un DVD en la unidad de DVD, incluso cuando no está montado, mientras que no funcionarán para un disco duro (nuevamente cuando se invoca como usuario normal).

Por ejemplo /sbin/fdisk -l /dev/cdrom, funcionará en mi sistema y dará la "geometría" del DVD en la unidad ... lo que aparentemente no tiene sentido. Pero sí da el tamaño del DVD en bytes y en sectores, y un tamaño de sector correcto (de 2048 bytes, como es habitual en DVD).

Lo mismo se aplica a /usr/sbin/gdisk -l /dev/cdrom, que dan solo el tamaño en sectores de 2048 bytes.

otros ejemplos (como usuario normal no root)

$ /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
...

Esto funciona para la unidad de DVD, llamada aquí sr0, ya que el dispositivo para él es en realidad /dev/sr0, /dev/cdromsiendo solo un enlace simbólico. El tamaño se da en trozos de 1k.

Del mismo modo, como usuario normal, el comando

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

dará el tamaño de un DVD en el dispositivo /dev/sr0, en fragmentos de 512 bytes (así como el tamaño de otro disco, incluso sin montar). Sin embargo cat /sys/class/block/cdrom/size, no funcionará porque / dev / cdrom es solo un enlace simbólico

El comando df, sugerido por algunos, da el tamaño de particiones montadas, no de discos enteros. Además, para un CD o DVD montado, da menos del tamaño real del CD / DVD. Más precisamente, hay dos tamaños distintos en los que uno puede estar interesado:

  • el tamaño general del dispositivo, incluido lo que se usa para su organización interna. Por lo general, ese es el tamaño del archivo obtenido si se copia completo con el comando dd;
  • el tamaño del espacio disponible (posiblemente solo en modo de solo lectura) para el usuario cuando está montado, que siempre es menor. Ese es el tamaño que indica el comando df.

uptick para $ / sbin / blockdev --getss / dev / cdrom # Tamaño del sector de DVD
peterretief

Dices 512k pero te refieres a solo 512 bytes de sectores.
Tom Hale

3

Un bloque es una secuencia de bits o bytes con una longitud fija, es decir, 512 bytes, 4kB, 8kB, 16kB, 32kB, etc.

blockdev --getbsz partition

Ejemplo

# blockdev --getbsz /dev/sda1 
4096

Entonces, el tamaño de bloque de este sistema de archivos es de 4kB.

Analogía: número de botellas en cajas.
ingrese la descripción de la imagen aquí


Esta es la respuesta correcta.
Karl Morrison

1

Si está utilizando Node.js, puede usar este complemento nativo para obtener el tamaño del dispositivo de bloque, el tamaño del sector físico y el tamaño del sector lógico (con soporte para FreeBSD, Linux, macOS y Windows). También tiene algunos otros ayudantes para hacer IO directo:

https://github.com/ronomon/direct-io


0

¿Está /sys/block/sda/sizeen tamaño de bloque? Si es así, ¿Cuál?

El ioctl BLKGETSIZE tiene el mismo problema que en unidades de 512 en lugar de BLKSSZGET . BLKGETSIZE64 resuelve esta ambigüedad. El recuento de bloques real es 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 #%f\240GiB\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 */
}

Ver http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html


1
Abuso de aserción: si deshabilita las aserciones, sus efectos secundarios necesarios ya no sucederán.
Alfe


0
echo "`blockdev --getbsz /dev/sdc`/1024"|bc

mostrará la salida en KB

[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#

Bash puede hacer cálculos en línea: echo $(( $(blockdev ...)/1024 )). También tenga en cuenta, --getbszda el tamaño del bloque, no el tamaño del dispositivo.
mwfearnley


-1
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'

Me resulta muy útil que todas esas herramientas estándar o entradas de proceso


-3
df -k | grep /dev/sda

le dará el tamaño en KB (primer número), así como el espacio utilizado (segundo número) y el espacio disponible (tercer número)


55
Eso es solo si el sistema de archivos está montado.
lfaraone

2
No se trata de bloquear el espacio del dispositivo, le dará espacio usado y utilizable de los sistemas de archivos montados que están en / dev / sda. ¿Qué pasa con el espacio no particionado? ¿Qué pasa si tienes múltiples particiones?
kbyrd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.