Wie kann ich die Größe eines Blockgeräts ermitteln, z /dev/sda
. Laufen ls -l
gibt keine nützlichen Informationen.
Wie kann ich die Größe eines Blockgeräts ermitteln, z /dev/sda
. Laufen ls -l
gibt keine nützlichen Informationen.
Antworten:
fdisk
versteht weder das Partitionslayout, das von meinem Mac unter Linux verwendet wird, noch irgendein anderes Nicht-PC-Partitionsformat. (Ja, es gibt mac-fdisk
alte Mac-Partitionstabellen und gdisk
neuere GPT-Partitionstabellen, aber das sind nicht die einzigen anderen Partitionslayouts.)
Da der Kernel die Partitionslayouts bereits bei der Inbetriebnahme des Blockgeräts überprüft hat, sollten Sie ihn direkt fragen.
$ 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
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
blockdev --getsize64 /dev/sda
Gibt die Größe in Bytes zurück.
blockdev --getsz /dev/sda
Gibt die Größe in 512-Byte-Sektoren zurück.
Veraltet: blockdev --getsize /dev/sda
Gibt die Größe in Sektoren zurück.
blockdev ist ein Teil von util-linux .
--getsize
veraltet ist, und schlägt --getsz
konsistente 512-Byte-Sektoren vor. Wenn --getsize
verwendet werden muss, --getss
sollte vermutlich auch verwendet werden, um sicherzustellen, dass die Sektorgröße Ihren Erwartungen entspricht.
cat /sys/class/block/sda/size
Dies gibt Ihnen die Größe in 512-Byte-Blöcken.
Dieser einfache Code. Konnte keine Dokumentation finden, aber macht den Trick gut:
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
BLKGETSIZE64
die Größe in Bytes zurück. Sehen Sie linux/fs.h
, welche Hinweise "Gerätegröße in Bytes zurückgeben". Beachten Sie, dass BLKGETSIZE
(keine "64") "/ 512" zurückgibt.
file
muss es sich um einen Dateideskriptor (z. B. from open()
) handeln und file_size_in_bytes
sollte a sein size_t
.
file_size_in_bytes
sollte es ein 64-Bit-Typ sein, so sollte es sein unsigned long long
.)
lsblk
gibt die gesuchten Informationen, einschließlich der Gerätetypen und Mountpunkte (falls vorhanden), in einer Baumansicht und in einem für Menschen lesbaren Format an.
Gerätetyp bedeutet, dass es für CD-Laufwerke funktioniert, wie von Ganesh Sittampalam angefordert.
So ermitteln Sie die Größe eines bestimmten Geräts nur in Byte:
lsblk -rbno SIZE /dev/block-device
echo "`cat /sys/class/block/sda2/size`*512" | bc
oder wenn Sie bash oder eine andere POSIX-ähnliche Shell verwenden, deren arithmetische Operatoren mit 64-Bit-Ganzzahlen arbeiten, brauchen Sie nicht einmal aufzurufen bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
gibt die Größe in Byte an.
Der Aufruf an cat
und Gabel (ausgenommen bash
) mit wegoptimiert werden bash
, ksh93
und zsh
mit:
echo "$((512*$(</sys/class/block/sda2/size)))"
Ioctl ist in C nicht erforderlich. Suchen Sie einfach nach dem Ende der Datei und ermitteln Sie die Größe (in Byte) auf folgende Weise:
/* 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.
Das blockdev (8) hat eine andere Antwort? Optionen --getsz
und veraltete --getsize
sind nicht dasselbe.
blockdev --getss
) ist für die physische Sektorgröße undblockdev --getbsz
) ist für die logische Sektorgröße.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
Kernelquelle unter Linux irreführende Kommentare enthält. BLKPBSZGET (beachten Sie, dass das P) die Größe des physischen Sektors erhält, BLKSSZGET die Größe des logischen Sektors und BLKBSZGET (oder BLKBSZGET_32 in block/compat_ioctl.c
) die Größe der Dateisystemzuordnungseinheit (Cluster). Die Größe des logischen und physischen Sektors unterscheidet sich, wenn Advanced Format 512e verwendet wird. ( 512e @ WP )
Zunächst meinen Dank an alle, die dazu beigetragen haben. Ich habe ein paar nützliche Dinge gelernt.
Ich habe jedoch die Erfahrung gemacht, dass die meisten dieser Antworten, zumindest bei CDs und DVDs, etwas unvollständig sind, insbesondere in Bezug darauf, ob sie normalen Benutzern zur Verfügung stehen und nicht nur dem Superuser.
Dies basiert auf Tests auf meinem Linux Mageia 2.
Auf Befehle für den Superuser kann ein normaler Benutzer immer zugreifen /sbin/
, indem er ihnen das Präfix / usr / sbin / voranstellt oder manchmal das Präfix / usr / sbin /. Jetzt können sie für einen normalen Benutzer arbeiten oder nicht.
Viele funktionieren möglicherweise für einen normalen Benutzer für eine DVD auf dem DVD-Laufwerk, auch wenn sie nicht bereitgestellt ist, während sie für eine Festplatte nicht funktionieren (erneut, wenn sie als normaler Benutzer aufgerufen werden).
Zum Beispiel /sbin/fdisk -l /dev/cdrom
wird auf meinem System gearbeitet und die "Geometrie" der DVD im Laufwerk angegeben ... was anscheinend meistens Unsinn ist. Aber es gibt die Größe der DVD in Bytes und in Sektoren und eine korrekte Sektorgröße (von 2048 Bytes, wie es für DVD üblich ist).
Gleiches gilt für /usr/sbin/gdisk -l /dev/cdrom
, die nur die Größe in Sektoren von 2048 Bytes angeben.
andere Beispiele (als Nicht-Root-Benutzer, normaler Benutzer)
$ /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
...
Dies funktioniert für das DVD - Laufwerk, hier genannt sr0
, da das Gerät für sie tatsächlich ist /dev/sr0
, /dev/cdrom
nur ein symbolischer Link auf sie zu sein. Die Größe wird in Stücken von 1k angegeben.
Ebenso wie der normale Benutzer den Befehl
$ cat /sys/class/block/sr0/size
10651008
gibt die Größe einer DVD auf dem Gerät /dev/sr0
in Stücken von 512 Bytes an (sowie die Größe einer anderen Festplatte, auch wenn diese nicht gemountet ist). Dies cat /sys/class/block/cdrom/size
wird jedoch nicht funktionieren, da / dev / cdrom nur ein symbolischer Link ist
Der df
von einigen vorgeschlagene Befehl gibt die Größe der gemounteten Partitionen an, nicht der ganzen Festplatten. Darüber hinaus gibt es für eine eingelegte CD oder DVD weniger als die tatsächliche Größe der CD / DVD. Genauer gesagt gibt es zwei verschiedene Größen, an denen man interessiert sein könnte:
dd
.df
.Ein Block ist eine Folge von Bits oder Bytes mit einer festen Länge, dh 512 Bytes, 4 kB, 8 kB, 16 kB, 32 kB usw.
blockdev --getbsz partition
Beispiel
# blockdev --getbsz /dev/sda1
4096
Die Blockgröße dieses Dateisystems beträgt also 4 KB.
Wenn Sie Node.js verwenden, können Sie dieses native Add-On verwenden, um die Größe von Blockgeräten, physischen Sektoren und logischen Sektoren abzurufen (mit Unterstützung für FreeBSD, Linux, macOS und Windows). Es gibt auch ein paar andere Helfer für die direkte Eingabe:
Ist /sys/block/sda/size
in Blockgröße? Wenn ja, welches?
Das ioctl BLKGETSIZE hat das gleiche Problem wie in Einheiten von 512 anstelle von BLKSSZGET . BLKGETSIZE64 löst diese Mehrdeutigkeit. Die tatsächliche Blockanzahl ist 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 */
}
Siehe http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
Es gibt ein EMC-Dienstprogramm, inq
das Informationen zu allen Arten von Blockgeräten wie lokal angeschlossen, SAN-basiert usw. enthält.
Versuch es.
ftp://ftp.emc.com/pub/symm3000/inquiry/
Hier ist eine kurze Beschreibung dessen, was es tut: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
echo "`blockdev --getbsz /dev/sdc`/1024"|bc
Zeigt die Ausgabe in KB an
[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
echo $(( $(blockdev ...)/1024 ))
. Beachten Sie auch, --getbsz
gibt die Größe des Blocks, nicht die Größe des Geräts.
Einfacher:
sudo parted -l /dev/sda
Ist für mich am einfachsten zu merken und zu tippen
df -k | grep /dev/sda
Gibt die Größe in KB (erste Nummer) sowie den verwendeten Speicherplatz (zweite Nummer) und den verfügbaren Speicherplatz (dritte Nummer) an.