콘텐츠로 이동
Study Note서버 관리 일반

3. 디스크와 파일시스템

“디스크가 찼다”는 신고의 절반은 df와 du가 다른 값을 말하는 상황이다

이 장에서 처음 나오는 말5개
마운트mount
블록 장치(디스크 파티션)를 디렉터리 트리의 한 지점에 붙이는 일. 리눅스에는 드라이브 문자가 없고, 모든 것이 / 아래 어딘가에 붙는다.
inodeindex node
파일 하나의 메타데이터(권한·소유자·크기·데이터 위치)를 담는 구조체. 파일 하나당 하나씩 쓰고 개수가 포맷 시점에 고정된다 — 용량이 남아도 파일 개수 때문에 꽉 찰 수 있다.
LVMLogical Volume Manager
물리 디스크를 풀(볼륨 그룹)로 묶고 거기서 논리 볼륨을 잘라 쓰는 층. 서비스 중단 없이 파일시스템을 늘릴 수 있다 — Ubuntu 서버 기본 설치가 이 구성이다.
ext4 / XFS
리눅스의 대표 파일시스템 둘. Ubuntu 기본은 ext4다. 둘 다 온라인 확장은 되지만 축소는 ext4만 되고 그마저 언마운트가 필요하다 — 파티션은 처음부터 크게 잡지 않는 편이 낫다.
tmpfs
디스크가 아니라 메모리 위에 만드는 파일시스템. /run·/dev/shm이 이것이다. 빠르지만 재부팅하면 사라지고, 많이 쓰면 메모리를 먹는다.
터미널 창
df -hT # 사람이 읽는 단위 + 파일시스템 타입
df -h /var/log # 이 경로가 속한 파일시스템만
df -i # inode 사용량 ← 잊으면 안 되는 두 번째 확인

tmpfs·squashfs(snap) 줄이 시끄러우면 df -hT -x tmpfs -x squashfs로 걷어낸다.

터미널 창
sudo du -xh --max-depth=1 / | sort -rh | head -20 # 루트에서 한 층씩 내려간다
sudo du -sh /var/log # 한 디렉터리 합계
sudo ncdu -x / # 대화형 탐색 (ncdu 패키지) — 가장 편하다

-x(다른 파일시스템으로 넘어가지 않는다)를 반드시 붙인다 — 없으면 /proc·/sys· 네트워크 마운트까지 헤매느라 끝나지 않는다.

증상원인확인
du 합계보다 df 사용량이 훨씬 크다삭제됐지만 프로세스가 붙잡고 있는 파일 (아래)sudo lsof +L1
du가 특정 디렉터리를 못 본다그 위에 다른 파일시스템이 덮어 마운트돼 원본이 가려졌다findmnt
5% 정도 차이ext4의 root 예약 블록(기본 5%). 정상이다tune2fs -l /dev/… | grep Reserved
터미널 창
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS,UUID
findmnt # 마운트 트리 (mount 명령보다 읽기 쉽다)
findmnt /var # 이 경로는 어느 장치인가
blkid # 장치별 UUID와 파일시스템 타입
mount | column -t # 마운트 옵션까지 (rw · noatime · nodev …)
  • /etc/fstab 부팅할 때 자동 마운트할 목록 — 잘못 쓰면 부팅이 멈춘다
  • /etc/mtab → /proc/self/mounts 지금 실제로 마운트된 것
  • /proc/mounts 커널이 보는 원본
  • 디렉터리/run/ tmpfs — 재부팅하면 사라진다
    • …
터미널 창
sudo mount /dev/sdb1 /mnt/data # 임시 (재부팅하면 사라진다)
sudo umount /mnt/data
sudo umount -l /mnt/data # 사용 중이라 안 빠질 때 (지연 언마운트)
sudo fuser -vm /mnt/data # 누가 잡고 있나

영구 마운트는 /etc/fstab에 한 줄을 추가한다. 장치명(/dev/sdb1)이 아니라 UUID를 쓴다 — 디스크 순서는 재부팅하면 바뀔 수 있다.

UUID=1234-abcd /mnt/data ext4 defaults,nofail 0 2

Ubuntu 서버 기본 설치는 LVM을 쓰는데, 설치 마법사가 디스크의 절반 정도만 논리 볼륨에 할당하는 것이 기본이라 “100GB 디스크인데 왜 50GB지?”가 자주 나온다.

터미널 창
sudo pvs && sudo vgs && sudo lvs # 물리 볼륨 · 볼륨 그룹 · 논리 볼륨
sudo vgdisplay ubuntu-vg | grep Free # 볼륨 그룹에 남은 여유
  1. 볼륨 그룹에 여유가 있으면 논리 볼륨을 늘린다 (-r이 파일시스템까지 같이 늘린다)

    터미널 창
    sudo lvextend -l +100%FREE -r /dev/ubuntu-vg/ubuntu-lv
  2. 여유가 없고 디스크에 빈 공간이 있으면 파티션부터 늘린다

    터미널 창
    sudo growpart /dev/sda 3 # 3번 파티션을 디스크 끝까지
    sudo pvresize /dev/sda3 # LVM에 알린다
  3. LVM이 아니면 파티션 확장 후 파일시스템만 늘린다

    터미널 창
    sudo growpart /dev/sda 1
    sudo resize2fs /dev/sda1 # ext4 (XFS는 xfs_growfs /마운트지점)
  4. df -h로 확인. 셋 다 마운트한 채로 온라인 수행이 된다

CPU는 한가한데 서버가 느리면 디스크를 본다.

터미널 창
vmstat 1 5 # wa(iowait) 열이 높으면 I/O 대기
iostat -xz 1 # 장치별 %util · await (sysstat 패키지)
sudo iotop -o # 지금 I/O를 실제로 내는 프로세스 (iotop 패키지)
신호읽는 법
vmstat의 wa가 20% 이상CPU가 디스크를 기다리는 중 — I/O 병목
iostat의 %util 100% 근처그 장치가 포화
await가 수십 ms 이상 (SSD인데)장치 이상 또는 과부하. smartctl도 같이 본다
터미널 창
sudo journalctl --disk-usage # 저널이 얼마나 먹고 있나 (6장)
sudo journalctl --vacuum-time=7d # 7일치만 남긴다
sudo apt clean # /var/cache/apt/archives 비우기
sudo apt autoremove --purge # 안 쓰는 패키지 · 옛 커널
docker system df && docker system prune # 도커가 있다면 대개 여기가 범인
sudo du -xh --max-depth=1 /var | sort -rh | head
  • df -h만 보지 말고 df -i(inode) 를 같이 본다 — 용량이 남아도 꽉 찰 수 있다
  • du는 항상 -x 를 붙인다. 대화형 탐색은 ncdu -x가 제일 빠르다
  • df > du면 삭제됐지만 열려 있는 파일 — lsof +L1, 해결은 서비스 재시작
  • 로그는 rm 대신 truncate -s 0 로 비운다
  • fstab에는 UUID와 nofail, 고친 뒤엔 재부팅 전에 mount -a
  • LVM 확장은 온라인으로 된다 — lvextend -r · growpart + pvresize