Jak mogę sprawdzić rozmiar urządzenia blokowego, takiego jak /dev/sda
? Bieganie ls -l
nie daje użytecznych informacji.
Jak mogę sprawdzić rozmiar urządzenia blokowego, takiego jak /dev/sda
? Bieganie ls -l
nie daje użytecznych informacji.
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 i gdisk
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?
$ 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
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 .
--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.
cat /sys/class/block/sda/size
To daje ci rozmiar w 512-bajtowych blokach.
Ten prosty kod. Nie można znaleźć żadnej dokumentacji, ale robi to dobrze:
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
BLKGETSIZE64
zwraca 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”.
file
musi być deskryptorem pliku (np. Z open()
) i file_size_in_bytes
powinien być size_t
.
file_size_in_bytes
powinien to być typ 64-bitowy, więc powinien być unsigned long long
.)
blockdev --getsize /dev/sda
sudo
, w przeciwnym razie dostaniesz Permission 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:
lsblk -rbno SIZE /dev/block-device
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 cat
i widelec (z wyjątkiem bash
) może być optymalizowane na sucho bash
, ksh93
a zsh
w:
echo "$((512*$(</sys/class/block/sda2/size)))"
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.
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.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
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 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 )
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)
$ /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/cdrom
jest 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/size
nie zadziała, ponieważ / dev / cdrom jest tylko dowiązaniem symbolicznym
Polecenie 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
.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.
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/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 .
/*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
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/
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]#
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
df -k | grep /dev/sda
poda rozmiar w KB (pierwsza liczba), a także wykorzystane miejsce (druga liczba) i dostępne miejsce (trzecia liczba)