Sabiendo que tengo 9 años de retraso para responder, supongo que encontrarías la respuesta con un comando lsblk .
Adit Ya el
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?
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.
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.
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:
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.
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:
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.
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.
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.
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/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 */
}
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.
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?
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í, haymac-fdisk
para las tablas de partición Mac antiguas ygdisk
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?
fuente
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 .
fuente
--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.Esto le da su tamaño en bloques de 512 bytes.
fuente
Este simple código. No se pudo encontrar ninguna documentación, pero funciona bien:
fuente
BLKGETSIZE64
devuelve el tamaño en bytes. Verlinux/fs.h
, que señala "devolver el tamaño del dispositivo en bytes". Tenga en cuenta queBLKGETSIZE
(no "64") lo devuelve "/ 512".file
debe ser un descriptor de archivo (por ejemplo, deopen()
) yfile_size_in_bytes
debe ser unsize_t
.file_size_in_bytes
debería ser un tipo de 64 bits, por lo que debería serlounsigned long long
.)Qué tal si:
Esto le dará una lista de todos sus discos con su respectiva capacidad, uso y más.
fuente
blockdev --getsize /dev/sda
fuente
sudo
, de lo contrario obtendráPermission denied
.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:
fuente
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
da el tamaño en byte.
La llamada a
cat
y tenedor (excepto parabash
) puede ser optimizado de distancia conbash
,ksh93
yzsh
con:fuente
No es necesario usar ioctl en C. Solo busque el final del archivo y obtenga el tamaño (en bytes) de esa manera:
fuente
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.fuente
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 inblock/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)
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
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 embargocat /sys/class/block/cdrom/size
, no funcionará porque / dev / cdrom es solo un enlace simbólicoEl 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
.fuente
Un bloque es una secuencia de bits o bytes con una longitud fija, es decir, 512 bytes, 4kB, 8kB, 16kB, 32kB, etc.
Ejemplo
Entonces, el tamaño de bloque de este sistema de archivos es de 4kB.
Analogía: número de botellas en cajas.
fuente
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
fuente
¿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 .
Ver http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
fuente
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/
fuente
mostrará la salida en KB
fuente
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
fuente
Me resulta muy útil que todas esas herramientas estándar o entradas de proceso
fuente
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)
fuente