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 */
...
원천:https://man7.org/linux/man-pages/man3/statvfs.3.html
따라서 파일 시스템의 전체 크기를 얻으려면 f_blocks * f_frsize
주석에 f_blocks
" 단위" f_frsize
크기 라고 나와 있으므로 원하는 것 같습니다. 그러나 f_bfree
사용 가능한 블록 수는 다음과 같습니다. 그렇다면 무료 파일 시스템 크기를 사용하려면 를 사용해야 합니까 f_bsize
, 아니면 f_frsize
다시 사용해야 합니까?
답변1
블록 조각화는 일부 레거시 파일 시스템의 파일 시스템 기능인 것으로 보입니다(Google 검색에 따르면 UFS와 JFS가 이 기능을 사용하는 것으로 나타났습니다).
조각 크기는 조각에 허용되는 최소 값을 나타내는 것으로 보이며 1에서 사이여야 합니다 f_bsize
.
이를 지원하지 않는 파일 시스템에서는 f_bsize
블록의 추가 조각화가 지원되지 않으므로 이 값은 0(또는 0, 아래 참조)과 같아야 합니다.
소스 코드를 확인하면 coreutils
(적어도 Redhat 기반 시스템에서) GNU가 어떻게 작동하는지 알 수 있습니다 df
.~해야 한다다양한 UNIX(Linux뿐만 아니라)를 사용하여 다양한 POSIX 의미 체계를 처리하기 위해 이 문제를 해결하는 방법에 대해 상당히 확실한 조언을 제공해야 합니다.
존재하다lib/fsusage.c
120 if (statvfs (file, &vfsd) < 0)
121 return -1;
122
123 /* f_frsize isn't guaranteed to be supported. */
124 fsp->fsu_blocksize = (vfsd.f_frsize
125 ? PROPAGATE_ALL_ONES (vfsd.f_frsize)
126 : PROPAGATE_ALL_ONES (vfsd.f_bsize));
127
128 fsp->fsu_blocks = PROPAGATE_ALL_ONES (vfsd.f_blocks);
129 fsp->fsu_bfree = PROPAGATE_ALL_ONES (vfsd.f_bfree);
130 fsp->fsu_bavail = PROPAGATE_TOP_BIT (vfsd.f_bavail);
131 fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (vfsd.f_bavail) != 0;
132 fsp->fsu_files = PROPAGATE_ALL_ONES (vfsd.f_files);
133 fsp->fsu_ffree = PROPAGATE_ALL_ONES (vfsd.f_ffree);
134 return 0;
코드에서 statvfs
POSIX 구조를 자신이 만든 구조로 복사하지만 중요한 부분은 124-126
그들이 수행하는 작업을 보여주는 줄입니다. f_frsize
if 는 0이 아니고, 그렇지 않으면 using 입니다 f_bsize
.
df
내 제안은 야생에서 그리고 시간이 지남에 따라 극도로 광범위한 배포가 관찰되었기 때문에 그들의 접근 방식을 복제하는 것입니다 . 누군가가 그것이 틀렸다면 지적해주기를 바랍니다. 이제는 잘못된 값을 보고하고 있습니다.
또한 최신 파일 시스템은 파일 시스템 사용법에 대해 다소 모호한 아이디어를 갖고 있다는 점도 알아야 합니다. btrfs
참조 링크 복제본, 할당량 및 스냅샷이 더 이상 정확한 절대값을 제공하지 않는다는 생각이 들었습니다. 이 단계에서는 이를 규칙이 아닌 예외로 간주하고 싶을 수도 있지만 알고 있어야 할 사항입니다.
답변2
Google은 당신의 가장 친한 친구입니다. 결과"f_frsize와 f_bsize의 차이점"
=> "블록 크기가 8KB이고 해당 블록에 1KB 파일을 쓰려고 하면 결국 7KB의 블록 공간을 낭비하게 됩니다. 그런데 최근에 파일 블록의 조각화를 발견했습니다. 같은 상황에서 8KB가 있으면 파일 블록은 조각 크기는 1KB입니다. 1KB 파일은 1개의 조각으로만 채워지고 나머지 7개의 조각은 다른 파일에 사용되므로 블록 공간을 절약할 수 있습니다."
질문에 대한 대답은 f_bsize를 사용하는 것입니다.