Ответы:
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
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
следует также использовать, чтобы убедиться, что размер сектора соответствует вашим ожиданиям.
cat /sys/class/block/sda/size
Это дает вам его размер в 512-байтовых блоках.
Это простой код. Не могу найти никакой документации, но хорошо справляется с задачей:
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
BLKGETSIZE64
возвращает размер в байтах. Смотрите linux/fs.h
, какие примечания "вернуть размер устройства в байтах". Обратите внимание, что BLKGETSIZE
(без «64») возвращает «/ 512».
file
должен быть дескриптором файла (например, from open()
) и file_size_in_bytes
должен быть size_t
.
file_size_in_bytes
должен быть 64-битный тип, так и должно быть unsigned long long
.)
lsblk
предоставляет информацию, которую вы ищете, включая типы устройств и точки монтирования (если есть), в виде дерева и в удобочитаемом формате.
Тип устройства означает, что он работает для приводов компакт-дисков, как спросил Ганеш Ситтампалам.
Чтобы получить размер определенного устройства в байтах:
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
и вилка (за исключением bash
) могут быть оптимизированы прочь с bash
, ksh93
и zsh
с:
echo "$((512*$(</sys/class/block/sda2/size)))"
Нет необходимости в 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.
У blockdev (8) другой ответ? Параметры --getsz
и устаревшие --getsize
не совпадают.
blockdev --getss
) для размера физического сектора иblockdev --getbsz
) для размера логического сектора.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
в исходных текстах ядра Linux содержатся вводящие в заблуждение комментарии. BLKPBSZGET (обратите внимание, что P) получает размер физического сектора, BLKSSZGET получает размер логического сектора, а BLKBSZGET (или BLKBSZGET_32 in block/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 байтов.
другие примеры (от имени обычного пользователя)
$ /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
.Блок представляет собой последовательность битов или байтов с фиксированной длиной, то есть 512 байтов, 4 КБ, 8 КБ, 16 КБ, 32 КБ и т. Д.
blockdev --getbsz partition
пример
# blockdev --getbsz /dev/sda1
4096
Таким образом, размер блока этой файловой системы составляет 4 КБ.
Если вы используете 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 */
}
См. 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 --getbsz /dev/sdc`/1024"|bc
покажет вывод в КБ
[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
echo $(( $(blockdev ...)/1024 ))
. Также обратите внимание, --getbsz
дает размер блока, а не размер устройства.
Проще говоря:
sudo parted -l /dev/sda
Для меня проще всего запомнить и напечатать
df -k | grep /dev/sda
даст вам размер в килобайтах (первое число), а также используемое пространство (второе число) и доступное пространство (третье число)