Визначте розмір блокового пристрою


134

Як я можу дізнатися розмір блокового пристрою, наприклад /dev/sda? Біг ls -lне дає корисної інформації.


Розуміння розміру блоку: wiki.linuxquestions.org/wiki/Block_size
Еліптичний вигляд

2
Знаючи, що я запізнився на 9 років, я думаю, ви знайдете відповідь командою lsblk .
Адіт Я.

Відповіді:


72

fdiskне розуміє макет розділів, використовуваний моїм Mac під управлінням Linux, а також будь-який інший формат розділів, не входять у ПК. (Так, mac-fdiskдля старих таблиць розділів Mac і gdiskдля нових таблиць розділів GPT є, але це не єдині інші макети розділів.)

Оскільки ядро ​​вже сканувало макети розділів, коли блок-пристрій прийшов у роботу, чому б не запитати його безпосередньо?

$ cat / proc / розділи
найголовніша назва #blocks

   8 16 390711384 сдб
   8 17 514079 sdb1
   8 18 390194752 sdb2
   8 32 976762584 зд
   8 33 514079 sdc1
   8 34 976245952 sdc2
   8 0 156290904 сда
   8 1 514079 сда1
   8 2 155774272 sda2
   8 48 1465138584 сдд
   8 49 514079 sdd1
   8 50 1464621952 sdd2

Це не працює для таких речей, як компакт-диски
Ганеш Сіттампалам

2
А також повідомляє лише про "рідні" імена. На сервері з iSCSI та / або мультипутком та / або LVM ви отримуєте багато та багато пристроїв sd * та dm- *, але зазвичай вам потрібно шукати посилання того, що вас насправді цікавить (наприклад, a / dev / mapper / * one)
Лука404

2
Тут наведені значення є кратними 1 Кбіт, що може бути одним сектором (512 байт) занадто малим.
Лекенштейн

1
Це мені було корисно. Я закінчив це робитиawk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
suprjami

173

blockdev --getsize64 /dev/sda повертає розмір у байтах.

blockdev --getsz /dev/sda повертає розмір у 512-байтових секторах.

Застарілий: blockdev --getsize /dev/sdaповертає розмір у секторах.

blockdev є частиною util-linux .


4
на жаль, потрібна сила
суперпользователя

6
@ heinrich5991 у тебе немає вибору. Звичайний користувач не може отримати доступ до блокового пристрою безпосередньо ("необмежене читання"), що добре для безпеки.
Тотор

@Totor Звичайно, але все ж є відповіді на це конкретне питання, які не вимагають ніяких суперкористувацьких прав.
heinrich5991

2
@ heinrich5991 під час роботи з файловими системами слід запитати statfs () та друзів. Що ще важливіше, ви не повинні приймати будь-яку пряму залежність між розміром блокового пристрою та загальним / корисним / ефективним / вільним / будь-яким простором у файловій системі.
Лука404

2
Сторінка, що розміщена на linux.die.net/man/8/blockdev, каже --getsize, що застаріла, і пропонує --getszпослідовні 512-байтові сектори. Якщо це --getsizeпотрібно використовувати, я думаю, --getssтакож слід використовувати, щоб переконатися, що розмір сектору є таким, який ви очікуєте.
mwfearnley

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

Це дає вам його розмір у 512-байтних блоках.


9
@ heinrich5991 Як можна бути впевненим, що розмір блоку пристрою завжди становить 512 байт?
Тотор

5
Розмір сектора завжди становить 512 байт відповідно до джерела . На майбутнє я намагаюся зафіксувати цей інтерфейс документально .
Лекенштейн

Дякую, що ви зрозуміли це. Я помітив, що також є / sys / class / block / sda / queue / logic_block_size. Я не був впевнений, чи варто мені це використовувати, чи константу 512.
Едвард Фолк

33

Цей простий код. Не вдалося знайти жодної документації, але це дуже добре:

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

