Wiedząc, że spóźniłem się o 9 lat, zgadnij, że znajdziesz odpowiedź za pomocą polecenia lsblk .
Przyjdź Ya
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?
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.
@ 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.
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:
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.
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:
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:
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.
@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)
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.
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:
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 */
}
Nadużywanie asercji: Jeśli wyłączysz asercje, twoje niezbędne skutki uboczne nie będą już występować.
Alfe
0
Istnieje narzędzie EMC o nazwie, inqktóre podaje informacje o wszystkich typach urządzeń blokowych, takich jak podłączone lokalnie, oparte na sieci SAN itp.
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?
Odpowiedzi:
fdisk
nie 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-fdisk
stare tabele partycji Mac igdisk
nowsze 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?
źródło
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
blockdev --getsize64 /dev/sda
zwraca rozmiar w bajtach.blockdev --getsz /dev/sda
zwraca rozmiar w sektorach 512-bajtowych.Przestarzałe:
blockdev --getsize /dev/sda
zwraca rozmiar w sektorach.blockdev jest częścią util-linux .
źródło
--getsize
jest przestarzała i sugeruje--getsz
spójne sektory 512-bajtowe. Jeśli--getsize
trzeba go użyć, myślę, że--getss
należy go również użyć, aby upewnić się, że rozmiar sektora jest zgodny z oczekiwaniami.To daje ci rozmiar w 512-bajtowych blokach.
źródło
Ten prosty kod. Nie można znaleźć żadnej dokumentacji, ale robi to dobrze:
źródło
BLKGETSIZE64
zwraca rozmiar w bajtach. Zobaczlinux/fs.h
, która z notatek „zwraca rozmiar urządzenia w bajtach”. Zauważ, żeBLKGETSIZE
(brak „64”) zwraca to „/ 512”.file
musi być deskryptorem pliku (np. Zopen()
) ifile_size_in_bytes
powinien byćsize_t
.file_size_in_bytes
powinien to być typ 64-bitowy, więc powinien byćunsigned long long
.)Co powiesz na:
Spowoduje to wyświetlenie listy wszystkich dysków z ich odpowiednią pojemnością, wykorzystaniem i nie tylko.
źródło
blockdev --getsize /dev/sda
źródło
sudo
, w przeciwnym razie dostanieszPermission denied
.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:
źródło
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
podaje rozmiar w bajtach.
Wywołanie
cat
i widelec (z wyjątkiembash
) może być optymalizowane na suchobash
,ksh93
azsh
w:źródło
Nie trzeba używać ioctl w C. Po prostu przejdź do końca pliku i uzyskaj w ten sposób rozmiar (w bajtach):
źródło
Blockdev (8) ma inną odpowiedź? Opcje
--getsz
i przestarzałe--getsize
nie są takie same.blockdev --getss
) dotyczy rozmiaru sektora fizycznego iblockdev --getbsz
) dotyczy logicznego rozmiaru sektora.źródło
block/ioctl.c
w 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 inblock/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 )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/cdrom
bę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)
Działa to w przypadku napędu DVD, tutaj nazywanego
sr0
, ponieważ tak naprawdę jest to urządzenie/dev/sr0
, które/dev/cdrom
jest jedynie dowiązaniem symbolicznym. Rozmiar podawany jest w kawałkach po 1 tys.Podobnie, jak zwykły użytkownik, polecenie
poda rozmiar DVD na urządzeniu
/dev/sr0
, w kawałkach po 512 bajtów (a także rozmiar innego dysku, nawet niezamontowanego). Jednakcat /sys/class/block/cdrom/size
nie zadziała, ponieważ / dev / cdrom jest tylko dowiązaniem symbolicznymPolecenie
df
sugerowane 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:dd
;df
.źródło
Blok jest sekwencją bitów lub bajtów o stałej długości, tj. 512 bajtów, 4kB, 8kB, 16kB, 32kB itp.
Przykład
Zatem rozmiar bloku tego systemu plików wynosi 4kB.
Analogia: liczba butelek w skrzyniach.
źródło
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
źródło
Ma
/sys/block/sda/size
rozmiar 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 .
Zobacz http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
źródło
Istnieje narzędzie EMC o nazwie,
inq
które podaje informacje o wszystkich typach urządzeń blokowych, takich jak podłączone lokalnie, oparte na sieci SAN itp.Wypróbuj to.
ftp://ftp.emc.com/pub/symm3000/inquiry/
Oto krótki opis tego, co robi: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
źródło
wyświetli dane wyjściowe w KB
źródło
echo $(( $(blockdev ...)/1024 ))
. Uwaga:--getbsz
podaje rozmiar bloku, a nie rozmiar urządzenia.Prościej:
sudo parted -l /dev/sda
Jest dla mnie najłatwiejszy do zapamiętania i pisania
źródło
Uważam to za bardzo przydatne niż wszystkie te standardowe narzędzia lub wpisy proc
źródło
poda rozmiar w KB (pierwsza liczba), a także wykorzystane miejsce (druga liczba) i dostępne miejsce (trzecia liczba)
źródło