Если я перечислю вывод 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 Coreutils

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

3 ответа3

2

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

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

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

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

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

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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .