df는 모든 파일을 반복하지 않고 얼마나 많은 공간이 사용되는지 어떻게 알 수 있나요?

df는 모든 파일을 반복하지 않고 얼마나 많은 공간이 사용되는지 어떻게 알 수 있나요?

내 이해에 따르면 du폴더의 전체 크기를 얻는 데 사용되는 명령은 각 (하위) 폴더의 각 파일을 열거하고 추가합니다.

yann@p:~$ du /var/log
4   /var/log/ntpstats
...
148 /var/log/apt
564 /var/log/installer
8   /var/log/cups
91748   /var/log

그러나 명령이 어떻게 df즉시 결과를 반환할 수 있습니까?

Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda1       35209808  18707476  14694008  57% /

드라이브의 모든 파일을 열거할 필요가 없습니까?

전체 드라이브에서 사용된 공간을 빠르게 알 수 있는 방법이 있다면, 폴더의 크기를 빠르게 알 수 있는 방법은 없을까요? 아니면 있습니까?

미리 감사드립니다.

답변1

df시스템 호출을 사용 statvfs()하고 파일 시스템에 현재 공간 통계를 요청합니다. 물론 파일 시스템을 관리할 때 파일 시스템에서 사용되는 공간을 항상 추적하기 때문에 속도가 빠릅니다.

그래서 속도가 빠른 이유는 df파일 시스템에서 미리 계산된 캐시 값을 사용하기 때문입니다.

이력은 다음과 같습니다.

1970년대에는 df실제로 원시 디스크 장치에 액세스하고 슈퍼블록에서 파일 시스템 통계를 얻는 suid 루트 프로그램이 있었습니다.

1980년대 중반 SunOS는 시스템 호출 statfs()과 최초의 VFS 구현을 도입했습니다. 이 호출에는 더 이상 권한이 필요하지 않습니다. 이 인터페이스는 Tahoe 회의에서 마지막 SunOS/BSD 코드 교환 중에 *BSD에 제공되었습니다.

1989년에 SVr4/Solaris는 시스템 호출의 이름을 statvfs().이 버전으로 . 이 버전의 시스템 호출이 POSIX에 추가되었으며 다양한 운영 체제에서 인터페이스를 복사했습니다.

df전체 파일 시스템 값만 가지고 있는 슈퍼블록에서 간접적으로 데이터를 얻기 때문에 단일 디렉터리의 번호를 빠르게 얻을 수 있는 방법은 없습니다.

답변2

정상적인 작업의 일부로 파일 시스템은 사용된 데이터 블록과 사용 가능한 데이터 블록의 수를 유지할 수 있습니다. df이 정보를 활용하세요.

파일 시스템이 실시간 카운터를 유지하지 않더라도 새로운 데이터가 기록될 때 여유 블록을 찾는 빠른 방법이 필요하며 동일한 데이터를 사용하여 여유 블록 수를 찾을 수 있습니다.


이론적으로 일부 파일 시스템은 디렉토리별로 사용된 공간 카운터를 유지할 수도 있습니다. 그러나 몇 가지 문제가 있습니다.

전체 하위 트리에 대해 개수가 반복적으로 유지되는 경우 파일 시스템은 사용 개수를 모든 깊이로 전파해야 합니다. 이로 인해 모든 쓰기 작업이 느려질 수 있습니다. 디렉터리에 바로 인접한 파일만 유지하는 경우에도 트리의 전체 크기를 찾으려면 트리를 재귀적으로 순회해야 합니다.

Unix 계열 파일 시스템에서는 하드 링크가 더 큰 장애물입니다. 파일이 여러 디렉터리에서(또는 동일한 디렉터리에서 여러 번) 링크될 수 있는 경우 고유한 상위 디렉터리가 없습니다. 파일 크기는 어디에서 계산해야 합니까? 연결된 모든 디렉터리에서 계산을 수행하면 파일이 여러 번 계산될 수 있으므로 총 사용량이 부풀려집니다. 단 하나의 디렉토리에서만 계산을 수행하는 것도 분명히 잘못된 것입니다.

사실, 전통적인 Unix 파일 시스템의 파일(예: inode)은 자신이 있는 디렉토리조차 모르고 링크 수(가진 이름)만 알 수 있습니다. 대부분의 경우 파일은 주로 이름으로 액세스되므로 이 정보는 필요하지 않습니다. 또한 저장소에서는 inode에 원하는 양의 데이터를 저장해야 하므로 디렉터리에 데이터가 복제됩니다.

관련 정보