디스크 사용량 확인
서버 운영에서 디스크 용량 부족은 서비스 장애의 주요 원인입니다. df와 du 명령어로 디스크 상태를 점검합니다.
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는 디렉토리 단위입니다. df와 du의 수치가 다를 수 있는데, 삭제된 파일을 프로세스가 아직 열고 있으면 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)
주요 마운트 옵션입니다.
| 옵션 | 설명 |
|---|---|
| defaults | rw, suid, dev, exec, auto, nouser, async 기본 조합 |
| noatime | 접근 시간 업데이트 비활성화 (성능 향상) |
| nofail | 마운트 실패해도 부팅 계속 (외장 디스크에 유용) |
| ro | 읽기 전용 |
| noexec | 실행 파일 실행 금지 (보안 강화) |
fstab 설정 오류는 부팅 실패를 유발할 수 있습니다. 변경 후 반드시 mount -a로 테스트하고, nofail 옵션을 추가하면 마운트 실패 시에도 부팅이 중단되지 않습니다.
LVM — 논리 볼륨 관리
LVM(Logical Volume Manager)은 물리 디스크를 유연하게 관리할 수 있는 추상 계층입니다. 기존 파일시스템을 실시간으로 확장할 수 있어 서버 운영에 필수적입니다.
LVM의 3계층 구조입니다.
| 계층 | 약자 | 설명 |
|---|---|---|
| Physical Volume | PV | 물리 디스크 또는 파티션 |
| Volume Group | VG | PV를 묶은 스토리지 풀 |
| Logical Volume | LV | VG에서 할당받은 논리 파티션 |
# === 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
lvextend와 resize2fs를 한 번에 실행할 수도 있습니다. 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/fstab에tmpfs /tmp tmpfs defaults,noatime,size=2G 0 0으로 설정합니다. - XFS vs ext4: 대용량 파일과 높은 I/O가 필요한 환경에서는 XFS가 유리합니다. 다만 XFS는 축소(shrink)가 불가능하므로 LVM과 함께 사용할 때 이 점을 고려하세요. ext4는 온라인 축소/확장 모두 지원합니다.