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

Если я перечисляю вывод 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 KB = 12496.14 MB так что это небольшое выключено, но OK
  • 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 core,

11
задан Anurag Uniyal
05.03.2023 21:37 Количество просмотров материала 3340
Распечатать страницу

3 ответа

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

из исходного кода в пакете coreutils,lib/human.h, перечисление вариантов human_readable функция обеспечивая округлять, преобразовывать блока, etc.:

/* 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;
}
2
отвечен Daniel Beck 2023-03-07 05:25

обычно это связано с неэффективностью системы форматирования. Например, файл может быть только 12.2 g (на котором вы правы), но на физическом диске он может занять до 13gb пространства. Это связано с "блокировка" и является результатом фрагментации.

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

Edit:

в MAN-странице говорит, что это:

размер может быть (или может быть целым числом, за которым необязательно следует) одним из fol- lowing: kB 1000, K 1024, MB 1000 * 1000, M 1024*1024, и так далее для G, T, P, E, Z, Y.

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

0
отвечен nerdwaller 2023-03-07 07:42

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

0
отвечен Richard Brittain 2023-03-07 09:59

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх