Определить размер блочного устройства


134

Как я могу узнать размер блочного устройства, например /dev/sda? Бег не ls -lдает полезной информации.


Понимание размера блока: wiki.linuxquestions.org/wiki/Block_size
эллиптический вид

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

Ответы:


73

fdiskне понимает разметку разделов, используемую моим Mac под управлением Linux, или любой другой формат разделов, кроме ПК (Да, есть mac-fdiskдля старых таблиц разделов Mac и gdiskдля более новой таблицы разделов GPT, но это не единственные другие схемы разделов).

Так как ядро ​​уже просканировало макеты разделов, когда блочное устройство вошло в эксплуатацию, почему бы не задать это напрямую?

$ cat / proc / partitions
имя младшего # блока

   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 сда
   8 1 514079 sda1
   8 2 155774272 sda2
   8 48 1465138584 сдд
   8 49 514079 sdd1
   8 50 1464621952 sdd2

Это не работает для таких вещей, как приводы компакт-дисков
Ганеш Ситтампалам

2
А также только отчеты "родных" имен. На сервере с iSCSI и / или MultiPath и / или LVM вы получаете множество устройств sd * и dm- *, но обычно вам нужно найти символическую ссылку того, что вам действительно интересно (например, a / dev / mapper / * one)
Luke404

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
к сожалению, нужна власть суперпользователя
heinrich5991

6
@ heinrich5991 у тебя нет выбора. Обычный пользователь не может получить доступ к блочному устройству напрямую («читая» его), что хорошо для безопасности.
Тотор

@Totor Конечно, но все же есть ответы на этот конкретный вопрос, которые не требуют никаких прав суперпользователя.
heinrich5991

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

2
Страница man на 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);

Исправление: это на самом деле дает вам размер в секторах. Отредактируйте это, и я буду голосовать.
JCCyC

8
@JCCyC: BLKGETSIZE64возвращает размер в байтах. Смотрите linux/fs.h, какие примечания "вернуть размер устройства в байтах". Обратите внимание, что BLKGETSIZE(без «64») возвращает «/ 512».
Танатос

Я разработал более полный пример, частично основанный на этом, на stackoverflow.com/a/48490543/446106 . Чтобы использовать приведенный выше фрагмент, он fileдолжен быть дескриптором файла (например, from open()) и file_size_in_bytesдолжен быть size_t.
mwfearnley

(На самом деле, это file_size_in_bytesдолжен быть 64-битный тип, так и должно быть unsigned long long.)
mwfearnley

16

Как насчет:

fdisk -l

Это даст вам список всех ваших дисков с указанием емкости, использования и т. Д.


3
Попробуйте с sudo, иначе он просто ничего не печатает.
Alfe


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 in block/compat_ioctl.c) получает размер единицы размещения (кластера) файловой системы. Размер логического и физического секторов различается при использовании расширенного формата 512e. ( 512e @ WP )
Palec

@Palec Самый осведомленный комментарий среди всех ответов и комментариев к этому вопросу.
Ирфан Латиф

5

Во-первых, спасибо всем, кто внес свой вклад. Я узнал несколько полезных вещей.

Тем не менее, мой опыт показывает, что большинство из этих ответов несколько неполны, по крайней мере, в отношении CD и 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, предложенная некоторыми, дает размер смонтированных разделов, а не целых дисков. Кроме того, для смонтированного CD или DVD это дает меньше, чем фактический размер CD / DVD. Точнее, есть два разных размера, которые могут быть интересны:

  • общий размер устройства, включая то, что используется для его внутренней организации. Обычно это размер файла, полученного, если он полностью скопирован с помощью команды dd;
  • размер доступного пространства (возможно, только в режиме только для чтения) пользователю, когда он монтируется, что всегда меньше. Это размер, который указан командой df.

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

Вы говорите 512 Кб, но вы имеете в виду всего 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
Злоупотребление утверждением: если вы отключите утверждения, ваши необходимые побочные эффекты больше не будут происходить.
Alfe

0

Существует служебная программа EMC, inqкоторая предоставляет информацию обо всех типах блочных устройств, таких как локально подключенные, основанные на SAN и т. Д.

Попробуйте это.

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

Вот краткое описание того, что он делает: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/


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.