Виправлення: насправді ви отримуєте розмір у SECTORS. Відредагуйте його, і я піднесу пропозицію.
JCCyC

8
@JCCyC: BLKGETSIZE64повертає розмір у байтах. Дивіться linux/fs.h, що відзначає "повернути розмір пристрою в байтах". Зауважте, що BLKGETSIZE(немає "64") повертає його "/ 512".
Танатос

Я розробив більш повний зразок, почасти на основі цього на stackoverflow.com/a/48490543/446106 . Для використання вищевказаного фрагмента тут fileповинен бути дескриптор файлу (наприклад, з open()), і file_size_in_bytesповинен бути a size_t.
mwfearnley

(Насправді file_size_in_bytesмає бути 64-бітний тип, так і має бути unsigned long long.)
mwfearnley

16

Як щодо:

fdisk -l

Це дасть вам список усіх ваших дисків з їх відповідною ємністю, використанням та ін.


3
Спробуйте це з судо, інакше воно просто нічого не надрукує.
Альфе

10

blockdev --getsize /dev/sda


Використовуйте з sudo, інакше ви отримаєте Permission denied.
Wimateeka

9

lsblk надає інформацію, яку ви шукаєте, включаючи типи пристроїв та точки монтажу (якщо такі є), з видом на дерево та у читаному для людини форматі.

Тип пристрою означає, що він працює для компакт-дисків, на запитання Ганеша Ситтампалама.

Щоб отримати лише розмір конкретного пристрою в байтах:

lsblk -rbno SIZE /dev/block-device

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

або якщо ви використовуєте bash або будь-яку іншу оболонку, схожу на POSIX, арифметичні оператори якої працюють з 64-бітовими цілими числами, вам навіть не потрібно дзвонити bc

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

дає розмір у байтах.

Виклик catі вилка (за винятком bash) можуть бути оптимізовані геть з bash, ksh93і zshз:

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

5

Немає необхідності в ioctl в C. Просто прагніть до кінця файлу і отримайте розмір (у байтах) таким чином:

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

У blockdev (8) є інша відповідь? Опції --getszта застарілі --getsizeне однакові.

  • BLKSSZGET ( blockdev --getss) призначений для розміру фізичного сектора і
  • BLKBSZGET ( blockdev --getbsz) призначений для розміру логічного сектора.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

Насправді, я думаю, у вас це змінилися. (Якщо в моїй системі немає 512-байтних фізичних блоків та 4096-байтних логічних блоків.)
Едвард Фолк

2
Ну, я зрозумів, що block/ioctl.cв джерелі ядра Linux містяться оманливі коментарі. BLKPBSZGET (зверніть увагу на P) набуває розмір фізичного сектора, BLKSSZGET отримує розмір логічного сектора, а BLKBSZGET (або BLKBSZGET_32 в block/compat_ioctl.c) отримує розмір одиниці розподілу файлової системи (кластера). Логічний та фізичний розміри сектору відрізняються, коли використовується Розширений формат 512e. ( 512e @ WP )
Палець

@Palec Найбільш вмілий коментар серед усіх відповідей та коментарів до цього питання.
Ірфан Латиф

5

По-перше, дякую всім, хто зробив свій внесок. Я дізнався кілька корисних речей.

І все-таки мій досвід полягає в тому, що більшість цих відповідей є дещо неповними, принаймні, що стосується компакт-дисків та DVD-дисків, зокрема щодо того, чи вони доступні звичайним користувачам, а не обмежуються суперусером.
Це засновано на тестах мого Linux Mageia 2.

Команди, призначені для суперпользователя, завжди можуть отримати доступ до звичайного користувача, префіксуючи їх за допомогою /sbin/, а іноді і з / usr / sbin /. Тепер вони можуть працювати або не працювати для звичайного користувача.

Багато хто може працювати для звичайного користувача для DVD на DVD-накопичувачі, навіть якщо він не встановлений, тоді як вони не працюватимуть на жорсткому диску (знову ж таки, коли викликаються як звичайний користувач).

