디스크 관리
Linux 디스크 파티션, 파일시스템, LVM, RAID 구성 및 관리 완벽 가이드
Linux 디스크 파티션, 파일시스템, LVM, RAID 구성 및 관리 완벽 가이드
목표: 스토리지 아키텍처를 설계하고 복잡한 디스크 문제를 해결할 수 있는 수준 [!warning] 실습 주의
fdisk,parted,mkfs,wipefs계열 명령은 디스크 데이터를 손상시킬 수 있다. 반드시 테스트 VM/빈 디스크/스냅샷 환경에서만 실행한다.
💾 디스크 기초
디스크 장치 명명 규칙
| 패턴 | 설명 | 예시 |
|---|---|---|
/dev/sd* | SCSI/SATA 디스크 | /dev/sda, /dev/sdb |
/dev/nvme*n* | NVMe 디스크 | /dev/nvme0n1 |
/dev/vd* | 가상 디스크 (KVM) | /dev/vda |
/dev/xvd* | 가상 디스크 (Xen) | /dev/xvda |
/dev/hd* | IDE 디스크 (레거시) | /dev/hda |
파티션 번호
/dev/sda1 # 첫 번째 파티션
/dev/sda2 # 두 번째 파티션
/dev/sda5 # 첫 번째 논리 파티션 (확장 내)
🔧 파티션 관리
lsblk — 블록 장치 정보
lsblk # 기본 트리 출력
lsblk -f # 파일시스템 정보 포함
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,UUID
lsblk -p # 전체 경로
lsblk -b # 바이트 단위
fdisk — MBR 파티션 (레거시)
sudo fdisk -l # 모든 디스크 목록
sudo fdisk /dev/sdb # 파티션 편집
fdisk 대화형 명령:
| 명령 | 기능 |
|---|---|
m | 도움말 |
p | 파티션 테이블 출력 |
n | 새 파티션 |
d | 파티션 삭제 |
t | 파티션 유형 변경 |
a | 부팅 플래그 설정 |
w | 변경 저장 |
q | 종료 (저장 안함) |
gdisk / sgdisk — GPT 파티션
sudo gdisk /dev/sdb # 대화형
sudo gdisk -l /dev/sdb # 목록만
sgdisk -p /dev/sdb # 파티션 테이블 출력
sgdisk -n 1:0:+100G /dev/sdb # 100GB 파티션 생성
sgdisk -d 1 /dev/sdb # 파티션 삭제
parted — 고급 파티션 도구
# 대화형
sudo parted /dev/sdb
# 비대화형
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary ext4 0% 100%
sudo parted /dev/sdb print
sudo parted /dev/sdb rm 1
# 파티션 크기 조정
sudo parted /dev/sdb resizepart 2 500GB
📁 파일시스템
주요 파일시스템 비교
| 파일시스템 | 특징 | 사용처 |
|---|---|---|
| ext4 | 안정적, 널리 사용됨 | 일반적인 Linux 시스템 |
| XFS | 대용량, 고성능 | 대용량 파일, 데이터베이스 |
| Btrfs | 스냅샷, 압축, 체크섬 | 현대적 대안 |
| ZFS | 고급 기능 풍부 | NAS, 스토리지 서버 |
| NTFS | Windows 호환 | 듀얼 부팅 |
| exFAT | 크로스 플랫폼 | USB, SD 카드 |
파일시스템 생성
# ext4
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 -L mylabel /dev/sdb1
sudo mkfs.ext4 -m 1 /dev/sdb1 # reserved blocks 1%
# XFS
sudo mkfs.xfs /dev/sdb1
sudo mkfs.xfs -L mylabel /dev/sdb1
sudo mkfs.xfs -f /dev/sdb1 # 강제 (기존 덮어쓰기)
# Btrfs
sudo mkfs.btrfs /dev/sdb1
sudo mkfs.btrfs -L mylabel /dev/sdb1
# FAT32
sudo mkfs.vfat -F 32 /dev/sdb1
파일시스템 정보 및 검사
# 정보 확인
sudo tune2fs -l /dev/sda1 # ext4
sudo xfs_info /dev/sda1 # XFS
sudo btrfs filesystem show # Btrfs
# 검사 (언마운트 상태)
sudo fsck /dev/sdb1
sudo fsck -y /dev/sdb1 # 자동 수정
sudo e2fsck -f /dev/sdb1 # ext4 강제 검사
sudo xfs_repair /dev/sdb1 # XFS 복구
# 레이블 변경
sudo e2label /dev/sdb1 newlabel
sudo xfs_admin -L newlabel /dev/sdb1
🔗 마운트
기본 마운트
# 마운트
sudo mount /dev/sdb1 /mnt
sudo mount -t ext4 /dev/sdb1 /mnt
sudo mount -o ro /dev/sdb1 /mnt # 읽기 전용
sudo mount -o remount,rw /mnt # 재마운트
# UUID로 마운트
sudo mount UUID=xxxxx /mnt
sudo mount LABEL=mylabel /mnt
# 언마운트
sudo umount /mnt
sudo umount /dev/sdb1
sudo umount -l /mnt # lazy (busy일 때)
sudo umount -f /mnt # 강제
/etc/fstab
# /etc/fstab 형식
# <file system> <dir> <type> <options> <dump> <pass>
# 예시
UUID=xxxxx / ext4 defaults,noatime 0 1
UUID=yyyyy /home ext4 defaults 0 2
/dev/sdb1 /data xfs defaults,nofail 0 0
/dev/sr0 /media/cdrom iso9660 defaults,noauto,ro 0 0
# 네트워크 파일시스템
192.168.1.100:/nfs/share /nfs nfs defaults,_netdev 0 0
마운트 옵션:
| 옵션 | 설명 |
|---|---|
defaults | rw, suid, dev, exec, auto, nouser, async |
noatime | 접근 시간 기록 안함 (성능 향상) |
nodiratime | 디렉토리 접근 시간 기록 안함 |
relatime | 상대적 접근 시간 (기본) |
sync | 동기식 쓰기 |
async | 비동기식 쓰기 (기본) |
ro | 읽기 전용 |
rw | 읽기/쓰기 |
auto | 부팅 시 자동 마운트 |
noauto | 수동 마운트만 |
nofail | 마운트 실패핏도 부팅 계속 |
_netdev | 네트워크 파일시스템 |
마운트 관리
# 마운트된 파일시스템
mount
df -h
cat /proc/mounts
# fstab 테스트
sudo mount -a
# fstab 문법 검사
sudo findmnt --verify
# 마운트 포인트 확인
findmnt /mnt
findmnt /dev/sdb1
💽 LVM (Logical Volume Manager)
LVM 구성 요소
물리적 볼륨 (PV) ──> 볼륨 그룹 (VG) ──> 논리적 볼륨 (LV)
/dev/sdb1 data_vg /dev/data_vg/www
/dev/sdc1 /dev/data_vg/db
/dev/data_vg/backup
물리적 볼륨 (PV)
# PV 생성
sudo pvcreate /dev/sdb1
sudo pvcreate /dev/sdc1 /dev/sdd1
# PV 목록
sudo pvs
sudo pvdisplay
sudo pvdisplay /dev/sdb1
# PV 제거
sudo pvremove /dev/sdb1
# PV 크기 조정 (파티션 확장 후)
sudo pvresize /dev/sdb1
볼륨 그룹 (VG)
# VG 생성
sudo vgcreate data_vg /dev/sdb1
sudo vgcreate data_vg /dev/sdb1 /dev/sdc1
# VG 확장
sudo vgextend data_vg /dev/sdd1
# VG 축소 (PV 제거 전)
sudo vgreduce data_vg /dev/sdd1
# VG 목록
sudo vgs
sudo vgdisplay data_vg
# VG 제거
sudo vgremove data_vg
# VG 이름 변경
sudo vgrename old_vg new_vg
논리적 볼륨 (LV)
# LV 생성
sudo lvcreate -L 100G -n www data_vg
sudo lvcreate -l 100%FREE -n backup data_vg
# LV 목록
sudo lvs
sudo lvdisplay data_vg/www
# LV 포맷
sudo mkfs.ext4 /dev/data_vg/www
# LV 마운트
sudo mount /dev/data_vg/www /var/www
# LV 크기 확장
sudo lvextend -L +50G /dev/data_vg/www
sudo lvextend -l +100%FREE /dev/data_vg/www
# 파일시스템 확장 (ext4)
sudo resize2fs /dev/data_vg/www
# 파일시스템 확장 (XFS)
sudo xfs_growfs /var/www
# LV 크기 축소 (주의!)
# 1. 언마운트
# 2. 파일시스템 검사
# 3. 파일시스템 축소
# 4. LV 축소
sudo umount /var/www
sudo e2fsck -f /dev/data_vg/www
sudo resize2fs /dev/data_vg/www 80G
sudo lvreduce -L 80G /dev/data_vg/www
# LV 스냅샷
sudo lvcreate -L 10G -s -n www_snap /dev/data_vg/www
# 스냅샷 복원
sudo umount /var/www
sudo lvconvert --merge /dev/data_vg/www_snap
sudo mount /dev/data_vg/www /var/www
# LV 제거
sudo lvremove /dev/data_vg/www
LVM 스냅샷
# 스냅샷 생성
sudo lvcreate -L 10G -s -n db_snap /dev/data_vg/db
# 스냅샷 상태 확인
sudo lvs
# 스냅샷에서 복원
sudo umount /var/lib/mysql
sudo lvconvert --merge /dev/data_vg/db_snap
# 스냅샷 삭제
sudo lvremove /dev/data_vg/db_snap
🛡️ RAID
RAID 레벨 비교
| 레벨 | 이름 | 최소 디스크 | 장점 | 단점 | 사용처 |
|---|---|---|---|---|---|
| 0 | 스트라이핑 | 2 | 성능 향상 | 장애 시 데이터 손실 | 성능 중심 (임시) |
| 1 | 미러링 | 2 | 이중화 | 용량 50% | 중요 데이터 |
| 5 | 패리티 | 3 | 성능+이중화 | 쓰기 성능 저하 | 일반 서버 |
| 6 | 이중 패리티 | 4 | 2개 디스크 장애 허용 | 쓰기 성능 저하 | 대용량 저장소 |
| 10 | 미러+스트라이프 | 4 | 성능+이중화 | 용량 50% | 데이터베이스 |
mdadm (소프트웨어 RAID)
# RAID 1 생성
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# RAID 5 생성
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
# RAID 10 생성
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[b-e]1
# 진행 상황 확인
cat /proc/mdstat
watch cat /proc/mdstat
# RAID 상세 정보
sudo mdadm --detail /dev/md0
# 포맷 및 마운트
sudo mkfs.ext4 /dev/md0
sudo mount /dev/md0 /mnt/raid
# 설정 저장
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
# RAID 제거
sudo umount /mnt/raid
sudo mdadm --stop /dev/md0
sudo mdadm --remove /dev/md0
sudo mdadm --zero-superblock /dev/sdb1 /dev/sdc1
# 장애 디스크 교체
# 1. 장애 표시
sudo mdadm --manage /dev/md0 --fail /dev/sdb1
# 2. 제거
sudo mdadm --manage /dev/md0 --remove /dev/sdb1
# 3. 새 디스크 추가
sudo mdadm --manage /dev/md0 --add /dev/sde1
📊 디스크 모니터링
df — 디스크 사용량
df -h # 사람이 읽기 쉬운 형식
df -H # 1000 단위 (1000 vs 1024)
df -T # 파일시스템 유형
df -i # inode 사용량
du — 디렉토리 사용량
du -sh /path # 총 사용량
du -sh * # 현재 디렉토리 항목별
du -h --max-depth=1 /path # 1단계 깊이
du -ah /path | sort -rh | head -20 # 상위 20개
iostat — I/O 통계
# 설치
sudo apt-get install sysstat
# 기본 사용
iostat
iostat -x # 확장 통계
iostat -x 1 10 # 1초 간격, 10회
iostat -p sda # 특정 디스크
SMART 모니터링
# 설치
sudo apt-get install smartmontools
# SMART 정보
sudo smartctl -a /dev/sda
# 짧은 테스트
sudo smartctl -t short /dev/sda
# 긴 테스트
sudo smartctl -t long /dev/sda
# 테스트 결과
sudo smartctl -l selftest /dev/sda
# 오류 로그
sudo smartctl -l error /dev/sda
🐛 디스크 문제 해결
디스크 공간 부족
# 1. 사용량 확인
df -h
# 2. 큰 파일/디렉토리 찾기
sudo du -ah / | sort -rh | head -20
sudo du -sh /* | sort -rh | head -10
# 3. 삭제된 파일이 열려있는 경우
sudo lsof +L1
sudo lsof /path | grep deleted
# 4. 로그 파일 정리
sudo journalctl --vacuum-time=7d
sudo find /var/log -name "*.gz" -mtime +30 -delete
# 5. 패키지 캐시 정리
sudo apt clean # Debian/Ubuntu
sudo dnf clean all # RHEL/CentOS
inode 부족
# inode 사용량 확인
df -i
# inode 많이 사용하는 디렉토리
sudo find / -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20
# 작은 파일 많은 디렉토리
sudo find /path -type f | wc -l
파일시스템 손상
# 읽기 전용으로 마운트된 경우
# 1. 언마운트
sudo umount /mnt
# 2. 파일시스템 검사
sudo fsck /dev/sdb1
sudo fsck -y /dev/sdb1
# 3. 재마운트
sudo mount /dev/sdb1 /mnt
# 루트 파일시스템의 경우
# 복구 모드로 부팅 후 검사
📋 체크리스트
- 파티션 생성/삭제
- 파일시스템 생성/검사
- 마운트/언마운트
- fstab 설정
- LVM 구성 (PV/VG/LV)
- LVM 확장/축소
- RAID 구성
- 디스크 모니터링
- 공간 부족 문제 해결
🔗 관련 노트
- 01-01-리눅스-기본-명령어-모음 — 기본 명령어
- 02-06-LVM-구성 — LVM 심화
- 02-05-디스크-관리 — ZFS 파일시스템
- 03-02-성능-모니터링 — I/O 성능
- 백업-복구-전략 — 백업 전략
마지막 업데이트: 2026-06-01