¿Cómo puedo averiguar el tamaño de un dispositivo de bloque, como /dev/sda
? Correr ls -l
no da información útil.
¿Cómo puedo averiguar el tamaño de un dispositivo de bloque, como /dev/sda
? Correr ls -l
no da información útil.
Respuestas:
fdisk
no 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-fdisk
para las tablas de partición Mac antiguas y gdisk
para 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
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
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/sda
devuelve el tamaño en sectores.
blockdev es parte de util-linux .
--getsize
está en desuso y sugiere --getsz
sectores consistentes de 512 bytes. Si --getsize
debe usarse, supongo --getss
que también debe usarse para asegurarse de que el tamaño del sector sea el esperado.
cat /sys/class/block/sda/size
Esto le da su tamaño en bloques de 512 bytes.
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);
BLKGETSIZE64
devuelve 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".
file
debe ser un descriptor de archivo (por ejemplo, de open()
) y file_size_in_bytes
debe ser un size_t
.
file_size_in_bytes
debería ser un tipo de 64 bits, por lo que debería serlo unsigned long long
.)
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
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 cat
y tenedor (excepto para bash
) puede ser optimizado de distancia con bash
, ksh93
y zsh
con:
echo "$((512*$(</sys/class/block/sda2/size)))"
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.
El blockdev (8) tiene una respuesta diferente? Las opciones --getsz
y en desuso --getsize
no son lo mismo.
blockdev --getss
) es para el tamaño del sector físico yblockdev --getbsz
) es para el tamaño del sector lógico.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
en 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 )
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/cdrom
siendo 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:
dd
;df
.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.
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:
¿Está /sys/block/sda/size
en 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
Hay una utilidad de EMC llamada inq
que brinda información sobre todos los tipos de dispositivos de bloque como local conectado, basado en SAN, etc.
Pruébalo.
ftp://ftp.emc.com/pub/symm3000/inquiry/
Aquí hay una breve descripción de lo que hace: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
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]#
echo $(( $(blockdev ...)/1024 ))
. También tenga en cuenta, --getbsz
da el tamaño del bloque, no el tamaño del dispositivo.
Más simple:
sudo parted -l /dev/sda
Es para mí el más fácil de recordar y escribir
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)