it-swarm-eu.dev

Určete velikost blokového zařízení

Jak zjistím velikost blokového zařízení, například /dev/sda? Běh ls -l neposkytuje žádné užitečné informace.

138
lfaraone

fdisk nerozumí rozvržení diskových oddílů používaných mým Macem se systémem Linux ani jiným formátem diskových oddílů mimo PC. (Ano, existuje mac-fdisk pro staré tabulky oddílů Mac a gdisk pro novější tabulku oddílů GPT, ale nejsou to jediná další rozložení oddílů.)

Protože jádro již při testování blokovacího zařízení prohledávalo rozložení oddílů, proč se na to přímo zeptat?

 $ 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 
74
ephemient

blockdev --getsize64 /dev/sda vrací velikost v bajtech.

blockdev --getsz /dev/sda vrací velikost v 512bajtových sektorech.

Zastaralé: blockdev --getsize /dev/sda vrací velikost v sektorech.

blockdev je součástí til-linux .

177
David
cat /sys/class/block/sda/size

To vám dává jeho velikost v 512 bytových blocích.

35
Angus

Tento jednoduchý kód. Nelze najít libovolno dokumentaci, ale trik pěkně:

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

Co takhle:

fdisk -l

To vám poskytne seznam všech vašich disků s jejich příslušnou kapacitou, využití a další.

17
Wadih M.

blockdev --getsize /dev/sda

10
Vi.

lsblk poskytuje informace, které hledáte, včetně typů zařízení a přípojných bodů (pokud existují), se stromovým pohledem a ve formátu čitelném člověkem.

Typ zařízení znamená, že funguje pro jednotky CD, jak to požaduje Ganesh Sittampalam.

Chcete-li získat pouze velikost konkrétního zařízení v bajtech:

lsblk -rbno SIZE /dev/block-device
9
antonio
echo "`cat /sys/class/block/sda2/size`*512" | bc

nebo pokud používáte bash nebo jakýkoli jiný POSIX-jako Shell, jehož aritmetické operátory pracují s 64bitovými celými čísly, nemusíte ani volat bc

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

dává velikost v bajtech.

Volání cat a vidlice (s výjimkou bash) lze optimalizovat pomocí bash, ksh93 a zsh with:

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

Blockdev (8) má jinou odpověď? Možnosti --getsz a zastaralé --getsize nejsou stejné.

  • BLKSSZGET (blockdev --getss) je pro velikost fyzického sektoru a
  • BLKBSZGET (blockdev --getbsz) je pro velikost logického sektoru.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
5

Není potřeba ioctl v C. Jen se snažte na konec souboru a získejte velikost (v bajtech) tímto způsobem:

/* 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.
5
mpartel

Nejprve děkuji všem, kteří přispěli. Naučil jsem se pár užitečných věcí.

Přesto mám zkušenost, že většina těchto odpovědí je poněkud neúplná, alespoň pokud jde o disky CD a DVD, zejména pokud jde o to, zda jsou dostupné běžným uživatelům, nikoli omezeny na superuživatele.
Toto je založeno na testech na mém Linux Mageia 2.

K příkazům určeným pro superuživatele může vždy přistupovat normální uživatel jejich předponou /sbin/, nebo někdy s/usr/sbin /. Nyní mohou nebo nemusí pracovat pro běžného uživatele.

Mnoho z nich může pracovat pro běžného uživatele pro DVD na jednotce DVD, i když není připojeno, zatímco pro pevný disk nebude fungovat (opět při vyvolání jako běžný uživatel).

Například /sbin/fdisk -l /dev/cdrom bude pracovat na mém systému a bude dávat "geometrii" DVD v jednotce ... což je zřejmě většinou nesmysl. Ale dává velikost DVD v bajtech a sektorech a správnou velikost sektoru (2048 bajtů, jak je obvyklé pro DVD).

Totéž platí o /usr/sbin/gdisk -l /dev/cdrom, které uvádějí pouze velikost v sektorech 2048 bytů.

další příklady (jako uživatel bez oprávnění root, běžný uživatel)

$ /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
...

Funguje to pro jednotku DVD, zde nazývanou sr0, protože zařízení pro něj je ve skutečnosti /dev/sr0, /dev/cdrom je pouze symbolickým odkazem. Velikost je uvedena v kusy 1k.

Podobně jako normální uživatel příkaz

$ cat /sys/class/block/sr0/size
10651008

dá velikost DVD na zařízení /dev/sr0, v kouscích 512 bytů (stejně jako velikost jiného disku, i když není připojen). Nicméně cat /sys/class/block/cdrom/size nebude fungovat, protože/dev/cdrom je pouze symbolický odkaz

Příkaz df, navrhovaný některými, udává velikost připojených oddílů, nikoli celých disků. Navíc pro připojené CD nebo DVD dává menší než skutečná velikost CD/DVD. Přesněji řečeno, existují dvě odlišné velikosti, o které by se mohl zajímat:

  • celková velikost zařízení, včetně toho, co se používá pro jeho vnitřní organizaci. Obvykle se jedná o velikost souboru získaného, ​​pokud je celý zkopírován příkazem dd;
  • velikost prostoru, který má uživatel k dispozici (možná pouze v režimu jen pro čtení), když je připojen, což je vždy menší. To je velikost, která je označena příkazem df.
5
babou

Blok je sekvence bitů nebo bajtů s pevnou délkou, tj. 512 bajtů, 4kB, 8kB, 16kB, 32kB atd.

blockdev --getbsz partition

Příklad

# blockdev --getbsz /dev/sda1 
4096

Velikost bloku tohoto systému souborů je tedy 4 kB.

Analogie: počet lahví v bednách.
enter image description here

3
Premraj

Pokud používáte Node.js, můžete pomocí tohoto nativního doplňku získat velikost blokového zařízení, velikost fyzického sektoru a velikost logického sektoru (s podporou FreeBSD, Linux, macOS a Windows). Má také několik dalších pomocníků pro provádění přímého IO:

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

1
Joran Greef

Je /sys/block/sda/size ve velikosti bloku? Pokud ano, který?

Ioctl [~ # ~] blkgetsize [~ # ~] má stejný problém jako v jednotkách 512, spíše než [~ # ~] blksszget [~ # ~] . BLKGETSIZE64 řeší tuto dvojznačnost. Skutečný počet bloků je 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 */
}

Viz http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html

0
echo "`blockdev --getbsz /dev/sdc`/1024"|bc

zobrazí výstup v KB

[[email protected] datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[[email protected] datadg2]#
0
Urvesh RHCE
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'

Považuji to za velmi užitečné než všechny ty standardní nástroje nebo proc položky

0
SHW

Jednoduše:

Sudo parted -l /dev/sda

Je pro mě nejjednodušší zapamatovat si a napsat

0
Vicente Bolea

Existuje nástroj EMC s názvem inq, který poskytuje informace o všech typech blokových zařízení, jako jsou místní připojená zařízení, SAN atd.).

Vyzkoušej to.

ftp://ftp.emc.com/pub/symm3000/inquiry/

Zde je krátký popis toho, co dělá: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/

0
user1684122

Pokud jej chcete najít programově v jazyce C, použijte pokladní kód balíčku util-linux - https://github.com/karelzak/util-linux/blob/master/lib/blkdev.c#L81

NEBO to je také užitečné - http://www.linuxproblem.org/art_20.html (Kód funguje na verzi jádra Linuxu 5.0.0-32-generic.)

Oba tyto kódy používají systémové volání ioctl.

0
gkr2d2