df, du - 디스크 공간 확인

각종 서비스들에서 발생하는 로그, 디버그 데이터들은 실패의 원인을 파악하기 위해서는 필수적이다.

그러나 이런 로그들을 디스크에 계속 쌓아나가다 보면, 디스크가 가득 차며 프로세스들이 정상적으로 작동하지 않을 수 있다.

디스크에 공간이 부족할 경우 단순한 편집 작업 등도 불가능한데, 이를 위해 디스크 공간을 확인하는 명령어들이 있다.


df

df 는 시스템에 마운트 되어있는 디스크의 남은 용량을 확인할 때 사용하는 명령어이다.

기본적으로 1024바이트 블록 단위로 출력하며, 파일시스템, 크기, 사용량, 남은 용량, 사용 비율, 마운트 지점 순으로 출력하지만, 옵션을 넣어줌으로써 다른 단위, 다른 순서로도 출력이 가능하다.

USB 등의 이동식 디스크들도 확인이 가능하다.

옵션설명
-h용량의 단위를 사람이 보기 편한 KB, MB, GB 단위로 표시
-B블럭 단위 용량을 다르게 지정하여 표시
-T파일시스템의 유형(ext4, nfs 등)을 같이 출력
-t확인할 파일시스템 유형을 하나 넘겨줌으로써 해당 디스크들만 표시
-x넘겨준 파일시스템을 제외한 나머지 전부를 표시
-a모든 파일시스템 출력(0블록 포함)
-iinode 관련 정보(사용 가능한 inode, 사용률 등) 표시
-P개행 등이 일어나지 않게 POSIX 형태로 표시
–total마지막 줄에 전체 용량을 합쳐서 추가적으로 표시

가장 자주 사용되는 것은 -h 옵션으로, 디스크 상태를 간단하게 모니터링할 때 편하다.

아래는 -t 에 ext4 를 줌으로써, ext4 파일시스템으로 마운트된 디스크들만 출력하며, h 옵션과 T 옵션을 줘서 단위를 GB 로, 파일시스템 종류도 같이 출력하게 하였다.

$ df -Tht ext4
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sda4      ext4  117G   24G   87G  22% /

실제로 사용중인 크기와 사용 가능한 크기의 합이 전체 사이즈와 다른 것을 볼 수 있는데, 이는 파일시스템에서 루트 사용자가 비상 상황을 위한 예비 블럭을 떼어놓기 때문이다.

루트 사용자만이 예비 블록에 쓸 수 있기 때문에, 디스크가 가득 찼을 경우에 루트유저가 파일을 옮기는 등 작업이 가능하다.

ext 기반의 파일시스템에서는 일반적으로 전체 크기의 5% 정도를 예비 블럭으로 예약해놓으며, 이는 아래처럼 확인할 수 있다.

$ sudo tune2fs -l [장치명] | grep -i "Block count"
Block count:              31242240
Reserved block count:     1562112

덜 일반적이지만 고려해야하는 또다른 상황으로는, df 로 확인해봐도 디스크 공간은 충분한데 파일을 생성하지 못하는 경우이다.

이럴 땐 아이노드 상태를 확인해봐야 하는데, 해당 디스크에서 사용할 수 있는 아이노드가 막히게 될 경우 파일을 생성할 수 없기 때문에 아래처럼 i 옵션으로 아이노드를 확인해보는것도 좋다.

아이노드란 파일에 대한 정보를 담는, 파일시스템에서 사용하는 자료구조이다.

$ df -Tit ext4
Filesystem     Type  Inodes  IUsed   IFree IUse% Mounted on
/dev/sda4      ext4 7815168 596431 7218737    8% /


du

Disk Usage 의 약자로, 디렉토리별로 디스크 사용량을 확인할 수 있다.

df로 파일시스템 별 사용량을 확인할 수 있어도, 좀 더 세세하게 어떤 경로에 얼마나 있는지는 따로 확인이 안되기 때문에 du 를 사용하여 경로별로 확인한다.

디폴트 단위는 KB 으로, 예를 들어 4 가 출력되었으면 4KB 라는 뜻이다. 출력 단위는 옵션을 넣어 바꿀 수 있다.

옵션내용
-h사람이 보기 편한 단위로 표시
-s파일 크기의 합계로 표시
-bbyte 단위로 표시
-m단위를 MB 로 표시
-c마지막에 모든 파일의 합계를 추가적으로 표시
-d숫자 n을 넘겨줘서, 하위 n번째 디렉토리까지 표시

개인적으로 가장 많이 사용하는 패턴은 -sh 조합으로, 특정 디렉토리 아래에 있는 파일들의 크기들을 출력해준다.

$ du -sh ~/daily_ps
1.8M	boj
32K	kpsc
12K	poj
72K	programmers
4.0K	README.md
160K	swea

du 결과로 나오는 stdout을 가지고 sort, head, awk 스크립트들을 활용하여 목적에 맞게 확인할 수도 있다.


df 와 du 결과가 다른 경우

간혹 df 결과로는 특정 위치의 사용률이 90퍼센트씩 나오더라도, 실제로 du 로 확인해보면 그만큼 용량이 나오지 않는 경우가 있다.

이는 두 명령어가 용량을 측정하는 방식이 다르기 때문인데, df는 파일시스템의 상태 정보를 기준으로 보여주고, du 는 실제 크기를 보여준다.

어떤 프로세스에서 파일을 열었을 때 파일디스크립션을 잡았다가, 해당 파일이 삭제되었지만 프로세스에서는 계속 잡고 있을 경우, 아직 해당 어플리케이션에서는 접근 가능한 상태로 남고 있기 때문에, df 결과로 용량이 잡히게 되는 것이다.

예를 들어 특정 서비스의 로그파일들이 있을 때, 로그를 단순히 지우기만 할 경우 df 에서는 그대로 잡히고, 해당 서비스를 재시작하거나 멈춰야 df 에 반영이 되는 것이다.

혹은 lsof 명령어를 사용하여 현재 열려있는 파일들, 혹은 grep deleted 로 지워진 상태의 파일들을 확인하여 해당 프로세스를 죽이거나 재시작시킬수도 있다.