df -h показывает неправильный вывод в ГБ

1192
Anurag Uniyal

Если я перечислю вывод df для КБ, МБ и ГБ, они не совпадают, например

$ df -k |grep xvdb /dev/xvdb1 12796048 732812 11413172 7% /xxx $ df -m |grep xvdb /dev/xvdb1 12497 716 11146 7% /xxx $ df -h |grep xvdb /dev/xvdb1 13G 716M 11G 7% /xxx 
  • 12796048 КБ = 12496,14 МБ, так что слегка отключен, но в порядке
  • 12796048 КБ = 12,2 ГБ, 12407 МБ также составляет 12,2 ГБ

так почему df показывает 13 гб или я что то упускаю?

Вот полный список DF

$ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.5G 1.7G 5.5G 24% / none 5.8G 128K 5.8G 1% /dev none 5.8G 0 5.8G 0% /dev/shm none 5.8G 44K 5.8G 1% /var/run none 5.8G 0 5.8G 0% /var/lock none 5.8G 0 5.8G 0% /lib/init/rw /dev/xvdb1 13G 716M 11G 6% /xxx 

Версия Coreutils кажется 7.4, как info coreutilsпоказывает

Это руководство документирует версию 7.4 основных утилит GNU,

0
Какую версию `coreutils` вы установили? Попробуйте также напечатать строку заголовка `df`, которая показывает единицы измерения. Daniel Beck 11 лет назад 0
@DanielBeck Я добавил df full output, и я использую ubuntu 10.04, как проверить версию coreutils? Anurag Uniyal 11 лет назад 0
@DanielBeck coreutils 7.4 Anurag Uniyal 11 лет назад 0

3 ответа на вопрос

2
Daniel Beck

dfвсегда округляет читабельный вывод ( -hи -H).

Исходя из исходного кода в пакете coreutils, lib/human.hперечисления опций для human_readableфункции, обеспечивающей округление, преобразование единиц и т. Д .:

/* Options for human_readable. */ enum { /* Unless otherwise specified these options may be ORed together. */  /* The following three options are mutually exclusive. */ /* Round to plus infinity (default). */ human_ceiling = 0, /* Round to nearest, ties to even. */ human_round_to_nearest = 1, /* Round to minus infinity. */ human_floor = 2, ... 

Обратите внимание на комментарий: Round to plus infinity (default).

Фактическое округление, скорее всего, происходит в следующей функции human.c, которая добавляет true(то есть 1), если никакая другая опция округления, показанная выше, не установлена ​​(это не -hтолько устанавливает) human_autoscale | human_SI | human_base_1024, что приводит к автоматическому масштабированию с использованием 1024 в качестве приращения единицы и печати суффикса стиля SI, т.е. G) и значение не является целым числом:

static long double adjust_value (int inexact_style, long double value) { /* Do not use the floorl or ceill functions, as that would mean checking for their presence and possibly linking with the standard math library, which is a porting pain. So leave the value alone if it is too large to easily round. */ if (inexact_style != human_round_to_nearest && value < UINTMAX_MAX) { uintmax_t u = value; value = u + (inexact_style == human_ceiling && u != value); }  return value; } 
0
nerdwaller

Как правило, это связано с неэффективностью системы форматирования. Например, файл может быть только 12,2 г (на котором вы правы), но на физическом диске он может занимать 13 ГБ. Это связано с « блокировкой » и является результатом фрагментации.

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

Редактировать :

Страница руководства говорит это:

РАЗМЕР может быть (или может быть целым числом, за которым может следовать) один из следующих: КБ 1000, К 1024, МБ 1000 * 1000, М 1024 * 1024 и т. Д. Для G, T, P, E, Z, Y ,

Это наводит меня на мысль, что он может использовать MB вместо M, так что будет показано 12.796 - округление до 13, возможно.

это не файл, это само устройство + почему бы тогда значения kb и mb не показывали бы одно и то же, даже для файла .8 ГБ дополнительно :) смешно Anurag Uniyal 11 лет назад 0
Обновленный, кажется, нет большого ответа там. Но в зависимости от используемого метода (они предлагают два, которые может использовать программа), он округляется до 12 или 13. nerdwaller 11 лет назад 0
0
Richard Brittain

Мой недавний опыт работы с многотерабайтными файловыми системами заключается в том, что масштабирование в 'df -h' может сбивать с толку, потому что столбец 'total size' округляется до целого числа и всегда вверх, тогда как столбцы 'used' и 'available' масштабируются и округляются до 1 знака после запятой. Это может привести к тому, что общий размер увеличится почти на целую единицу. Эффект наиболее очевиден, когда размер таков, что вы находитесь в небольших количествах - будь то МБ, ГБ или ТБ.

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