Получение размера блока через df vs dumpe2fs

Эти два инструмента, кажется, сообщают о разном block

 root@ubuntu-xenial:~# df Filesystem 1K-blocks Used Available Use% Mounted on udev 498588 0 498588 0% /dev tmpfs 101584 3116 98468 4% /run /dev/sda1 10098468 1438288 8643796 15% / tmpfs 507916 0 507916 0% /dev/shm tmpfs 5120 0 5120 0% /run/lock tmpfs 507916 0 507916 0% /sys/fs/cgroup vagrant 343946960 55977016 287969944 17% /vagrant tmpfs 101584 0 101584 0% /run/user/1000 root@ubuntu-xenial:~# dumpe2fs /dev/sda1 | grep -i block | grep -i size dumpe2fs 1.42.13 (17-May-2015) Block size: 4096 Flex block group size: 16 

Более того, команда fdisk сообщает о разном размере sector (не взаимозаменяемы ли термины sector и block ?)

 root@ubuntu-xenial:~# fdisk -l Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x38d40272 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 20971486 20969439 10G 83 Linux Disk /dev/sdb: 10 MiB, 10485760 bytes, 20480 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes 

Я нахожусь на vagrant машине, что важно

… сообщает о разном размере сектора (не взаимозаменяемы ли термины сектор и блок?)

«Блок» использовался для обозначения множества разных вещей. Вы должны посмотреть на конкретный контекст.

df расширяет это, говоря, что «1K-блоки» означают единицы по 1 килобайту, даже когда файловая система (системы) используют блоки разных размеров.

«Сектор» изначально означает размер блока, который использует диск. Но обратите внимание, что ваш fdisk сообщает о двух разных типах размера сектора, «физическом» и «логическом» :-). Таким образом, вы также должны искать контекст здесь. [*]

Каков размер блока файловой системы?

Поскольку первыми инструментами, которые вы упомянули, были df и dumpe2fs , я догадался, что вы, возможно, искали размер блока файловой системы. В этом случае вам нужно значение, которое dumpe2fs показывает как «Размер блока».

dumpe2fs – это специальный инструмент для ext2 / 3/4, но я думаю, что это делает наиболее надежный подход. Тем не менее, это означает, что если вы используете другую файловую систему, вам придется использовать другой инструмент и точно подтвердить, что он использует для «размера блока».

Могут быть некоторые исключения к нормальному размеру блока файловой системы. Совсем недавно ext4 может поддерживать встроенное хранилище данных в inode. То есть файлы меньшего размера, чем определенный размер, могут храниться в его inode, без выделения каких-либо блоков данных вообще. См. Как использовать новую функцию Ext4 Inline Data? (хранение данных непосредственно в inode)

Альтернативный метод запроса: statvfs ()

В качестве альтернативы вы можете запустить stat -f / чтобы показать информацию statvfs() для вашей корневой файловой системы. Здесь обсуждалось: размеры файловой системы stat .

Вывод stat -f включает в себя два разных поля: «Основной размер блока» и «Размер блока» :-).

«Фундаментальный» размер блока – это степень детализации, в которой указывается использование пространства – это относится к df . Вы можете надеяться, что это та же самая гранулярность, которая используется для выделения файлового пространства. По крайней мере, это верно для вашего ext2 / 3/4 и во многих других случаях.

stat утверждает, что другой размер блока должен использоваться “для быстрых передач”. В ext2 / 3/4 эти два размера блоков всегда будут одинаковыми.

Если бы ext2 когда-либо реализовывал fragmentы, такие как UFS из BSD UNIX, эти два размера могли бы отличаться. Это отражено в dumpe2fs всегда показывающем значение «Размер fragmentа», равное «Размер блока». Смотрите, для чего можно использовать f_bsize? (Это похоже на st_blksize?)

В качестве более общего инструмента stat -f может вводить в заблуждение в некоторых случаях.

Это также не очень широко используется; это может увеличить риск. Не помогает, что он сообщает о двух разных значениях, где исходные значения не имеют отношения к родным файловым системам Linux. FWIW, пользователи этого сайта ненавидели мой вопрос с просьбой подтвердить его поведение (ссылка выше). Я обычно предполагаю, что это означает, что они разозлились, потому что никто не знает, как ответить на вопрос.

stat -f – это особенность GNU coreutils. (Это не поддерживается stat из FreeBSD 7.2).

Имеет ли значение «размер блока» для быстрой передачи »?

Это описание может быть актуально для файловых систем, которые реализуют fragmentы. Если они не реализуют «отложенное выделение», может быть более эффективно убедиться, что вы используете буфер записи размером с блок при увеличении длины файла. Как всегда, если вы думаете о внесении изменений для повышения производительности, вы должны стремиться подтвердить это с помощью измерений.

В файловых системах Linux размеры двух блоков будут одинаковыми. В этом случае я не знаю причин использовать это значение для оптимизации.

Чаще всего пользовательскому пространству не нужно слишком беспокоиться о том, чтобы определить размеры вызовов ввода / вывода «для быстрой передачи». Планировщик ввода / вывода может объединить смежные операции ввода / вывода для повышения эффективности. А несинхронизированный ввод-вывод через кеш страниц дает огромные преимущества в производительности за счет кеширования с обратной записью и автоматического опережающего чтения. Вы можете пройти долгий путь, просто используя размер кэша страницы или жестко запрограммировав 4KB :-).

В большинстве передач кеш страниц накладывает минимальный размер для физического ввода-вывода. Размер страницы составляет 4 КБ в большинстве систем, и обычно файловый ввод-вывод проходит через кеш страниц. (Опять же, небольшие файлы – это особый случай. Вернее, последняя страница файла – это особый случай, если размер файла не является кратным 4 КБ).


[*] Например, учитывая современные уровни абстракции, вы можете иногда увидеть поле с размером «сектора», равным 512, на современном диске «расширенного формата», в котором используются физические сектора размером 4 КБ.

Вы не «получаете размер блока через df». Это не показано в выводе вообще.

df перечисляет все файловые системы, их использование и точки монтирования в одном списке – и показанные значения просто относятся к размерам (всего / использовано / доступно), а не к другим отдельным свойствам, таким как тип файловой системы, размер блока и т. д.

По умолчанию единица измерения размера составляет 1 КБ, вы можете изменить ее на 1 МБ или 1 ГБ или на переменную (удобочитаемую).

 $ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/dm-34 25155584 19811668 5343916 79% / $ df --block-size=M Filesystem 1M-blocks Used Available Use% Mounted on /dev/dm-34 24566M 19348M 5219M 79% / $ df --block-size=G Filesystem 1G-blocks Used Available Use% Mounted on /dev/dm-34 24G 19G 6G 79% / $ df -h Filesystem Size Used Avail Use% Mounted on /dev/dm-34 24G 19G 5.1G 79% / 

(Обратите внимание, что -BG разница -BG и -h том, что в столбце Доступно показано 6G против 5.1G . 5.1G размер изменяется в зависимости от размера, поскольку при использовании огромного размера блоков нет дробных блоков).

Что касается файловой системы, она не должна работать в 512-байтных единицах только потому, что устройство хранения работает. Не берите в голову, что у большого количества хранения есть большие сектора в эти дни, но все еще претендует на 512 байтов по причинам совместимости.

не являются ли термины sector и block взаимозаменяемыми?

К сожалению, эти термины используются по-разному в зависимости от контекста.

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

 root@ubuntu-xenial:/proc# blockdev --getbsz /dev/sda 4096 

Конечно, это может отличаться от одного блочного устройства к другому.

В любом случае приведенное выше значение похоже на вывод dumpe2fs