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 */ |