3. 디스크와 파일시스템
“디스크가 찼다”는 신고의 절반은
df와du가 다른 값을 말하는 상황이다
이 장에서 처음 나오는 말5개
마운트mount- 블록 장치(디스크 파티션)를 디렉터리 트리의 한 지점에 붙이는 일. 리눅스에는 드라이브 문자가 없고, 모든 것이
/아래 어딘가에 붙는다. inodeindex node- 파일 하나의 메타데이터(권한·소유자·크기·데이터 위치)를 담는 구조체. 파일 하나당 하나씩 쓰고 개수가 포맷 시점에 고정된다 — 용량이 남아도 파일 개수 때문에 꽉 찰 수 있다.
LVMLogical Volume Manager- 물리 디스크를 풀(볼륨 그룹)로 묶고 거기서 논리 볼륨을 잘라 쓰는 층. 서비스 중단 없이 파일시스템을 늘릴 수 있다 — Ubuntu 서버 기본 설치가 이 구성이다.
ext4 / XFS- 리눅스의 대표 파일시스템 둘. Ubuntu 기본은 ext4다. 둘 다 온라인 확장은 되지만 축소는 ext4만 되고 그마저 언마운트가 필요하다 — 파티션은 처음부터 크게 잡지 않는 편이 낫다.
tmpfs- 디스크가 아니라 메모리 위에 만드는 파일시스템.
/run·/dev/shm이 이것이다. 빠르지만 재부팅하면 사라지고, 많이 쓰면 메모리를 먹는다.
얼마나 남았나 — df
섹션 제목: “얼마나 남았나 — df”df -hT # 사람이 읽는 단위 + 파일시스템 타입df -h /var/log # 이 경로가 속한 파일시스템만df -i # inode 사용량 ← 잊으면 안 되는 두 번째 확인tmpfs·squashfs(snap) 줄이 시끄러우면 df -hT -x tmpfs -x squashfs로 걷어낸다.
어디가 먹고 있나 — du
섹션 제목: “어디가 먹고 있나 — du”sudo du -xh --max-depth=1 / | sort -rh | head -20 # 루트에서 한 층씩 내려간다sudo du -sh /var/log # 한 디렉터리 합계sudo ncdu -x / # 대화형 탐색 (ncdu 패키지) — 가장 편하다-x(다른 파일시스템으로 넘어가지 않는다)를 반드시 붙인다 — 없으면 /proc·/sys·
네트워크 마운트까지 헤매느라 끝나지 않는다.
df와 du가 다를 때
섹션 제목: “df와 du가 다를 때”| 증상 | 원인 | 확인 |
|---|---|---|
du 합계보다 df 사용량이 훨씬 크다 | 삭제됐지만 프로세스가 붙잡고 있는 파일 (아래) | sudo lsof +L1 |
du가 특정 디렉터리를 못 본다 | 그 위에 다른 파일시스템이 덮어 마운트돼 원본이 가려졌다 | findmnt |
| 5% 정도 차이 | ext4의 root 예약 블록(기본 5%). 정상이다 | tune2fs -l /dev/… | grep Reserved |
무엇이 어디에 붙어 있나
섹션 제목: “무엇이 어디에 붙어 있나”lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS,UUIDfindmnt # 마운트 트리 (mount 명령보다 읽기 쉽다)findmnt /var # 이 경로는 어느 장치인가blkid # 장치별 UUID와 파일시스템 타입mount | column -t # 마운트 옵션까지 (rw · noatime · nodev …)- /etc/fstab 부팅할 때 자동 마운트할 목록 — 잘못 쓰면 부팅이 멈춘다
- /etc/mtab → /proc/self/mounts 지금 실제로 마운트된 것
- /proc/mounts 커널이 보는 원본
디렉터리/run/ tmpfs — 재부팅하면 사라진다
- …
수동 마운트와 fstab
섹션 제목: “수동 마운트와 fstab”sudo mount /dev/sdb1 /mnt/data # 임시 (재부팅하면 사라진다)sudo umount /mnt/datasudo umount -l /mnt/data # 사용 중이라 안 빠질 때 (지연 언마운트)sudo fuser -vm /mnt/data # 누가 잡고 있나영구 마운트는 /etc/fstab에 한 줄을 추가한다. 장치명(/dev/sdb1)이 아니라 UUID를 쓴다 —
디스크 순서는 재부팅하면 바뀔 수 있다.
UUID=1234-abcd /mnt/data ext4 defaults,nofail 0 2늘리기 — LVM과 파티션
섹션 제목: “늘리기 — LVM과 파티션”Ubuntu 서버 기본 설치는 LVM을 쓰는데, 설치 마법사가 디스크의 절반 정도만 논리 볼륨에 할당하는 것이 기본이라 “100GB 디스크인데 왜 50GB지?”가 자주 나온다.
sudo pvs && sudo vgs && sudo lvs # 물리 볼륨 · 볼륨 그룹 · 논리 볼륨sudo vgdisplay ubuntu-vg | grep Free # 볼륨 그룹에 남은 여유-
볼륨 그룹에 여유가 있으면 논리 볼륨을 늘린다 (
-r이 파일시스템까지 같이 늘린다)터미널 창 sudo lvextend -l +100%FREE -r /dev/ubuntu-vg/ubuntu-lv -
여유가 없고 디스크에 빈 공간이 있으면 파티션부터 늘린다
터미널 창 sudo growpart /dev/sda 3 # 3번 파티션을 디스크 끝까지sudo pvresize /dev/sda3 # LVM에 알린다 -
LVM이 아니면 파티션 확장 후 파일시스템만 늘린다
터미널 창 sudo growpart /dev/sda 1sudo resize2fs /dev/sda1 # ext4 (XFS는 xfs_growfs /마운트지점) -
df -h로 확인. 셋 다 마운트한 채로 온라인 수행이 된다
I/O가 병목인가
섹션 제목: “I/O가 병목인가”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 | head3장 요약
섹션 제목: “3장 요약”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
4. 프로세스와 자원지금 무엇이 CPU와 메모리를 먹고 있나 — ps · top · lsof · 시그널 · OOM killer.