Bestimmen Sie die Größe eines Blockgeräts


134

Wie kann ich die Größe eines Blockgeräts ermitteln, z /dev/sda. Laufen ls -lgibt keine nützlichen Informationen.



2
Da ich weiß, dass ich 9 Jahre zu spät bin, um zu antworten, schätze ich, dass Sie die Antwort mit einem lsblk- Befehl finden würden.
Adit Ya

Antworten:


72

fdiskversteht weder das Partitionslayout, das von meinem Mac unter Linux verwendet wird, noch irgendein anderes Nicht-PC-Partitionsformat. (Ja, es gibt mac-fdiskalte Mac-Partitionstabellen und gdiskneuere 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

Dies funktioniert nicht für Dinge wie CD-Laufwerke
Ganesh Sittampalam

2
Und meldet auch nur "native" Namen. Auf einem Server mit iSCSI und / oder Multipath und / oder LVM erhalten Sie viele, viele SD * - und DM- * -Geräte. In der Regel müssen Sie jedoch den Symlink des Servers nachschlagen, an dem Sie tatsächlich interessiert sind (z. B. a / dev / mapper / * one)
Luke404

2
Bei den hier angegebenen Werten handelt es sich um ein Vielfaches von 1 KB, wobei ein Sektor (512 Byte) möglicherweise zu klein ist.
Lekensteyn

1
Das war nützlich für mich. awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
Am

173

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/sdaGibt die Größe in Sektoren zurück.

blockdev ist ein Teil von util-linux .


4
braucht leider superuser power
heinrich5991

6
@ heinrich5991 du hast keine wahl. Ein normaler Benutzer kann nicht direkt auf ein Blockgerät zugreifen ("raw reading"), was für die Sicherheit gut ist.
Totor

@Totor Sicher, aber es gibt Antworten auf diese spezielle Frage, für die keine Superuser-Rechte erforderlich sind.
Heinrich5991

2
@ heinrich5991 Wenn du mit Dateisystemen arbeitest, solltest du statfs () und Freunde fragen. Noch wichtiger ist , sollten Sie nicht eine direkte Beziehung zwischen der Blockgerätegröße und Gesamt / verwendbar / wirksam / Frei / was auch immer Raum auf Dateisystem übernehmen.
Luke404

2
Die Manpage unter linux.die.net/man/8/blockdev besagt, dass sie --getsizeveraltet ist, und schlägt --getszkonsistente 512-Byte-Sektoren vor. Wenn --getsizeverwendet werden muss, --getsssollte vermutlich auch verwendet werden, um sicherzustellen, dass die Sektorgröße Ihren Erwartungen entspricht.
Mwfearnley

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

Dies gibt Ihnen die Größe in 512-Byte-Blöcken.


9
@ heinrich5991 Wie können Sie sicher sein, dass die Geräteblockgröße immer 512 Byte beträgt ?
Totor

5
Die Sektorgröße beträgt laut Quelle immer 512 Bytes . Für die Zukunft versuche ich, diese Schnittstelle zu dokumentieren .
Lekensteyn

Vielen Dank, dass Sie das klargestellt haben. Mir ist aufgefallen, dass es auch ein / sys / class / block / sda / queue / logical_block_size gibt. Ich war mir nicht sicher, ob ich das oder die Konstante 512 verwenden sollte.
Edward Falk

33

Dieser einfache Code. Konnte keine Dokumentation finden, aber macht den Trick gut:

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

Korrektur: Sie erhalten tatsächlich die Größe in SECTORS. Bearbeite es und ich stimme zu.
JCCyC

8
@JCCyC: Gibt BLKGETSIZE64die 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.
Thanatos

Unter stackoverflow.com/a/48490543/446106 habe ich eine vollständigere Stichprobe ausgearbeitet, die teilweise darauf basiert . Um das obige Snippet hier verwenden zu können, filemuss es sich um einen Dateideskriptor (z. B. from open()) handeln und file_size_in_bytessollte a sein size_t.
Mwfearnley

(Eigentlich file_size_in_bytessollte es ein 64-Bit-Typ sein, so sollte es sein unsigned long long.)
mwfearnley

16

Wie wäre es mit:

fdisk -l

Auf diese Weise erhalten Sie eine Liste aller Ihrer Festplatten mit ihrer jeweiligen Kapazität, Verwendung und vielem mehr.


3
Probiere es mit sudo aus, sonst druckt es einfach nichts.
Alfe

10

blockdev --getsize /dev/sda


Verwenden Sie mit sudo, sonst erhalten Sie Permission denied.
Wimateeka

9

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

7
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 catund Gabel (ausgenommen bash) mit wegoptimiert werden bash, ksh93und zshmit:

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

5

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.

Wenn Sie nach der Größe des Raw-Laufwerks suchen, benötigen Sie root-Berechtigungen, um die Datei zu öffnen und bis zum Ende zu suchen.
Edward Falk

5

Das blockdev (8) hat eine andere Antwort? Optionen --getszund veraltete --getsizesind nicht dasselbe.

  • BLKSSZGET ( blockdev --getss) ist für die physische Sektorgröße und
  • BLKBSZGET ( blockdev --getbsz) ist für die logische Sektorgröße.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

Eigentlich denke ich, dass Sie diese umgekehrt haben. (Es sei denn, mein System verfügt über physikalische 512-Byte-Blöcke und logische 4096-Byte-Blöcke.)
Edward Falk

2
Nun, mir ist klar geworden, dass die block/ioctl.cKernelquelle 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 )
Palec

