df와 du란 무엇인가?

Linux에서 제공하는 두 가지 중요한 디스크 공간 확인 도구인 df와 du에 대해 알아보겠습니다.

df 명령어는 리눅스 시스템 전체의 디스크 사용량을 확인할 수 있는 도구입니다. 이 명령어는 파일 시스템별로 마운트된 디스크의 전체 크기, 사용 중인 공간, 사용 가능한 공간, 사용률, 마운트된 위치 등의 정보를 제공합니다.

한편 du 명령어는 특정 디렉토리를 기준으로 디스크 사용량을 확인하는 명령어입니다. 이 명령어는 입력받은 경로(디렉토리 혹은 파일)의 디스크 사용량을 보여줍니다.

df와 du의 차이점

df와 du는 어떤 차이가 있는 걸까요? 이 두 명령어는 사실상 디스크에 대한 계산을 다르게 하기 때문에 결과가 다를 수 있습니다.

df는 파일 시스템의 디스크 블록을 조회하여 총값과 자유 블록의 수를 계산합니다. 반면에 du는 파일 트리를 따라 이동하면서 stat()라는 시스템 호출을 이용하여 각각의 디렉토리, 심볼릭 링크 및 파일에 할당된 블록의 수를 더하여 계산합니다.

이런 계산 방식의 차이 때문에 때때로 df와 du의 출력 결과가 일치하지 않을 수 있습니다.

df와 du의 차이가 발생할 때 해결방법

하지만, 두 명령어의 용량 차이가 매우 큰 경우, 다음과 같은 가능성을 고려해 볼 필요가 있습니다.

첫번째, 파일 디스크립터가 열린 상태에서 파일이 삭제된 경우입니다. 이때 해당 프로세스(데몬)를 재시작 하거나 시스템을 재부팅하여 문제를 해결할 수 있습니다.

두번째, df는 dirty buffer에 있는 용량을 계산에 포함하지만 du는 계산하지 않는 경우입니다. 이 경우 sync 명령어를 실행하여 dirty buffer를 비워 문제를 해결할 수 있습니다.

특정 조건 하에서는 두 명령어의 출력값이 크게 다를 수 있습니다. 예를 들어, 삭제 되지 않고 반환되지 않은 파일이 많다면 df가 더 큰 값을 보여주게 되고, sparse 파일이 많다면 du가 더 큰 값을 보여주게 됩니다.

lsof -n | grep deleted 명령어를 이용하면, 디렉토리 상에서 삭제되었지만 프로세스에서 참조 카운트가 존재하는 파일을 찾을 수 있습니다. 해당 프로세스를 재시작하면 문제를 해결할 수 있습니다.

* 주로 이러한 차이는 Log file에서 발생 하곤 합니다.

결론적으로, 일부 파일이 삭제 되었지만 여전히 프로세스에 의해 열린 상태로 유지되고 있기 때문에 그런 가능성이 큽니다. du의 경우 파일이 더 이상 디렉토리에 연결되어 있지 않으므로 계산하지 않지만 df는 여전히 디스크 공간을 차지하는 것으로 계산 합니다. 따라서 lsof 명령으로 삭제 된 파일을 보유하고 있는 프로세스를 식별하고 종료 해주게 됩니다.

이처럼 몇 가지 방법을 통해 df와 du의 용량 차이를 줄일 수 있습니다. 그러나 여전히 차이가 있는 경우에는 이는 두 명령어의 계산 방식의 차이 때문이라고 볼 수 있습니다. 이런 경우에는 용도에 맞는 도구를 선택하여 사용하는 것이 중요합니다.


또한, 위에서 말씀 드린 것 같이 df와 du의 디스크 사용량 계산 방식과 목적이 다르다는 것을 이해하는 것이 중요합니다. 


참고사이트)

1. redhat : https://www.redhat.com/sysadmin/du-vs-df

2. ostechnix : https://ostechnix.com/understanding-df-and-du-commands-in-linux/

3. cyberciti : https://www.cyberciti.biz/tips/freebsd-why-command-df-and-du-reports-different-output.html