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

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

113 голосов | спросил lfaraone 22 J0000006Europe/Moscow 2009, 16:49:58

19 ответов


67

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

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

$ cat /proc /разделы
Основное имя #blocks

   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
ответил ephemient 22 J0000006Europe/Moscow 2009, 21:50:35
154

blockdev --getsize64 /dev/sda возвращает размер в байтах.

blockdev --getsize /dev/sda возвращает размер в секторах.

Источник: справочная страница в моей системе Ubuntu.

ответил David 10 Maypm10 2010, 17:32:45
30

Этот простой код. Не удалось найти документацию any , но неплохо выглядит трюк:

#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
ответил 28 AMpWed, 28 Apr 2010 09:56:56 +040056Wednesday 2010, 09:56:56
27
cat /sys/class/block/sda/size

Это дает вам размер в 512-байтных блоках.

ответил 22 FebruaryEurope/MoscowbMon, 22 Feb 2010 11:33:55 +0300000000amMon, 22 Feb 2010 11:33:55 +030010 2010, 11:33:55
13

Как насчет:

fdisk -l

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

ответил Wadih M. 22 J0000006Europe/Moscow 2009, 16:53:23
9

blockdev --getsize /dev/sda

ответил Vi. 2 AMpFri, 02 Apr 2010 01:08:31 +040008Friday 2010, 01:08:31
7

lsblk предоставляет информацию, которую вы ищете, включая типы устройств и точки монтирования (если есть), с древовидным представлением и в удобном для восприятия человеком формате.

Тип устройства означает, что он работает на CD-дисках, по просьбе Ганеша Ситтампалама.

Чтобы получить размер конкретного устройства в байтах:

lsblk -rbno SIZE /dev/block-device
ответил antonio 28 +04002013-10-28T00:55:46+04:00312013bEurope/MoscowMon, 28 Oct 2013 00:55:46 +0400 2013, 00:55:46
6
echo "`cat /sys/class/block/sda2/size`*512" | bc

, или если вы используете bash или любую другую POSIX-оболочку, чьи арифметические операторы работают с 64-битными целыми числами, вам даже не нужно вызывать bc

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

задает размер в байте.

Вызов cat и fork (кроме bash) можно оптимизировать с помощью bash, ksh93 и zsh с помощью:

echo "$((512*$(</sys/class/block/sda2/size)))"
ответил 18 MaramThu, 18 Mar 2010 01:20:43 +03002010-03-18T01:20:43+03:0001 2010, 01:20:43
4

У блока (8) есть другой ответ? Опции --getsz и устаревшие --getsize не совпадают.

  • BLKSSZGET (blockdev --getss) предназначен для размера физического сектора и
  • BLKBSZGET (blockdev --getbsz) предназначен для размера логического сектора.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
ответил 26 PMpThu, 26 Apr 2012 16:48:46 +040048Thursday 2012, 16:48:46
3

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

Тем не менее, мой опыт заключается в том, что большинство из этих ответов несколько неполный, по крайней мере, где речь идет о 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 байт.

другие примеры (как не root, обычный пользователь)

$ /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 является только символической ссылкой на него. Размер указан в кусках 1k.

Аналогично, как обычный пользователь, команда

$ 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 3 Maypm13 2013, 16:54:51
2

Нет необходимости в 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 9 +04002012-10-09T13:31:35+04:00312012bEurope/MoscowTue, 09 Oct 2012 13:31:35 +0400 2012, 13:31:35
2

Блок представляет собой последовательность бит или байтов с фиксированной длиной, т.е. 512 байт, 4kB, 8kB, 16kB, 32kB и т. д.

blockdev --getbsz partition

Пример

# blockdev --getbsz /dev/sda1 
4096

Таким образом, размер блока этой файловой системы составляет 4 КБ.

Аналогия: количество бутылок в ящиках.
 введите описание изображения здесь>> </a> </p></body></html>

ответил Premraj 20 AMpThu, 20 Apr 2017 06:25:22 +030025Thursday 2017, 06:25:22
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

ответил 26 PMpThu, 26 Apr 2012 15:07:44 +040007Thursday 2012, 15:07:44
0

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

Попробуйте.

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

Вот краткое описание того, что он делает: http://slashzeroconf.wordpress.com/2009/02/09/ЕМС-Inq-утилита /

ответил user1684122 2 AMpTue, 02 Apr 2013 05:38:09 +040038Tuesday 2013, 05:38:09
0
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'

Мне это очень полезно, чем все эти стандартные инструменты или записи proc

ответил SHW 6 52015vEurope/Moscow11bEurope/MoscowFri, 06 Nov 2015 13:36:35 +0300 2015, 13:36:35
0
echo "`blockdev --getbsz /dev/sdc`/1024"|bc

отобразит вывод в KB

[[email protected] datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[[email protected] datadg2]#
ответил Urvesh RHCE 3 FebruaryEurope/MoscowbWed, 03 Feb 2016 17:35:16 +0300000000pmWed, 03 Feb 2016 17:35:16 +030016 2016, 17:35:16
0

Если вы используете Node.js, вы можете использовать этот собственный add для получения размера блока устройства, размера физического сектора и размера логического сектора (с поддержкой FreeBSD, Linux, macOS и Windows). Он также имеет несколько других помощников для выполнения прямого ввода-вывода:

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

ответил Joran Greef 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 27 Sep 2017 11:09:32 +0300 2017, 11:09:32
0

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

sudo parted -l /dev/sda

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

ответил Vicente Adolfo Bolea Sánchez 31 J000000Tuesday18 2018, 21:02:12
-1
df -k | grep /dev/sda

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

ответил 22 J0000006Europe/Moscow 2009, 16:53:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132