@Palec Wissensreichster Kommentar unter allen Antworten und Kommentaren zu dieser Frage.
Irfan Latif

5

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/cdromwird 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/cdromnur 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/sr0in 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/sizewird jedoch nicht funktionieren, da / dev / cdrom nur ein symbolischer Link ist

Der dfvon 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:

  • die Gesamtgröße des Geräts, einschließlich dessen, was für die interne Organisation verwendet wird. In der Regel entspricht dies der Größe der Datei, die abgerufen wird, wenn sie mit dem Befehl vollständig kopiert wird dd.
  • Die Größe des verfügbaren Speicherplatzes (möglicherweise nur im schreibgeschützten Modus) für den Benutzer, wenn er bereitgestellt wird, ist immer geringer. Das ist die Größe, die der Befehl angibt df.

uptick für $ / sbin / blockdev --getss / dev / cdrom # DVD Sektorgröße
Peterretief

Sie sagen 512k, meinen aber nur 512 Byte Sektoren.
Tom Hale

3

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.

Analogie: Anzahl Flaschen in Kisten.
Bildbeschreibung hier eingeben


Das ist die richtige Antwort.
Karl Morrison

1

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:

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


0

Ist /sys/block/sda/sizein 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


1
Missbrauch von Behauptungen: Wenn Sie Behauptungen deaktivieren, treten die notwendigen Nebenwirkungen nicht mehr auf.
Alfe


0
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]#

bash können Berechnungen Inline tun: echo $(( $(blockdev ...)/1024 )). Beachten Sie auch, --getbszgibt die Größe des Blocks, nicht die Größe des Geräts.
Mwfearnley


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

Ich finde es sehr nützlich als alle diese Standard-Tools oder Proc-Einträge


-3
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.


5
Das ist nur, wenn das Dateisystem gemountet ist.
Lfaraone

2
Hier geht es nicht darum, Geräteplatz zu blockieren, sondern es wird Ihnen benutzten und nutzbaren Speicherplatz für bereitgestellte Dateisysteme zur Verfügung gestellt, die sich zufällig auf / dev / sda befinden. Was ist mit nicht partitioniertem Speicherplatz? Was ist, wenn Sie mehrere Partitionen haben?
Kbyrd
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.