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

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

  • Поиск файлов на сервере Unix и сортировка по размеру
  • Измените размер моих страниц памяти?
  • Есть ли способ узнать процент изображений и кода в заданном каталоге?
  • LINUX: Как вычислить рекурсивно размер каждой подкаталога до корневого каталога?
  • ограничение размера файла журнала из переменной
  • Есть ли команда для перечисления сжатых размеров файлов для файлов в .zip-файле?
  • Как найти самые большие открытые файлы?
  • групповые файлы в куски фиксированного размера
  • 18 Solutions collect form web for “Определить размер блочного устройства”

    fdisk не понимает разметку разделов, используемую моим Mac под управлением Linux, а также любой другой формат раздела, отличного от ПК. (Да, есть mac-fdisk для старых таблиц разделов Mac и 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
    

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

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

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

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

     #include <linux/fs.h> ... ioctl(file, BLKGETSIZE64, &file_size_in_bytes); 
     cat /sys/class/block/sda/size 

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

    Как насчет:

     fdisk -l 

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

    blockdev --getsize /dev/sda

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

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

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

     lsblk -rbno SIZE /dev/block-device 
     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)))" 

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

    Тем не менее, мой опыт заключается в том, что большинство из этих ответов несколько неполны, по крайней мере, где речь идет о 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 , в кусках 512k (а также размер другого диска, даже не установленного). Однако cat /sys/class/block/cdrom/size не будет работать / dev / cdrom – это только символическая ссылка

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

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

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

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

    Нет необходимости в 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. 

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

     blockdev --getbsz partition 

    пример

     # blockdev --getbsz /dev/sda1 4096 

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

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

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

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

    Попробуйте.

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

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

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

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

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

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

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

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

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

     df -k | grep /dev/sda 

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

    Linux и Unix - лучшая ОС в мире.