Linux 디스크 관리 — df, du, LVM, 마운트

디스크 사용량 확인

서버 운영에서 디스크 용량 부족은 서비스 장애의 주요 원인입니다. dfdu 명령어로 디스크 상태를 점검합니다.

df — 파일시스템 사용량

df(disk free)는 마운트된 파일시스템의 전체 사용량을 보여줍니다.

# 사람이 읽기 쉬운 형태로 출력
df -h
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   32G   16G  67% /
# /dev/sdb1       200G  150G   40G  79% /data
# tmpfs           3.9G     0  3.9G   0% /dev/shm

# 특정 경로의 파일시스템 정보
df -h /data
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sdb1       200G  150G   40G  79% /data

# inode 사용량 확인 (작은 파일이 많으면 inode가 먼저 고갈)
df -i
# Filesystem       Inodes  IUsed    IFree IUse% Mounted on
# /dev/sda1      3276800 245678  3031122    8% /

# 파일시스템 타입 표시
df -Th
# Filesystem     Type  Size  Used Avail Use% Mounted on
# /dev/sda1      ext4   50G   32G   16G  67% /
# /dev/sdb1      xfs   200G  150G   40G  79% /data

du — 디렉토리별 사용량

du(disk usage)는 디렉토리와 파일의 실제 사용량을 보여줍니다.

# 현재 디렉토리의 총 사용량
du -sh /opt/my-app/
# 2.3G    /opt/my-app/

# 하위 디렉토리별 사용량 (1단계만)
du -h --max-depth=1 /opt/
# 2.3G    /opt/my-app
# 500M    /opt/backups
# 150M    /opt/scripts
# 2.9G    /opt/

# 용량 큰 순서로 정렬
du -h --max-depth=1 /opt/ | sort -rh
# 2.9G    /opt/
# 2.3G    /opt/my-app
# 500M    /opt/backups
# 150M    /opt/scripts

# 큰 파일 찾기 (100MB 이상)
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# -rw-r--r-- 1 root root 250M Feb 10 backup-old.tar.gz
# -rw-r--r-- 1 deploy deploy 120M Mar 01 access.log.1

# 특정 디렉토리에서 큰 디렉토리 TOP 10
du -h --max-depth=2 /var/ 2>/dev/null | sort -rh | head -10

df는 파일시스템 단위, du는 디렉토리 단위입니다. dfdu의 수치가 다를 수 있는데, 삭제된 파일을 프로세스가 아직 열고 있으면 df에는 여전히 사용 중으로 표시됩니다. 이 경우 해당 프로세스를 재시작하면 공간이 회수됩니다.

파티션 관리

디스크를 파티션으로 나누고 파일시스템을 생성하는 과정입니다.

# 디스크 목록 확인
lsblk
# NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
# sda      8:0    0    50G  0 disk
# └─sda1   8:1    0    50G  0 part /
# sdb      8:16   0   200G  0 disk
# └─sdb1   8:17   0   200G  0 part /data
# sdc      8:32   0   500G  0 disk          ← 새 디스크 (미사용)

# 디스크 상세 정보
sudo fdisk -l /dev/sdc
# Disk /dev/sdc: 500 GiB

# === 새 디스크 파티션 생성 (GPT) ===
# parted로 파티션 생성 (스크립트 친화적)
sudo parted /dev/sdc --script mklabel gpt
sudo parted /dev/sdc --script mkpart primary ext4 0% 100%

# 파일시스템 생성
sudo mkfs.ext4 /dev/sdc1
# mke2fs 1.46.5
# Creating filesystem with 131071744 4k blocks
# Filesystem UUID: a1b2c3d4-e5f6-7890-abcd-ef1234567890

# 마운트 포인트 생성 및 마운트
sudo mkdir -p /mnt/storage
sudo mount /dev/sdc1 /mnt/storage

# 마운트 확인
df -h /mnt/storage
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sdc1       492G   73M  467G   1% /mnt/storage

fstab — 영구 마운트 설정

/etc/fstab에 등록하면 부팅 시 자동으로 마운트됩니다. 디바이스 이름(/dev/sdc1)은 변경될 수 있으므로 UUID를 사용하는 것이 안전합니다.

# 파티션 UUID 확인
sudo blkid /dev/sdc1
# /dev/sdc1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"

# fstab에 추가 (백업 먼저!)
sudo cp /etc/fstab /etc/fstab.backup
# /etc/fstab 형식:
# 장치(UUID)  마운트포인트  파일시스템  옵션  dump  fsck순서
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890  /mnt/storage  ext4  defaults,noatime  0  2
# fstab 변경 후 테스트 (재부팅 없이)
sudo mount -a

# 마운트 확인
mount | grep storage
# /dev/sdc1 on /mnt/storage type ext4 (rw,noatime)

주요 마운트 옵션입니다.

옵션설명
defaultsrw, suid, dev, exec, auto, nouser, async 기본 조합
noatime접근 시간 업데이트 비활성화 (성능 향상)
nofail마운트 실패해도 부팅 계속 (외장 디스크에 유용)
ro읽기 전용
noexec실행 파일 실행 금지 (보안 강화)

fstab 설정 오류는 부팅 실패를 유발할 수 있습니다. 변경 후 반드시 mount -a로 테스트하고, nofail 옵션을 추가하면 마운트 실패 시에도 부팅이 중단되지 않습니다.

LVM — 논리 볼륨 관리

