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.
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.
@ 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.
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:
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.
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:
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:
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.
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.)
@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)
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.
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/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 */
}
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
0
Einfacher:
sudo parted -l /dev/sda
Ist für mich am einfachsten zu merken und zu tippen
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?
Antworten:
fdisk
versteht weder das Partitionslayout, das von meinem Mac unter Linux verwendet wird, noch irgendein anderes Nicht-PC-Partitionsformat. (Ja, es gibtmac-fdisk
alte Mac-Partitionstabellen undgdisk
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.
quelle
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 .
quelle
--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.Dies gibt Ihnen die Größe in 512-Byte-Blöcken.
quelle
Dieser einfache Code. Konnte keine Dokumentation finden, aber macht den Trick gut:
quelle
BLKGETSIZE64
die Größe in Bytes zurück. Sehen Sielinux/fs.h
, welche Hinweise "Gerätegröße in Bytes zurückgeben". Beachten Sie, dassBLKGETSIZE
(keine "64") "/ 512" zurückgibt.file
muss es sich um einen Dateideskriptor (z. B. fromopen()
) handeln undfile_size_in_bytes
sollte a seinsize_t
.file_size_in_bytes
sollte es ein 64-Bit-Typ sein, so sollte es seinunsigned long long
.)Wie wäre es mit:
Auf diese Weise erhalten Sie eine Liste aller Ihrer Festplatten mit ihrer jeweiligen Kapazität, Verwendung und vielem mehr.
quelle
blockdev --getsize /dev/sda
quelle
sudo
, sonst erhalten SiePermission denied
.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:
quelle
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
gibt die Größe in Byte an.
Der Aufruf an
cat
und Gabel (ausgenommenbash
) mit wegoptimiert werdenbash
,ksh93
undzsh
mit:quelle
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:
quelle
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.quelle
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 inblock/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)
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
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). Diescat /sys/class/block/cdrom/size
wird jedoch nicht funktionieren, da / dev / cdrom nur ein symbolischer Link istDer
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
.quelle
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.
Beispiel
Die Blockgröße dieses Dateisystems beträgt also 4 KB.
Analogie: Anzahl Flaschen in Kisten.
quelle
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
quelle
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 .
Siehe http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
quelle
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/
quelle
Zeigt die Ausgabe in KB an
quelle
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
quelle
Ich finde es sehr nützlich als alle diese Standard-Tools oder Proc-Einträge
quelle
Gibt die Größe in KB (erste Nummer) sowie den verwendeten Speicherplatz (zweite Nummer) und den verfügbaren Speicherplatz (dritte Nummer) an.
quelle