Featured image of post [Linux] 디스크 용량 측정 시 심링크(dereference) 포함하기

[Linux] 디스크 용량 측정 시 심링크(dereference) 포함하기

Linux에서 du·df로 디스크 용량을 측정할 때 심링크(symlink)를 따라가 대상의 실제 용량을 반영하는 방법을 설명한다. du -L(모든 심링크 역참조), -D/-H(명령줄 인자만) 옵션 차이, 디렉터리 순회 시 동작, 실전 예제와 중복·순환 링크 주의사항, 참고 문헌을 포함한다.

개요

리눅스·유닉스에서 디스크 용량을 확인할 때 자주 쓰는 명령어는 du(disk usage)와 df(disk free)다. 디렉터리 구조에 심링크(symbolic link)가 많이 들어 있으면, 기본 동작에서는 심링크 자체의 크기(몇 바이트–경로 문자열)만 잡히고, 심링크가 가리키는 실제 파일·디렉터리의 용량은 포함되지 않는다. 백업 용량 추정, 디스크 사용량 감사, 정리 대상 찾기 등에서는 실제 데이터 크기를 알고 싶을 때가 많다. 이 포스트는 용량 측정 시 심링크를 따라가서(dereference) 대상의 실제 용량을 반영하는 방법을 정리한다.

대상 독자: 리눅스·맥에서 du, df를 쓰는 개발자·관리자, 심링크가 많은 디렉터리/마운트 구조를 다루는 사람.


심링크(symlink)란

심볼릭 링크(symbolic link, symlink)는 파일 시스템에서 다른 파일 또는 디렉터리의 경로를 내용으로 갖는 특수 파일이다. 실제 데이터를 복사하는 것이 아니라, “이 경로를 참조한다”는 정보만 저장한다.

  • 하드 링크: 동일 inode를 가리키는 다른 이름. 같은 파일시스템 내, 파일만 가능.
  • 심링크: 경로 문자열을 저장. 디렉터리·다른 파일시스템·없는 경로도 가리킬 수 있음.

용량 측정 관점에서:

  • 심링크 자체의 크기: 경로 문자열 길이 정도(수십 바이트 수준).
  • 심링크가 가리키는 대상의 크기: 수 GB까지 가능.

그래서 du·df로 “실제 쓰는 용량”을 보고 싶다면, 심링크를 따라가서(dereference) 대상의 크기를 세도록 옵션을 주어야 한다.


du에서 심링크 따라가기: -L, -D, -H

du는 지정한 경로 아래의 파일·디렉터리 사용량을 재귀적으로 합산한다. 트리 순회 중 만나는 심링크 처리 방식이 옵션에 따라 다르다.

기본 동작(-P, no-dereference)

  • 디렉터리를 가리키는 심링크따라가지 않는다. 심링크 항목 자체만 보고, 그 안으로 들어가지 않음.
  • 그 결과, 심링크가 가리키는 큰 디렉터리의 용량이 합산에서 빠진다.

-L (–dereference)

  • 모든 심링크를 따라간다. 명령줄에 준 경로가 심링크여도, 트리 순회 중 만나는 심링크도 모두 역참조.
  • “실제 데이터 기준 용량”을 셀 때 가장 많이 쓰는 옵션이다.
1
2
du -L -h /path/to/symlink
du -L -sh /path/to/dir   # 요약만

-D (–dereference-args), -H

  • 명령줄 인자로 준 경로만 심링크면 따라가고, 순회 중 만나는 심링크는 따라가지 않는다.
  • “인자로 준 이름만 논리적 경로로 보고, 나머지는 물리적 트리만 순회”할 때 사용.

비교 요약

옵션명령줄 인자(심링크)순회 중 만난 심링크
기본(-P)따라가지 않음따라가지 않음
-D, -H따라감따라가지 않음
-L따라감따라감

용량 측정 시 심링크까지 모두 반영하려면 **du -L**을 쓰면 된다.


df와 심링크

