Określ rozmiar urządzenia blokowego


Odpowiedzi:


72

fdisknie rozumie układu partycji używanego przez mój komputer Mac z systemem Linux ani żadnego innego formatu partycji innej niż PC. (Tak, istnieją mac-fdiskstare tabele partycji Mac i gdisknowsze tabele GPT, ale to nie jedyne dostępne układy partycji).

Ponieważ jądro już skanowało układ partycji, kiedy urządzenie blokowe weszło do użytku, dlaczego nie zapytać go bezpośrednio?

$ 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

Nie działa to w przypadku napędów CD
Ganesh Sittampalam

2
A także raportuje tylko „rodzime” nazwy. Na serwerze z iSCSI i / lub wielościeżkowym i / lub LVM dostajesz mnóstwo urządzeń sd * i dm- *, ale zwykle musisz wyszukać dowiązanie symboliczne tego, którym naprawdę jesteś zainteresowany (np. A / dev / mapper / * one)
Luke404

2
Podane tutaj wartości są wielokrotnościami 1 kB, co może być o jeden sektor (512 bajtów) za mały.
Lekensteyn,

1
To mi się przydało. Skończyło się na tymawk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
suprjami

173

blockdev --getsize64 /dev/sda zwraca rozmiar w bajtach.

blockdev --getsz /dev/sda zwraca rozmiar w sektorach 512-bajtowych.

Przestarzałe: blockdev --getsize /dev/sdazwraca rozmiar w sektorach.

blockdev jest częścią util-linux .


4
niestety potrzebuje mocy superużytkownika
heinrich5991

6
@ heinrich5991 nie masz wyboru. Normalny użytkownik nie może uzyskać bezpośredniego dostępu do urządzenia blokowego („surowego odczytu” go), co jest dobre dla bezpieczeństwa.
Totor

@Totor Pewnie, ale istnieją odpowiedzi na to konkretne pytanie, które nie wymagają żadnych uprawnień superużytkownika.
heinrich5991

2
@ heinrich5991 podczas pracy z systemami plików powinieneś zapytać statfs () i przyjaciół. Co ważniejsze, należy nie ponoszą żadnej bezpośredniej relacji pomiędzy wielkością urządzenia blokowego i całkowita / użytkowa / skuteczne / free / cokolwiek miejsca na systemie plików.
Łukasza 404

2
Strona podręcznika linux.die.net/man/8/blockdev mówi, że --getsizejest przestarzała i sugeruje --getszspójne sektory 512-bajtowe. Jeśli --getsizetrzeba go użyć, myślę, że --getssnależy go również użyć, aby upewnić się, że rozmiar sektora jest zgodny z oczekiwaniami.
mwfearnley

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

To daje ci rozmiar w 512-bajtowych blokach.


9
@ heinrich5991 Jak możesz być pewien, że rozmiar bloku urządzenia wynosi zawsze 512 bajtów?
Totor

5
Rozmiar sektora wynosi zawsze 512 bajtów według źródła . W przyszłości staram się udokumentować ten interfejs .
Lekensteyn,

Dziękuję za wyjaśnienie. Zauważyłem, że istnieje także / sys / class / block / sda / queue / logical_block_size. Nie byłem pewien, czy powinienem tego użyć, czy stałej 512.
Edward Falk

33

Ten prosty kod. Nie można znaleźć żadnej dokumentacji, ale robi to dobrze:

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

Korekta: faktycznie daje ci rozmiar w SEKTORACH. Edytuj go, a ja głosuję.
JCCyC

8
@JCCyC: BLKGETSIZE64zwraca rozmiar w bajtach. Zobacz linux/fs.h, która z notatek „zwraca rozmiar urządzenia w bajtach”. Zauważ, że BLKGETSIZE(brak „64”) zwraca to „/ 512”.
Thanatos

Opracowałem pełniejszą próbkę częściowo na tej podstawie na stackoverflow.com/a/48490543/446106 . Aby użyć powyższego fragmentu tutaj, filemusi być deskryptorem pliku (np. Z open()) i file_size_in_bytespowinien być size_t.
mwfearnley

(Właściwie file_size_in_bytespowinien to być typ 64-bitowy, więc powinien być unsigned long long.)
mwfearnley 28.01.2018

16

