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

134

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

lfaraone
источник
Понимание размера блока: 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
ephemient
источник
Это не работает для таких вещей, как приводы компакт-дисков
Ганеш Ситтампалам
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
10

blockdev --getsize /dev/sda

Vi.
источник
Используйте с 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.
mpartel
источник
Если вы ищете размер необработанного диска, вам понадобятся привилегированные привилегированные права доступа, чтобы открыть файл для поиска до конца.
Эдвард Фальк
5

У blockdev (8) другой ответ? Параметры --getszи устаревшие --getsizeне совпадают.

  • BLKSSZGET ( blockdev --getss) для размера физического сектора и
  • BLKBSZGET ( blockdev --getbsz) для размера логического сектора.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
Palec
источник
На самом деле, я думаю, что вы изменили это. (Если в моей системе нет 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.
Babou
источник
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 КБ.

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

Premraj
источник
Это правильный ответ.
Карл Моррисон
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.

Random832
источник
1
Злоупотребление утверждением: если вы отключите утверждения, ваши необходимые побочные эффекты больше не будут происходить.
Alfe
0

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

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

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

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

user1684122
источник
0
echo "`blockdev --getbsz /dev/sdc`/1024"|bc

покажет вывод в КБ

[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
Урвеш RHCE
источник
Баш может сделать расчеты инлайн: echo $(( $(blockdev ...)/1024 )). Также обратите внимание, --getbszдает размер блока, а не размер устройства.
mwfearnley
0

Проще говоря:

sudo parted -l /dev/sda

Для меня проще всего запомнить и напечатать

Висенте Адольфо Болея Санчес
источник
-1
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'

Я нахожу это очень полезным, чем все эти стандартные инструменты или записи процедур

SHW
источник
-3
df -k | grep /dev/sda

даст вам размер в килобайтах (первое число), а также используемое пространство (второе число) и доступное пространство (третье число)


источник
5
Это только если файловая система смонтирована.
lfaraone
2
Речь идет не о пространстве блочных устройств, оно даст вам используемое и полезное пространство монтируемых файловых систем, которые находятся в / dev / sda. А как насчет неразделенного пространства? Что делать, если у вас есть несколько разделов?
kbyrd