Зная, что я опоздал на 9 лет, думаю, вы найдете ответ с помощью команды lsblk .
Адит Я
Ответы:
73
fdiskне понимает разметку разделов, используемую моим Mac под управлением Linux, или любой другой формат разделов, кроме ПК (Да, есть mac-fdiskдля старых таблиц разделов Mac и gdiskдля более новой таблицы разделов GPT, но это не единственные другие схемы разделов).
Так как ядро уже просканировало макеты разделов, когда блочное устройство вошло в эксплуатацию, почему бы не задать это напрямую?
Это не работает для таких вещей, как приводы компакт-дисков
Ганеш Ситтампалам
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возвращает размер в секторах.
@ heinrich5991 у тебя нет выбора. Обычный пользователь не может получить доступ к блочному устройству напрямую («читая» его), что хорошо для безопасности.
Тотор
@Totor Конечно, но все же есть ответы на этот конкретный вопрос, которые не требуют никаких прав суперпользователя.
heinrich5991
2
@ heinrich5991 при работе с файловыми системами вы должны спросить statfs () и друзей. Что еще более важно, вы не должны предполагать какую-либо прямую связь между размером блочного устройства и общим / используемым / эффективным / свободным / любым пространством в файловой системе.
Luke404
2
Страница man на linux.die.net/man/8/blockdev говорит, --getsizeчто устарела, и предлагает --getszдля согласованных 512-байтовых секторов. Если --getsizeнеобходимо использовать, я думаю, --getssследует также использовать, чтобы убедиться, что размер сектора соответствует вашим ожиданиям.
Спасибо за разъяснение. Я заметил, что есть также / sys / class / block / sda / queue / logic_block_size. Я не был уверен, должен ли я использовать это, или постоянную 512.
Эдвард Фальк
33
Это простой код. Не могу найти никакой документации, но хорошо справляется с задачей:
Исправление: это на самом деле дает вам размер в секторах. Отредактируйте это, и я буду голосовать.
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
Это даст вам список всех ваших дисков с указанием емкости, использования и т. Д.
или если вы используете bash или любую другую POSIX-подобную оболочку, чьи арифметические операторы работают с 64-битными целыми числами, вам даже не нужно вызывать bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
дает размер в байтах.
Вызов catи вилка (за исключением bash) могут быть оптимизированы прочь с bash, ksh93и zshс:
Нет необходимости в 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.
@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 байтов.
Это работает для 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.
Если вы используете Node.js, вы можете использовать это собственное дополнение для получения размера блочного устройства, размера физического сектора и размера логического сектора (с поддержкой FreeBSD, Linux, macOS и Windows). У него также есть несколько других помощников для выполнения прямого ввода-вывода:
Находится /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 */
}
Злоупотребление утверждением: если вы отключите утверждения, ваши необходимые побочные эффекты больше не будут происходить.
Alfe
0
Существует служебная программа EMC, inqкоторая предоставляет информацию обо всех типах блочных устройств, таких как локально подключенные, основанные на SAN и т. Д.
Речь идет не о пространстве блочных устройств, оно даст вам используемое и полезное пространство монтируемых файловых систем, которые находятся в / dev / sda. А как насчет неразделенного пространства? Что делать, если у вас есть несколько разделов?
Ответы:
fdisk
не понимает разметку разделов, используемую моим Mac под управлением Linux, или любой другой формат разделов, кроме ПК (Да, естьmac-fdisk
для старых таблиц разделов Mac иgdisk
для более новой таблицы разделов GPT, но это не единственные другие схемы разделов).Так как ядро уже просканировало макеты разделов, когда блочное устройство вошло в эксплуатацию, почему бы не задать это напрямую?
источник
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
blockdev --getsize64 /dev/sda
возвращает размер в байтах.blockdev --getsz /dev/sda
возвращает размер в 512-байтовых секторах.Устаревший:
blockdev --getsize /dev/sda
возвращает размер в секторах.blockdev является частью util-linux .
источник
--getsize
что устарела, и предлагает--getsz
для согласованных 512-байтовых секторов. Если--getsize
необходимо использовать, я думаю,--getss
следует также использовать, чтобы убедиться, что размер сектора соответствует вашим ожиданиям.Это дает вам его размер в 512-байтовых блоках.
источник
Это простой код. Не могу найти никакой документации, но хорошо справляется с задачей:
источник
BLKGETSIZE64
возвращает размер в байтах. Смотритеlinux/fs.h
, какие примечания "вернуть размер устройства в байтах". Обратите внимание, чтоBLKGETSIZE
(без «64») возвращает «/ 512».file
должен быть дескриптором файла (например, fromopen()
) иfile_size_in_bytes
должен бытьsize_t
.file_size_in_bytes
должен быть 64-битный тип, так и должно бытьunsigned long long
.)Как насчет:
Это даст вам список всех ваших дисков с указанием емкости, использования и т. Д.
источник
blockdev --getsize /dev/sda
источник
sudo
, иначе вы получитеPermission denied
.lsblk
предоставляет информацию, которую вы ищете, включая типы устройств и точки монтирования (если есть), в виде дерева и в удобочитаемом формате.Тип устройства означает, что он работает для приводов компакт-дисков, как спросил Ганеш Ситтампалам.
Чтобы получить размер определенного устройства в байтах:
источник
или если вы используете bash или любую другую POSIX-подобную оболочку, чьи арифметические операторы работают с 64-битными целыми числами, вам даже не нужно вызывать
bc
дает размер в байтах.
Вызов
cat
и вилка (за исключениемbash
) могут быть оптимизированы прочь сbash
,ksh93
иzsh
с:источник
Нет необходимости в ioctl на C. Просто найдите конец файла и получите размер (в байтах) следующим образом:
источник
У blockdev (8) другой ответ? Параметры
--getsz
и устаревшие--getsize
не совпадают.blockdev --getss
) для размера физического сектора иblockdev --getbsz
) для размера логического сектора.источник
block/ioctl.c
в исходных текстах ядра Linux содержатся вводящие в заблуждение комментарии. BLKPBSZGET (обратите внимание, что P) получает размер физического сектора, BLKSSZGET получает размер логического сектора, а BLKBSZGET (или BLKBSZGET_32 inblock/compat_ioctl.c
) получает размер единицы размещения (кластера) файловой системы. Размер логического и физического секторов различается при использовании расширенного формата 512e. ( 512e @ WP )Во-первых, спасибо всем, кто внес свой вклад. Я узнал несколько полезных вещей.
Тем не менее, мой опыт показывает, что большинство из этих ответов несколько неполны, по крайней мере, в отношении 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 байтов.другие примеры (от имени обычного пользователя)
Это работает для DVD - диска, здесь называется
sr0
, так как устройство для него на самом деле/dev/sr0
,/dev/cdrom
является лишь символической ссылкой на него. Размер указан в кусках по 1к.Аналогично, как обычный пользователь, команда
даст размер DVD на устройстве
/dev/sr0
, в кусках 512 байт (а также размер другого диска, даже не смонтированного). Однакоcat /sys/class/block/cdrom/size
не будет работать, потому что / dev / cdrom является только символической ссылкойКоманда
df
, предложенная некоторыми, дает размер смонтированных разделов, а не целых дисков. Кроме того, для смонтированного CD или DVD это дает меньше, чем фактический размер CD / DVD. Точнее, есть два разных размера, которые могут быть интересны:dd
;df
.источник
Блок представляет собой последовательность битов или байтов с фиксированной длиной, то есть 512 байтов, 4 КБ, 8 КБ, 16 КБ, 32 КБ и т. Д.
пример
Таким образом, размер блока этой файловой системы составляет 4 КБ.
Аналогия: количество бутылок в ящиках.
источник
Если вы используете Node.js, вы можете использовать это собственное дополнение для получения размера блочного устройства, размера физического сектора и размера логического сектора (с поддержкой FreeBSD, Linux, macOS и Windows). У него также есть несколько других помощников для выполнения прямого ввода-вывода:
https://github.com/ronomon/direct-io
источник
Находится
/sys/block/sda/size
в размере блока? Если да, то какой?IOCTL BLKGETSIZE имеет те же проблемы , как и в единицах 512 , а не BLKSSZGET . BLKGETSIZE64 решает эту неоднозначность. Реальный счетчик блоков - BLKGETSIZE64 / BLKSSZGET .
См. Http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html.
источник
Существует служебная программа EMC,
inq
которая предоставляет информацию обо всех типах блочных устройств, таких как локально подключенные, основанные на SAN и т. Д.Попробуйте это.
ftp://ftp.emc.com/pub/symm3000/inquiry/
Вот краткое описание того, что он делает: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
источник
покажет вывод в КБ
источник
echo $(( $(blockdev ...)/1024 ))
. Также обратите внимание,--getbsz
дает размер блока, а не размер устройства.Проще говоря:
sudo parted -l /dev/sda
Для меня проще всего запомнить и напечатать
источник
Я нахожу это очень полезным, чем все эти стандартные инструменты или записи процедур
источник
даст вам размер в килобайтах (первое число), а также используемое пространство (второе число) и доступное пространство (третье число)
источник