Co powiesz na:

fdisk -l

Spowoduje to wyświetlenie listy wszystkich dysków z ich odpowiednią pojemnością, wykorzystaniem i nie tylko.


3
Wypróbuj z sudo, w przeciwnym razie po prostu nic nie wydrukuje.
Alfe

10

blockdev --getsize /dev/sda


Używaj z sudo, w przeciwnym razie dostaniesz Permission denied.
Wimateeka,

9

lsblk zawiera informacje, których szukasz, w tym typy urządzeń i punkty instalacji (jeśli istnieją), z widokiem drzewa i w formacie czytelnym dla człowieka.

Typ urządzenia oznacza, że ​​działa on dla napędów CD, zgodnie z pytaniem Ganesh Sittampalam.

Aby uzyskać rozmiar konkretnego urządzenia tylko w bajtach:

lsblk -rbno SIZE /dev/block-device

7
echo "`cat /sys/class/block/sda2/size`*512" | bc

lub jeśli używasz bash lub innej powłoki podobnej do POSIX, której operatory arytmetyczne działają z 64-bitowymi liczbami całkowitymi, nawet nie musisz dzwonić bc

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

podaje rozmiar w bajtach.

Wywołanie cati widelec (z wyjątkiem bash) może być optymalizowane na sucho bash, ksh93a zshw:

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

5

Nie trzeba używać ioctl w C. Po prostu przejdź do końca pliku i uzyskaj w ten sposób rozmiar (w bajtach):

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

Jeśli szukasz rozmiaru surowego dysku, będziesz potrzebować uprawnień administratora root, aby otworzyć plik i przejść do końca.
Edward Falk

5

Blockdev (8) ma inną odpowiedź? Opcje --getszi przestarzałe --getsizenie są takie same.

  • BLKSSZGET ( blockdev --getss) dotyczy rozmiaru sektora fizycznego i
  • BLKBSZGET ( blockdev --getbsz) dotyczy logicznego rozmiaru sektora.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

Właściwie myślę, że masz je odwrócone. (Chyba, że mój system ma 512-bajtowych bloków i fizyczne 4096-bajtowych bloków logicznych.)
Edward Falk

2
Cóż, zdałem sobie sprawę, że block/ioctl.cw jądrze Linuksa źródło zawiera mylące komentarze. BLKPBSZGET (zwróć uwagę na P) dostaje rozmiar sektora fizycznego, BLKSSZGET dostaje logiczny rozmiar sektora, a BLKBSZGET (lub BLKBSZGET_32 in block/compat_ioctl.c) otrzymuje rozmiar jednostki alokacji systemu plików (klastra). Rozmiar sektora logicznego i fizycznego różni się, gdy używany jest Advanced Format 512e. ( 512e @ WP )
Palec

@Palec Najbardziej kompetentny komentarz spośród wszystkich odpowiedzi i komentarzy do tego pytania.
Irfan Latif

5

Po pierwsze, dziękuję wszystkim, którzy się przyczynili. Nauczyłem się kilku przydatnych rzeczy.

Mimo to z mojego doświadczenia wynika, że ​​większość tych odpowiedzi jest nieco niekompletna, przynajmniej jeśli chodzi o dyski CD i DVD, zwłaszcza jeśli chodzi o to, czy są one dostępne dla zwykłych użytkowników, a nie tylko dla administratora.
Jest to oparte na testach na moim Linux Mageia 2.

Polecenia przeznaczone dla superużytkownika mogą być zawsze dostępne dla zwykłego użytkownika, poprzedzając je /sbin/, lub czasem / usr / sbin /. Teraz mogą, ale nie muszą działać dla zwykłego użytkownika.

Wiele może działać dla zwykłego użytkownika dla DVD na napędzie DVD, nawet jeśli nie jest on zamontowany, podczas gdy nie będą działać na dysku twardym (ponownie, gdy zostanie wywołany jako zwykły użytkownik).

Na przykład /sbin/fdisk -l /dev/cdrombędzie działał na moim systemie i poda „geometrię” DVD w napędzie ... co jest najwyraźniej bzdurą. Ale daje rozmiar DVD w bajtach i sektorach oraz poprawny rozmiar sektora (2048 bajtów, jak zwykle w przypadku DVD).

