나는 항상 /... 시스템 호출에 의해 반환된 필드가 st_blocks
512바이트 단위로 표현된 파일의 디스크 사용량을 가져오는 데 사용된다고 가정합니다.stat()
lstat()
du
조사하다POSIX 사양, 이제 POSIX는 이에 대해 어떠한 보장도 하지 않는다는 것을 알았습니다.perl
자체 stat()
기능 에 대한 문서화또한 이런 가정을 하지 말라고 경고합니다.
st_blksize
그럼에도 불구하고 POSIX에서 알 수 있듯이 이 블록 크기는 반환된 필드와 아무 관련이 없으므로 stat()
다른 곳에서 찾아야 합니다.
GNU du
또는 GNU find
소스 코드를 확인해보면 HP/UX가 1024바이트 단위를 사용한다는 증거가 보입니다. GNU는 항상 여러 개의 512바이트 단위를 제공하도록 출력을 find
조정하는데 -printf %b
, 이것이 혼란의 원인이 될 수 있습니다.
st_blocks
512바이트 단위로 표현 되지 않는 다른 Unix 계열 시스템이 아직 사용되고 있습니까 ? POSIX에서 제안한 대로 파일 시스템에 따라 달라질 수 있습니까? HP/UX NFS 공유를 마운트하면 문제가 해결될 것 같습니다.
답변1
st_blksize
이를 사용된 단위에 관계없이 "최적 I/O 크기"라고 합니다 st_blocks
. 물론 최적의 I/O 크기는 파일 시스템에 따라 다릅니다. 이는 fast filesystem
1981/1982년 Berlekey 개발의 결과입니다. 이전에는 사용 가능한 파일 시스템 중 최적의 블록 크기가 없었습니다.
st_blocks
단위로 표현하면 DEV_BSIZE
실제로 HP-UX에서는 1024입니다. DEV_BSIZE
플랫폼별 상수입니다. 나중에 FFS
이름이 바뀌었을 때 UFS
간접 블록과 관련하여 다른 동작을 갖고 이 새로운 stat()
필드가 필요한 두 번째 파일 시스템이 BSD UNIX에 나타났습니다. 이전에는 du
파일 시스템의 간접 블록에 대한 알고리즘만 알고 있었습니다.
df
HP-UX NFS 파일 서버 및 기타 NFS 클라이언트를 실행하는 경우 HP가 지난 15년 동안 문제를 해결했고 최신 버전의 HP에 액세스할 수 없는 경우가 아니면 HP-UX NFS 서버로부터 오류 보고서를 받게 됩니다. - UX. 내가 아는 한 다른 UNIX에는 유사한 NFS 관련 버그가 없습니다.
참고: NFSv3까지 NFS는 블록 크기를 512로 가정했으며 HP는 서버에서 NFS 보고를 변환해야 했습니다. NFSv4에서는 이러한 암시적인 가정을 하지 않지만 HP-UX는 여전히 잘못된 숫자를 보고합니다.
내가 아는 한, 다른 어떤 UNIX도 1024를 기반으로 하지 않습니다 DEV_BSIZE
.