CentOS 시스템에 700MB의 공간을 차지하는 로그 파일이 있지만(를 사용하여 본 것처럼 ls
), 명령을 실행하면 df -h
파일 시스템(ext4)에서 200MB의 공간만 사용되는 것으로 표시됩니다.
이 차이의 원인은 무엇입니까?
파일이 df 보고서보다 더 많은 공간을 차지할 가능성이 있습니까? 그렇다면 공간을 사용하지 않는 파일을 어떻게 알 수 있습니까?
편집: 빠르게 클릭했는데 다른 게시물이 내 질문에 답변하지 않았습니다. 이것은 문제의 단순화된 형태입니다:
# ls -lh /mnt
total 29M
-rw-r--r-- 1 apache apache 678M Jan 6 10:01 Somelog.log
-rw-r--r-- 1 apache apache 1.1M Jan 1 03:20 Somelog.log-20230101.gz
-rw-r--r-- 1 apache apache 1.1M Jan 2 03:23 Somelog.log-20230102.gz
....etc....
# du -sh /mnt
29M /mnt
전체에 포함되지 않은 파일에 대한 일부 정보를 원하지 않습니다. (파일이 아직 메모리에 있을 때 사용되는 용어는 무엇입니까? 그렇다면)
답변1
ls -l
파일의 겉보기 크기를 표시합니다.즉파일에서 읽을 수 있는 데이터의 양입니다. du
파일이 디스크에서 차지하는 실제 공간을 표시합니다.
귀하의 경우 로그 파일은 희박합니다. 여기에는 27MiB에 가까운 실제 데이터와 약 650MiB의 블록(모두 0)이 포함되어 있습니다. 파일이 기록되는 방식으로 인해 이후 블록은 디스크 공간을 차지하지 않으므로 계산되지 않습니다 du
. 이런 일이 발생하는 방법은 다음과 같습니다.
- 한 프로세스는 650MiB의 실제 데이터가 포함된 로그 파일에 씁니다.
- 로그 파일은 순환되고 지워집니다.
- 초기 프로세스는 로그 파일이 회전되기 전에 쓰기가 완료된 동일한 오프셋에서 동일한 로그 파일에 계속해서 씁니다.
마지막 단계에서는 새 데이터를 추가하기 전에 파일을 적절한 크기로 확장하지만 데이터는 포함하지 않습니다.
이 문제에 대한 해결책은 데몬을 다시 시작하거나 이 메커니즘을 지원하는 경우 로그 파일을 다시 열도록 신호를 보내 쓰기 프로세스가 회전 후 로그 파일을 닫았다가 다시 열도록 하는 것입니다.