To samo dotyczy /usr/sbin/gdisk -l /dev/cdrom, które dają tylko rozmiar w sektorach o wielkości 2048 bajtów.

inne przykłady (jako użytkownik inny niż root, zwykły użytkownik)

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

Działa to w przypadku napędu DVD, tutaj nazywanego sr0, ponieważ tak naprawdę jest to urządzenie /dev/sr0, które /dev/cdromjest jedynie dowiązaniem symbolicznym. Rozmiar podawany jest w kawałkach po 1 tys.

Podobnie, jak zwykły użytkownik, polecenie

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

poda rozmiar DVD na urządzeniu /dev/sr0, w kawałkach po 512 bajtów (a także rozmiar innego dysku, nawet niezamontowanego). Jednak cat /sys/class/block/cdrom/sizenie zadziała, ponieważ / dev / cdrom jest tylko dowiązaniem symbolicznym

Polecenie dfsugerowane przez niektórych podaje rozmiar zamontowanych partycji, a nie całych dysków. Ponadto w przypadku zamontowanego dysku CD lub DVD daje mniej niż rzeczywisty rozmiar dysku CD / DVD. Dokładniej, istnieją dwa różne rozmiary, którymi mogą być zainteresowani:

  • całkowity rozmiar urządzenia, w tym rozmiar używany w jego wewnętrznej organizacji. Zazwyczaj jest to rozmiar pliku uzyskanego, jeśli jest on kopiowany w całości za pomocą polecenia dd;
  • rozmiar dostępnego miejsca (prawdopodobnie tylko w trybie tylko do odczytu) dla użytkownika, gdy jest on zamontowany, co zawsze jest mniejsze. Jest to rozmiar wskazany przez polecenie df.

uptick dla $ / sbin / blockdev --getss / dev / cdrom # Rozmiar sektora DVD
peterretief

Mówisz 512k, ale masz na myśli zaledwie 512-bajtowe sektory.
Tom Hale,

3

Blok jest sekwencją bitów lub bajtów o stałej długości, tj. 512 bajtów, 4kB, 8kB, 16kB, 32kB itp.

blockdev --getbsz partition

Przykład

# blockdev --getbsz /dev/sda1 
4096

Zatem rozmiar bloku tego systemu plików wynosi 4kB.

Analogia: liczba butelek w skrzyniach.
wprowadź opis zdjęcia tutaj


To jest poprawna odpowiedź.
Karl Morrison

1

Jeśli używasz Node.js, możesz użyć tego rodzimego dodatku, aby uzyskać rozmiar urządzenia blokowego, rozmiar sektora fizycznego i rozmiar sektora logicznego (z obsługą FreeBSD, Linux, macOS i Windows). Ma także kilku innych pomocników w wykonywaniu bezpośrednich operacji wejścia / wyjścia:

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


0

Ma /sys/block/sda/sizerozmiar bloku? Jeśli tak, to jaki?

Ioctl BLKGETSIZE ma ten sam problem, jak to jest w jednostkach 512 zamiast BLKSSZGET . BLKGETSIZE64 rozwiązuje tę dwuznaczność. Rzeczywista liczba bloków to 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 */
}

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


1
Nadużywanie asercji: Jeśli wyłączysz asercje, twoje niezbędne skutki uboczne nie będą już występować.
Alfe


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

wyświetli dane wyjściowe w KB

[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#

bash może wykonywać obliczenia inline: echo $(( $(blockdev ...)/1024 )). Uwaga: --getbszpodaje rozmiar bloku, a nie rozmiar urządzenia.
mwfearnley


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

Uważam to za bardzo przydatne niż wszystkie te standardowe narzędzia lub wpisy proc


-3
df -k | grep /dev/sda

poda rozmiar w KB (pierwsza liczba), a także wykorzystane miejsce (druga liczba) i dostępne miejsce (trzecia liczba)


5
Dzieje się tak tylko wtedy, gdy system plików jest zamontowany.
lfaraone

2
Nie chodzi o blokowanie miejsca na urządzeniu, zapewni ono używaną i użyteczną przestrzeń dla zamontowanych systemów plików, które zdarzyły się na / dev / sda. Co z przestrzenią niepodzieloną na partycje? Co jeśli masz wiele partycji?
kbyrd,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.