statvfs를 사용하여 전체 파일 시스템 크기와 사용 가능한 크기를 가져옵니다.

statvfs를 사용하여 전체 파일 시스템 크기와 사용 가능한 크기를 가져옵니다.

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;

코드에서 statvfsPOSIX 구조를 자신이 만든 구조로 복사하지만 중요한 부분은 124-126그들이 수행하는 작업을 보여주는 줄입니다. f_frsizeif 는 0이 아니고, 그렇지 않으면 using 입니다 f_bsize.

df내 제안은 야생에서 그리고 시간이 지남에 따라 극도로 광범위한 배포가 관찰되었기 때문에 그들의 접근 방식을 복제하는 것입니다 . 누군가가 그것이 틀렸다면 지적해주기를 바랍니다. 이제는 잘못된 값을 보고하고 있습니다.

또한 최신 파일 시스템은 파일 시스템 사용법에 대해 다소 모호한 아이디어를 갖고 있다는 점도 알아야 합니다. btrfs참조 링크 복제본, 할당량 및 스냅샷이 더 이상 정확한 절대값을 제공하지 않는다는 생각이 들었습니다. 이 단계에서는 이를 규칙이 아닌 예외로 간주하고 싶을 수도 있지만 알고 있어야 할 사항입니다.

답변2

Google은 당신의 가장 친한 친구입니다. 결과"f_frsize와 f_bsize의 차이점"
=> "블록 크기가 8KB이고 해당 블록에 1KB 파일을 쓰려고 하면 결국 7KB의 블록 공간을 낭비하게 됩니다. 그런데 최근에 파일 블록의 조각화를 발견했습니다. 같은 상황에서 8KB가 있으면 파일 블록은 조각 크기는 1KB입니다. 1KB 파일은 1개의 조각으로만 채워지고 나머지 7개의 조각은 다른 파일에 사용되므로 블록 공간을 절약할 수 있습니다."
질문에 대한 대답은 f_bsize를 사용하는 것입니다.

관련 정보