df -h GB 단위로 잘못된 출력을 표시함

df -h GB 단위로 잘못된 출력을 표시함

KB, MB 및 GB에 대한 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이므로 약간 부족하지만 괜찮습니다.
  • 12796048KB = 12.2GB, 12407MB도 12.2GB입니다.

그렇다면 df가 13GB로 표시되는 이유는 무엇입니까?아니면 내가 뭔가를 놓치고 있는 걸까?

전체 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 버전은 info coreutils다음 과 같이 7.4인 것 같습니다.

이 매뉴얼은 GNU 핵심 유틸리티 버전 7.4를 문서화하고 있습니다.

답변1

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추가하는 다음 함수에서 발생할 가능성이 높습니다( 설정 되지 않고 1024를 단위 증분으로 사용하고 SI 스타일 접미사를 인쇄하는 자동 크기 조정이 발생함). 즉 ) 값이 정수가 아닙니다.true1-hhuman_autoscale | human_SI | human_base_1024G

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

일반적으로 이는 서식 지정 시스템의 비효율성과 관련이 있습니다. 예를 들어, 파일의 크기는 12.2g(정확함)일 수 있지만 실제 디스크에서는 13GB의 공간을 차지할 수 있습니다. 그 이유는 "블로킹"는 조각화의 결과입니다.

위키피디아: 파일 길이가 블록 크기의 정수 배수가 아닌 경우가 많아 파일의 마지막 블록이 부분적으로 비어 있기 때문에 내부 조각화로 인해 공간 비효율성이 발생합니다.이렇게 하면 파일당 평균 블록 절반에 해당하는 여유 공간이 생성됩니다.일부 최신 파일 시스템에서는 블록 하위 할당 및 테일 병합이라는 기술을 통해 이 문제를 해결하려고 시도합니다.

편집하다:

매뉴얼 페이지에는 다음과 같이 나와 있습니다.

SIZE는 다음 중 하나일 수 있습니다(또는 선택적으로 뒤에 오는 정수일 수 있음). G, T, P, E, Z, Y의 경우 kB 1000, K 1024, MB 1000*1000, M 1024*1024 등 .

이로 인해 M 대신 MB를 사용하고 있을 수 있으므로 12.796이 표시되며 아마도 13으로 반올림됩니다.

답변3

멀티 테라바이트 파일 시스템에 대한 최근 경험에 따르면 'df -h'의 크기 조정은 혼란스러울 수 있습니다. '전체 크기' 열은 정수로 반올림되고 항상 증가하는 반면 'used' 및 'available' 열은 증가하기 때문입니다. 소수점 이하 1자리까지 스케일링되어 반올림됩니다. 이렇게 하면 전체 크기가 실제보다 거의 전체 '단위'로 표시될 수 있습니다. 그 효과는 MB, GB, TB 등 크기가 작을 때 가장 분명하게 나타납니다.

관련 정보