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

Экран должен хорошо работать. Предоставьте больше подробную информацию о том, что Вы делаете. Общие команды:

# reattach session and if necessary detach it first.
# If there is only one session, sessionname is not necessary.
$ screen -rd sessionname

# list available screen sessions
$ screen -ls

Я не уверен, почему Вы используете

$ screen -d

Все это делает отсоединить экранную сессию, если существует только один. Иначе это спросит, какой Вы хотите отсоединить.

Я также нахожу

$ echo $TERM

полезный, чтобы показать, являюсь ли я на самом деле в экране или нет, так как это не всегда очевидно. Если на экране, это возвратится screen. Если бы существуют лучшие способы сделать это, я хотел бы знать о них.

137
22.06.2009, 15:49
20 ответов

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

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

$ cat /proc/partitions
major minor  #blocks  name

   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
73
27.01.2020, 19:29
  • 1
    Это не работает на вещи как исправление –  GS - Apologise to Monica 22.04.2010, 23:30
  • 2
    И также только "собственные" имена отчетов. На сервере с iSCSI и/или многопутевой и/или LVM Вы получаете партии и много sd* и dm -* устройства, но обычно Вам нужна к поиску символьная ссылка той, которая Вы на самом деле интересуетесь (например,/dev/mapper /* один) –  Luke404 30.07.2013, 11:32
  • 3
    Значения, о которых сообщают здесь, являются кратными числами 1 кибибита, который может быть одним сектором слишком маленьких (512 байтов). –  Lekensteyn 26.12.2015, 23:31
  • 4
    Это было полезно для меня. Я закончил тем, что делал awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions –  suprjami 05.08.2016, 06:01

/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

0
27.01.2020, 19:29
  • 1
    суперпользователя, утверждайте: при отключении утверждений необходимых побочных эффектов не будет больше происходить. –  Alfe 20.06.2012, 13:25

blockdev (8) имеет другой ответ? Опции --getsz и удержанный от использования --getsize не то же.

  • BLKSSZGET (blockdev --getss) для физического размера сектора и
  • BLKBSZGET (blockdev --getbsz) для логического размера сектора.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
5
27.01.2020, 19:29
echo "`cat /sys/class/block/sda2/size`*512" | bc

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

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

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

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

echo "$((512*$(</sys/class/block/sda2/size)))"
7
27.01.2020, 19:29

Никакая потребность в 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.
5
27.01.2020, 19:29

blockdev --getsize /dev/sda

10
27.01.2020, 19:29

Как насчет:

fdisk -l

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

16
27.01.2020, 19:29
  • 1
    Попробуйте его sudo, иначе это просто ничего не печатает. –  Alfe 20.06.2012, 13:23

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

#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
35
27.01.2020, 19:29
  • 1
    CD-приводов: это на самом деле получает Вас размер в СЕКТОРАХ. Отредактируйте его, и я буду upvote. –  JCCyC 22.06.2012, 04:14
  • 2
    @JCCyC: BLKGETSIZE64 возвращает размер в байтах. Посмотрите linux/fs.h, который отмечает "размер устройства возврата в байтах". Отметьте это BLKGETSIZE (никакой "64"), возвращает его "/512". –  Thanatos 04.03.2013, 01:26
  • 3
    я разработал более полный образец частично на основе этого по stackoverflow.com/a/48490543/446106. Использовать вышеупомянутый отрывок здесь, file потребности быть дескриптором файла (например, от open()), и file_size_in_bytes должен быть a size_t. –  mwfearnley 28.01.2018, 21:54
  • 4
    (На самом деле, file_size_in_bytes должен быть 64-разрядный тип, таким образом, это должно быть unsigned long long.) –  mwfearnley 28.01.2018, 22:17
cat /sys/class/block/sda/size

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

35
27.01.2020, 19:29

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

blockdev --getsz /dev/sda размер возвратов в 512-байтовых секторах.

Удержанный от использования: blockdev --getsize /dev/sda размер возвратов в секторах.

blockdev является частью util-linux.

177
27.01.2020, 19:29
  • 1
    , к сожалению, нужно Злоупотребление питания –  heinrich5991 03.10.2012, 21:51
  • 2
    @heinrich5991 у Вас нет выбора. Обычный пользователь не может получить доступ к блочному устройству непосредственно ("сырые данные, читая" его), который хорош для безопасности. –  Totor 23.05.2013, 10:38
  • 3
    @Totor Несомненно, но существуют ответы на этот конкретный вопрос, которые не требуют никаких прав суперпользователя. –  heinrich5991 23.05.2013, 10:49
  • 4
    @heinrich5991 при работе с файловыми системами необходимо спросить statfs () и друзья. Что еще более важно, Вы не должны принимать непосредственную связь между размером блочного устройства и общим количеством / применимый / эффективный / свободный / безотносительно пространства в файловой системе. –  Luke404 01.08.2013, 10:24
  • 5
    В странице справочника по linux.die.net/man/8/blockdev говорится --getsize удерживается от использования и предлагает --getsz для последовательных 512-байтовых секторов. Если --getsize должен использоваться, я предполагаю --getss должен также использоваться, чтобы удостовериться, что размер сектора - то, что Вы ожидаете. –  mwfearnley 28.01.2018, 19:49
df -k | grep /dev/sda

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

-3
27.01.2020, 19:29
  • 1
    Это - то, только если файловая система смонтирована. –  lfaraone 22.06.2009, 15:54
  • 2
    Это не о пространстве блочного устройства, оно даст Вам, использованное и применимое пространство файловых систем смонтировало, что, оказывается, находятся на/dev/sda. Что относительно неразделенного пространства? Что, если у Вас есть несколько разделов? –  kbyrd 26.04.2014, 01:01

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

Попробовать.

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

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

0
27.01.2020, 19:29

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

Однако, мой опыт состоит в том, что большинство этих ответов является несколько неполным, по крайней мере, где CD и DVD затронуты, особенно относительно того, доступны ли они обычным пользователям, а не ограниченные суперпользователем.
Это основано на тестах на моем Linux Mageia 2.

К командам, предназначенным для суперпользователя, может всегда получать доступ обычный пользователь путем добавления префикса их с /sbin/, или иногда с/usr/sbin/. Теперь они могут или не могут работать на обычного пользователя.

Многие могут работать, для обычного пользователя, для DVD на DVD-приводе, даже когда он не смонтирован, в то время как они не будут работать на жесткий диск (снова при вызове как обычный пользователь).

Например, /sbin/fdisk -l /dev/cdrom будет работать над моей системой и давать "геометрию" DVD в диске..., который является, по-видимому, главным образом ерундой. Но это действительно дает размер DVD в байтах и в секторах и корректном размере сектора (2 048 байтов, как обычно для DVD).

То же верно для /usr/sbin/gdisk -l /dev/cdrom, которые дают только размер в секторах 2 048 байтов.

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

$ /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.
5
27.01.2020, 19:29
  • 1
    за $/sbin/blockdev - getss/dev/cdrom # размер –  peterretief 05.10.2013, 14:02
  • 2
    Вы говорите, что 512k, но Вы имеете в виду всего 512-байтовые секторы. –  Tom Hale 10.11.2016, 10:06

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

Тип устройства означает, что работает на CD-приводы, как спросил Ganesh Sittampalam.

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

lsblk -rbno SIZE /dev/block-device
9
27.01.2020, 19:29
echo "`blockdev --getbsz /dev/sdc`/1024"|bc

выводит результат в KB

[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
0
27.01.2020, 19:29
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'

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

-1
27.01.2020, 19:29

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

blockdev --getbsz partition

Пример

# blockdev --getbsz /dev/sda1 
4096

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

Аналогия: количество бутылок в ящиках.
enter image description here

5
27.01.2020, 19:29

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

.

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

1
27.01.2020, 19:29

Проще:

sudo parted -l /dev/sda

Мне легче запомнить и напечатать

0
27.01.2020, 19:29

Если вы хотите найти его программно на C, проверьте код утилиты -linux package-https://github.com/karelzak/util-linux/blob/master/lib/blkdev.c#L81

ИЛИ это тоже полезно-http://www.linuxproblem.org/art_20.html(Код работает на версии ядра Linux 5.0.0-32-generic.)

Оба этих кода используют системный вызов ioctl.

0
27.01.2020, 19:29

Теги

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