Наприклад /sbin/fdisk -l /dev/cdrom, я працюю над моєю системою і надаю "геометрію" DVD-диска в накопичувачі ... що, мабуть, переважно нонсенс. Але це дає розмір DVD у байтах та секторах та правильний розмір сектору (2048 байт, як це зазвичай для DVD).

Те саме стосується і тих /usr/sbin/gdisk -l /dev/cdrom, які надають лише розмір у секторах до 2048 байт.

інші приклади (як некористувач, звичайний користувач)

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

Це працює для DVD-накопичувача, названого тут sr0, оскільки пристрій для нього є насправді /dev/sr0, /dev/cdromбудучи лише символічним посиланням на нього. Розмір наводиться шматками по 1 к.

Аналогічно, як звичайний користувач, команда

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

надасть розмір DVD на пристрої /dev/sr0, в куски 512 байт (як і розмір іншого диска, навіть не встановленого). Однак cat /sys/class/block/cdrom/sizeне вийде, тому що причиною / dev / cdrom є лише символічне посилання

Команда df, запропонована деякими, дає розмір змонтованих розділів, а не цілих дисків. Крім того, для встановленого компакт-диска чи DVD він дає менший, ніж фактичний розмір CD / DVD. Точніше, два різних розміри можуть зацікавити:

  • загальний розмір пристрою, включаючи те, що використовується для його внутрішньої організації. Зазвичай це розмір отриманого файлу, якщо він скопійований цілою командою dd;
  • розмір простору, доступного користувачеві (можливо, лише в режимі лише для читання) користувачеві при його встановленні, який завжди менший. Це розмір, який вказується командою df.

uptick за $ / sbin / blockdev --getss / dev / cdrom # Розмір сектору DVD
peterretief

Ви кажете 512k, але ви маєте на увазі всього 512 байтових секторів.
Том Хейл

3

Блок - це послідовність бітів або байтів із фіксованою довжиною, тобто 512 байт, 4 кБ, 8 кБ, 16 кБ, 32 кБ тощо.

blockdev --getbsz partition

Приклад

# blockdev --getbsz /dev/sda1 
4096

Отже розмір блоку цієї файлової системи становить 4 кБ.

Аналогія: кількість пляшок у ящиках.
введіть тут опис зображення


Це правильна відповідь.
Карл Моррісон

1

Якщо ви використовуєте Node.js, ви можете використовувати цей нативний додаток, щоб отримати розмір блокового пристрою, розмір фізичного сектору та розмір логічного сектора (з підтримкою FreeBSD, Linux, macOS та Windows). У нього також є кілька інших помічників для прямого вводу-виводу:

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


0

Є /sys/block/sda/sizeв розмірі блоку? Якщо так, то який?

У ioctl BLKGETSIZE є та сама проблема, що і в одиницях 512, а не BLKSSZGET . BLKGETSIZE64 вирішує цю неоднозначність. Реальна кількість блоків - 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 */
}

Дивіться http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html


1
Зловживання ствердженням: Якщо ви відключите твердження, ваші необхідні побічні ефекти більше не відбудуться.
Альфе


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

покаже вихід у КБ

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

Баш може зробити розрахунки інлайн: echo $(( $(blockdev ...)/1024 )). Також зверніть увагу, --getbszдає розмір блоку, а не розмір пристрою.
mwfearnley


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

Я вважаю це дуже корисним, ніж усі ці стандартні інструменти чи записи


-3
df -k | grep /dev/sda

дасть вам розмір у КБ (перший номер), а також використаний простір (друге число) та доступний простір (третє число)


5
Це лише якщо файлова система змонтована.
lfaraone

2
Це не про блочний простір пристрою, він надасть вам використаний та корисний простір монтованих файлових систем, які трапляються в / dev / sda. Що з нерозподіленим простором? Що робити, якщо у вас є кілька розділів?
kbyrd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.