Linux API/linux

statvfs() 의 f_bavail과 f_bfree 차이

구차니 2024. 2. 15. 17:42

해당 함수의 리턴은 아래 구조체를 사용하는데

f_blocks / f_bfree / f_bavail 로 구성되고

free와 available 이라는 미묘~하게 겹치는 비슷한 의미를 지닌 단어로 지칭되는 변수가 두개가 존재한다.

           struct statvfs {
               unsigned long  f_bsize;    /* Filesystem block size */
               unsigned long  f_frsize;   /* Fragment size */
               fsblkcnt_t     f_blocks;   /* Size of fs in f_frsize units */
               fsblkcnt_t     f_bfree;    /* Number of free blocks */
               fsblkcnt_t     f_bavail;   /* Number of free blocks for unprivileged users */
               fsfilcnt_t     f_files;    /* Number of inodes */
               fsfilcnt_t     f_ffree;    /* Number of free inodes */
               fsfilcnt_t     f_favail;   /* Number of free inodes for nprivileged users */
               unsigned long  f_fsid;     /* Filesystem ID */
               unsigned long  f_flag;     /* Mount flags */
               unsigned long  f_namemax;  /* Maximum filename length */
           };

[링크 : https://blog.naver.com/gauya/220573174198]

 

간단하게 프로그램을 짜서 실행해보면

#include <sys/statvfs.h>
#include <stdio.h>

int main() {
struct statvfs sv;
statvfs("/app/data",&sv);

long total, usabe;
double frate;

total = ((long long)sv.f_blocks * sv.f_bsize / 1024);
usabe = ((long long)sv.f_bavail * sv.f_bsize / 1024);
frate = ((double)sv.f_bavail * 100.) / (double)sv.f_blocks;

printf("%ld %ld %ld\n",
sv.f_blocks,
sv.f_bavail,
sv.f_bfree);

printf("%ld %ld %.1f\n", total, usabe, frate);
printf("%f\n",(sv.f_blocks - sv.f_bavail) * 100.0 / sv.f_blocks);
}

 

아래와 같이 나오는데

# df;./arm.o 
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/mmcblk2p9  50500092 1322852  46579560   3% /app/data
12625023 11644890 12294310
50500092 46579560 92.2
7.763416

 

값을 4k block -> 1k block 으로 변환해서 계산하면 아래와 같이 block / avail / free 값이 나온다.

df 의 used는 block - avail이 아니라 block - free 용량이라..

blocks avail free
12,625,023 11,644,890 12,294,310
50,500,092 46,579,560 49,177,240
  3,920,532 (block - avail) 1,322,852 (block - free)

 

그럼 avail과 free는 무슨 차이일까? 저기.. unprivileged users의 의미가 도대체 멀까...

               fsblkcnt_t     f_blocks;   /* Size of fs in f_frsize units */
               fsblkcnt_t     f_bfree;    /* Number of free blocks */
               fsblkcnt_t     f_bavail;   /* Number of free blocks for unprivileged users */