LVM(Logical Volume Manager)은 물리 디스크를 유연하게 관리할 수 있는 추상 계층입니다. 기존 파일시스템을 실시간으로 확장할 수 있어 서버 운영에 필수적입니다.

LVM의 3계층 구조입니다.

계층약자설명
Physical VolumePV물리 디스크 또는 파티션
Volume GroupVGPV를 묶은 스토리지 풀
Logical VolumeLVVG에서 할당받은 논리 파티션
# === LVM 구성 단계 ===

# 1. Physical Volume 생성
sudo pvcreate /dev/sdc /dev/sdd
# Physical volume "/dev/sdc" successfully created.
# Physical volume "/dev/sdd" successfully created.

# PV 확인
sudo pvs
# PV         VG   Fmt  Attr PSize   PFree
# /dev/sdc        lvm2 ---  500.00g 500.00g
# /dev/sdd        lvm2 ---  500.00g 500.00g

# 2. Volume Group 생성 (PV를 묶음)
sudo vgcreate data-vg /dev/sdc /dev/sdd
# Volume group "data-vg" successfully created

# VG 확인
sudo vgs
# VG      #PV #LV #SN Attr   VSize   VFree
# data-vg   2   0   0 wz--n- 999.99g 999.99g

# 3. Logical Volume 생성
# 500GB 크기로 생성
sudo lvcreate -n app-data -L 500G data-vg
# Logical volume "app-data" created.

# VG의 전체 남은 공간 사용
sudo lvcreate -n backup-data -l 100%FREE data-vg

# LV 확인
sudo lvs
# LV          VG      Attr       LSize   Pool
# app-data    data-vg -wi-a----- 500.00g
# backup-data data-vg -wi-a----- 499.99g

# 4. 파일시스템 생성 및 마운트
sudo mkfs.ext4 /dev/data-vg/app-data
sudo mkdir -p /data/app
sudo mount /dev/data-vg/app-data /data/app

LVM 볼륨 확장

서비스 무중단으로 볼륨을 확장하는 과정입니다.

# 새 디스크 추가 → PV 생성 → VG에 추가
sudo pvcreate /dev/sde
sudo vgextend data-vg /dev/sde
# Volume group "data-vg" successfully extended

# LV 확장 (100GB 추가)
sudo lvextend -L +100G /dev/data-vg/app-data
# Size of logical volume data-vg/app-data changed from 500.00 GiB to 600.00 GiB

# 파일시스템 확장 (ext4: 온라인 확장 가능)
sudo resize2fs /dev/data-vg/app-data
# resize2fs: Filesystem at /dev/data-vg/app-data is mounted; on-line resizing required

# xfs 파일시스템인 경우
# sudo xfs_growfs /data/app

# 확장 결과 확인
df -h /data/app
# Filesystem                    Size  Used Avail Use% Mounted on
# /dev/mapper/data--vg-app--data 591G  250G  316G  45% /data/app

lvextendresize2fs를 한 번에 실행할 수도 있습니다. sudo lvextend -r -L +100G /dev/data-vg/app-data에서 -r 옵션이 파일시스템 확장까지 자동 처리합니다.

디스크 상태 모니터링

디스크 장애를 사전에 감지하는 방법입니다.

# SMART 상태 확인 (smartmontools 패키지)
sudo apt install -y smartmontools
sudo smartctl -H /dev/sda
# SMART overall-health self-assessment test result: PASSED

# I/O 통계 확인
iostat -xh 1 3
# Device     r/s     w/s   rkB/s   wkB/s  %util
# sda       10.5    25.3   420.0  1012.0  15.2%
# sdb        0.5     2.1    20.0    84.0   1.5%

# 디스크 사용량 경고 스크립트 (cron에 등록)
#!/bin/bash
THRESHOLD=80
df -h | awk -v threshold="$THRESHOLD" '
  NR>1 && +$5 >= threshold {
    printf "[경고] %s 사용량 %s (마운트: %s)\n", $1, $5, $6
  }
'
# [경고] /dev/sdb1 사용량 79% (마운트: /data)

실전 팁

  • noatime 옵션: 파일 접근 시간 기록을 비활성화하면 디스크 I/O가 줄어듭니다. 대부분의 서버에서 접근 시간 정보는 불필요하므로 noatime을 기본으로 사용하세요.
  • LVM 스냅샷: lvcreate --snapshot 명령으로 LV의 특정 시점 스냅샷을 생성할 수 있습니다. 대규모 업데이트 전에 스냅샷을 만들어 두면 문제 발생 시 즉시 복구가 가능합니다.
  • 디스크 용량 알림: df 출력을 파싱하여 사용량이 80%를 넘으면 Slack/이메일로 알림을 보내는 스크립트를 cron에 등록하세요. 용량 부족으로 서비스가 중단되기 전에 대응할 수 있습니다.
  • tmpfs 활용: 빈번한 임시 파일 I/O는 메모리 기반 파일시스템인 tmpfs를 사용하면 성능이 크게 향상됩니다. /etc/fstabtmpfs /tmp tmpfs defaults,noatime,size=2G 0 0으로 설정합니다.
  • XFS vs ext4: 대용량 파일과 높은 I/O가 필요한 환경에서는 XFS가 유리합니다. 다만 XFS는 축소(shrink)가 불가능하므로 LVM과 함께 사용할 때 이 점을 고려하세요. ext4는 온라인 축소/확장 모두 지원합니다.

이 글이 도움이 되었나요?