df파일시스템 단위로 사용 가능·사용 중인 공간을 보여준다. 인자로 경로를 주면, 그 경로가 속한 파일시스템의 통계를 출력한다.

  • 경로가 심링크일 때: 구현에 따라 그 경로를 해석한 최종 대상이 있는 파일시스템을 보여주는 경우가 많다. 즉, 심링크를 따라간 뒤 그 경로가 있는 디바이스/마운트의 사용량이 나온다.
  • “특정 디렉터리 트리 전체가 차지하는 용량”을 알고 싶을 때는 **du**가 맞고, “그 경로가 올라가 있는 디스크의 여유 공간”을 보고 싶을 때 **df**를 쓰면 된다.

동작 방식 흐름 (Mermaid)

du가 심링크를 처리하는 두 가지 방식을 흐름으로 구분하면 아래와 같다.

flowchart LR
  subgraph defaultMode["du 기본 no -L"]
    A1["경로 입력"] --> B1["심링크 만남"]
    B1 --> C1["따라가지 않음"]
    C1 --> D1["심링크 자체 크기만 합산"]
  end
  subgraph derefMode["du -L dereference"]
    A2["경로 입력"] --> B2["심링크 만남"]
    B2 --> C2["대상 경로로 이동"]
    C2 --> D2["대상 파일/디렉터리 용량 합산"]
  end
  • 왼쪽: 기본 동작. 심링크를 만나도 따라가지 않아 실제 데이터 용량이 빠진다.
  • 오른쪽: -L 사용 시. 심링크를 따라가서 대상의 용량이 반영된다.

실전 예제

1. 특정 경로(심링크 포함) 실제 용량 요약

1
du -L -sh /data/project

/data/project가 심링크여도 그 대상 디렉터리 전체의 사용량이 출력된다.

2. 하위 디렉터리별로 보되, 심링크 따라가기

1
du -L -h --max-depth=1 /var

/var 아래 1단계까지 보면서, 심링크가 가리키는 실제 용량이 포함된다.

3. 총합만 한 줄로

1
du -L -sc /home/* | tail -1

각 인자에 대해 합계(-c)를 내고, 마지막 줄이 grand total이다.

4. df로 해당 경로가 올라간 디스크 여유 확인

1
df -h /data/project

/data/project(또는 그 심링크가 가리키는 실제 경로)가 올라간 파일시스템의 사용량·여유가 나온다.


주의사항

  1. 중복 계산: du -L로 디렉터리를 재귀하면, 여러 심링크가 같은 디렉터리를 가리킬 경우 그 디렉터리 용량이 여러 번 더해질 수 있다. “실제 디스크 사용량”보다 큰 값이 나올 수 있음.
  2. 순환 심링크: A → B → A처럼 순환이 있으면, -L 사용 시 따라가다가 같은 곳을 반복 방문할 수 있다. 일부 구현에서는 순환 감지로 에러를 내거나 동작이 달라질 수 있으므로, 이상한 디렉터리 구조에서는 주의.
  3. 다른 파일시스템: 심링크가 다른 마운트를 가리키면, du -L은 그 마운트 안의 용량까지 합산한다. “이 디스크만의 용량”을 보고 싶다면 -x(one-file-system)와 조합해 사용할 수 있다. 예: du -L -x -sh / (루트와 같은 파일시스템만).
  4. 권한: 대상 디렉터리/파일에 읽기 권한이 없으면 해당 부분은 합산되지 않거나 에러가 날 수 있다.

요약

  • 심링크: 실제 파일/디렉터리가 아니라 “경로를 가리키는” 작은 파일이라, 기본 du는 그 작은 크기만 잡고 대상을 세지 않는다.
  • 실제 데이터 기준 용량을 보려면 du -L(또는 --dereference)을 사용해 모든 심링크를 따라가도록 하자.
  • 명령줄 인자만 심링크로 따라가고 싶으면 **-D/-H**를 쓰고, 트리 안의 심링크까지 모두 따라가려면 **-L**을 쓴다.
  • **df**는 “그 경로가 있는 파일시스템의 사용량”을 보는 용도이고, 경로가 심링크면 보통 최종 대상이 있는 디스크 정보가 나온다.
  • 중복 계산·순환 링크·다른 파일시스템·권한을 염두에 두고 해석하면 된다.

참고 문헌

  1. du(1) - Linux manual page — man7.org. -L, -D, -H, -P 등 옵션 설명.
  2. symlink(7) - Linux manual page — man7.org. 심볼릭 링크 처리 규칙, 트리 순회 시 동작.
  3. GNU coreutils - du — GNU coreutils 문서. du invocation 상세.