1. 디스크 구조 개요
물리 디스크 - 파티션 - 파일 시스템 - 마운트
물리 디스크 (/dev/sda)
├── 파티션 테이블 (MBR 또는 GPT)
├── /dev/sda1 → ext4 → /boot
├── /dev/sda2 → xfs → /
└── /dev/sda3 → swap
파티션 테이블: MBR vs GPT
| 항목 | MBR (Master Boot Record) | GPT (GUID Partition Table) |
|---|---|---|
| 최대 디스크 크기 | 2TB | 9.4ZB (사실상 무제한) |
| 최대 파티션 수 | 주 파티션 4개 (확장 파티션 사용 시 논리 파티션 추가 가능) | 128개 (기본값) |
| 부트 방식 | BIOS (Legacy) | UEFI |
| 데이터 보호 | 파티션 테이블 1개 (복구 어려움) | Primary + Backup GPT (디스크 끝에 백업) |
| 호환성 | 오래된 시스템 지원 | 최신 시스템 표준 |
디바이스 명명 규칙
/dev/sda - 첫 번째 SCSI/SATA 디스크
/dev/sda1 - 첫 번째 디스크의 첫 번째 파티션
/dev/sdb - 두 번째 SCSI/SATA 디스크
/dev/nvme0n1 - 첫 번째 NVMe SSD
/dev/nvme0n1p1 - NVMe SSD의 첫 번째 파티션
/dev/vda - 가상화 환경의 디스크 (VirtIO)
2. 디스크 확인
lsblk - 블록 디바이스 트리 표시
# 기본 출력 (디바이스, 크기, 타입, 마운트포인트)
lsblk
# 출력 예시:
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
# sda 8:0 0 100G 0 disk
# ├─sda1 8:1 0 512M 0 part /boot/efi
# ├─sda2 8:2 0 95G 0 part /
# └─sda3 8:3 0 4.5G 0 part [SWAP]
# 파일 시스템, UUID 등 상세 정보
lsblk -f
# 특정 컬럼만 출력
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,UUID
# 바이트 단위 출력
lsblk -bblkid - 블록 디바이스 속성 조회
# 모든 디바이스의 UUID, 파일 시스템 타입 표시
blkid
# 출력 예시:
# /dev/sda1: UUID="1234-ABCD" TYPE="vfat" PARTUUID="abcd1234-01"
# /dev/sda2: UUID="a1b2c3d4-..." TYPE="ext4" PARTUUID="abcd1234-02"
# 특정 디바이스만 조회
blkid /dev/sda1fdisk -l - 파티션 테이블 상세 확인
# 모든 디스크의 파티션 테이블 (root 권한 필요)
sudo fdisk -l
# 특정 디스크만 확인
sudo fdisk -l /dev/sda3. 파티셔닝
fdisk - MBR 파티셔닝 (대화형)
sudo fdisk /dev/sdb
# 주요 명령어 (대화형 모드 내):
# m - 도움말
# p - 파티션 테이블 출력
# n - 새 파티션 생성
# d - 파티션 삭제
# t - 파티션 타입 변경 (82=Linux swap, 83=Linux, 8e=LVM)
# w - 변경사항 저장 후 종료
# q - 저장하지 않고 종료
# 예: 새 파티션 생성 흐름
# n → p(primary) → 파티션번호 → 시작섹터(Enter=기본) → 크기(+10G) → wparted - GPT/MBR 모두 지원 (스크립트 가능)
# 대화형 모드
sudo parted /dev/sdb
# 비대화형 (스크립트용)
# GPT 레이블 생성
sudo parted /dev/sdb mklabel gpt
# 파티션 생성
sudo parted /dev/sdb mkpart primary ext4 0% 50%
sudo parted /dev/sdb mkpart primary xfs 50% 100%
# 파티션 정보 확인
sudo parted /dev/sdb print
# 파티션 크기 조정
sudo parted /dev/sdb resizepart 1 80%gdisk - GPT 전용 파티셔닝
sudo gdisk /dev/sdb
# fdisk와 유사한 대화형 인터페이스
# GPT 파티션 작업에 특화
# MBR → GPT 변환 기능 지원4. 파일 시스템 비교
| 항목 | ext4 | xfs | btrfs | tmpfs |
|---|---|---|---|---|
| 최대 파일 크기 | 16TB | 8EB | 16EB | RAM 크기 |
| 최대 볼륨 크기 | 1EB | 8EB | 16EB | RAM 크기 |
| 저널링 | O | O | CoW | - |
| 축소 가능 | O | X | O | - |
| 스냅샷 | X | X | O (네이티브) | - |
| 특징 | 안정성, 범용 | 대용량/고성능 | 스냅샷, 압축, RAID 내장 | 메모리 기반 (재부팅 시 소멸) |
| 주요 용도 | 기본 리눅스 FS | RHEL 기본, 대규모 서버 | 유연한 스토리지 관리 | /tmp, /run |
ext4 특징
- 하위 호환 (ext2/ext3 마운트 가능)
- 지연 할당(delayed allocation)으로 성능 향상
- 온라인 리사이즈 (확장만 가능, 축소는 언마운트 필요)
xfs 특징
- 온라인 확장 가능 (축소 불가)
- 병렬 I/O에 강함 (대용량 파일 처리)
xfs_repair,xfs_info,xfsdump/xfsrestore전용 도구
btrfs 특징
- Copy-on-Write (CoW) 방식
- 내장 스냅샷, 서브볼륨, 압축(zstd, lzo)
- 내장 RAID 지원 (RAID 0/1/10)
5. 파일 시스템 생성 및 관리
mkfs - 파일 시스템 생성
# ext4 파일 시스템 생성
sudo mkfs.ext4 /dev/sdb1
# 라벨 지정
sudo mkfs.ext4 -L "data" /dev/sdb1
# xfs 파일 시스템 생성
sudo mkfs.xfs /dev/sdb2
# 강제 덮어쓰기 (-f)
sudo mkfs.xfs -f /dev/sdb2
# btrfs 파일 시스템
sudo mkfs.btrfs /dev/sdb3
# vfat (USB, EFI 파티션용)
sudo mkfs.vfat -F 32 /dev/sdb1fsck - 파일 시스템 검사/복구
# 반드시 언마운트 상태에서 실행해야 함!
sudo umount /dev/sdb1
# ext4 검사
sudo fsck.ext4 /dev/sdb1
# 자동 복구 (-y: 모든 질문에 yes)
sudo fsck -y /dev/sdb1
# 강제 검사 (-f)
sudo fsck -f /dev/sdb1
# xfs 검사 (전용 도구 사용)
sudo xfs_repair /dev/sdb2tune2fs - ext 파일 시스템 파라미터 조정
# 파일 시스템 정보 확인
sudo tune2fs -l /dev/sda2
# 라벨 변경
sudo tune2fs -L "new_label" /dev/sda2
# 마운트 횟수 기반 자동 검사 설정
sudo tune2fs -c 30 /dev/sda2 # 30번 마운트마다 fsck
# 시간 기반 자동 검사 설정
sudo tune2fs -i 1m /dev/sda2 # 1개월마다 fsck
# 예약 블록 비율 변경 (기본 5% → 1%)
sudo tune2fs -m 1 /dev/sda2
# 저널 추가 (ext2 → ext3/4 변환)
sudo tune2fs -j /dev/sda26. 마운트
mount / umount
# 기본 마운트
sudo mount /dev/sdb1 /mnt/data
# 파일 시스템 타입 지정
sudo mount -t xfs /dev/sdb2 /mnt/data
# 읽기 전용 마운트
sudo mount -o ro /dev/sdb1 /mnt/data
# 여러 옵션 지정
sudo mount -o rw,noexec,nosuid /dev/sdb1 /mnt/data
# UUID로 마운트
sudo mount UUID="a1b2c3d4-..." /mnt/data
# ISO 파일 마운트 (루프 디바이스)
sudo mount -o loop image.iso /mnt/iso
# 현재 마운트 상태 확인
mount | column -t
# 또는
findmnt
# 언마운트
sudo umount /mnt/data
# 강제 언마운트 (busy 상태일 때)
sudo umount -f /mnt/data
# lazy 언마운트 (새 접근 차단, 기존 프로세스 완료 후 해제)
sudo umount -l /mnt/data마운트 옵션
| 옵션 | 설명 |
|---|---|
defaults | rw, suid, dev, exec, auto, nouser, async |
ro / rw | 읽기 전용 / 읽기쓰기 |
noexec | 실행 파일 실행 금지 |
nosuid | SUID/SGID 비트 무시 |
nodev | 디바이스 파일 무시 |
noatime | 접근 시간 미기록 (성능 향상) |
auto / noauto | 부팅 시 자동 마운트 여부 |
user / nouser | 일반 사용자 마운트 허용 여부 |
/etc/fstab - 자동 마운트 설정
# /etc/fstab 형식:
# <장치> <마운트포인트> <파일시스템> <옵션> <dump> <pass>
# 필드 설명:
# 1. 장치: UUID=xxx, /dev/sdXN, LABEL=xxx
# 2. 마운트포인트: 마운트할 디렉토리 경로
# 3. 파일시스템: ext4, xfs, swap, vfat 등
# 4. 옵션: defaults, noatime, ro 등 (쉼표로 구분)
# 5. dump: 백업 여부 (0=안함, 1=함) - 현재 거의 사용 안 함
# 6. pass: fsck 검사 순서 (0=검사안함, 1=루트, 2=나머지)
# 예시 /etc/fstab:
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 / ext4 defaults 0 1
UUID=1234-ABCD /boot/efi vfat umask=0077 0 2
UUID=b2c3d4e5-f6a7-8901-bcde-f12345678901 /home ext4 defaults,noatime 0 2
UUID=c3d4e5f6-a7b8-9012-cdef-123456789012 none swap sw 0 0
tmpfs /tmp tmpfs defaults,size=2G 0 0UUID 사용 권장 이유: 디바이스 이름(/dev/sda1)은 디스크 추가/제거 시 변경될 수 있지만, UUID는 고유값이므로 안정적.
# fstab 수정 후 검증 (재부팅 없이 테스트)
sudo mount -a
# fstab에 설정된 특정 마운트포인트만 마운트
sudo mount /home7. 디스크 사용량
df - 파일 시스템 사용량
# 사람이 읽기 쉬운 단위 (-h: human-readable)
df -h
# 출력 예시:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda2 95G 45G 46G 50% /
# tmpfs 3.9G 1.2M 3.9G 1% /tmp
# inode 사용량 확인 (-i)
# 파일이 작고 많을 때 inode 고갈 가능 → 용량은 남아도 파일 생성 불가
df -i
# 특정 파일 시스템 타입만 표시
df -h -t ext4
# 특정 타입 제외
df -h -x tmpfs -x devtmpfsdu - 디렉토리 사용량
# 현재 디렉토리 총 사용량 (-s: summary, -h: human-readable)
du -sh
# 특정 디렉토리
du -sh /var/log
# 하위 디렉토리별 사용량 (1단계까지)
du -h --max-depth=1 /var
# 큰 디렉토리 찾기 (정렬)
du -h --max-depth=1 /var | sort -hr | head -20
# 특정 디렉토리 제외
du -sh --exclude='*.log' /var
# 디스크 사용량 많은 파일 찾기
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null8. Swap
Swap은 물리 메모리(RAM)가 부족할 때 디스크 공간을 가상 메모리로 사용하는 영역이다.
Swap 파티션 설정
# 1. 파티션 생성 (fdisk에서 타입 82로 설정)
# 2. swap 포맷
sudo mkswap /dev/sda3
# 3. swap 활성화
sudo swapon /dev/sda3
# 4. /etc/fstab에 영구 등록
# UUID=xxx none swap sw 0 0Swap 파일 설정
# 1. swap 파일 생성 (2GB)
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
# 또는 (더 빠름)
sudo fallocate -l 2G /swapfile
# 2. 권한 설정 (보안: 600 필수)
sudo chmod 600 /swapfile
# 3. swap 포맷
sudo mkswap /swapfile
# 4. swap 활성화
sudo swapon /swapfile
# 5. /etc/fstab에 영구 등록
# /swapfile none swap sw 0 0Swap 관리
# 현재 swap 상태 확인
swapon --show
free -h
cat /proc/swaps
# swap 비활성화
sudo swapoff /dev/sda3
sudo swapoff -a # 모든 swap 비활성화Swappiness
커널이 swap을 얼마나 적극적으로 사용할지 결정하는 값 (0~100).
# 현재 값 확인 (기본 60)
cat /proc/sys/vm/swappiness
# 임시 변경
sudo sysctl vm.swappiness=10
# 영구 변경 (/etc/sysctl.conf에 추가)
# vm.swappiness=10
# 값의 의미:
# 0 - swap을 최대한 사용하지 않음 (OOM 직전까지)
# 10 - 데스크톱/DB 서버에 권장 (RAM 우선 사용)
# 60 - 기본값
# 100 - swap을 적극적으로 사용9. LVM (Logical Volume Manager)
물리 디스크를 추상화하여 유연하게 스토리지를 관리하는 체계.
LVM 구조

- PV: 실제 물리 파티션/디스크
- VG: PV들을 묶은 저장소 풀
- LV: VG에서 할당한 논리 볼륨 (파티션처럼 사용)
PV (Physical Volume) 관리
# PV 생성
sudo pvcreate /dev/sdb1
sudo pvcreate /dev/sdc1
# PV 확인
sudo pvs # 요약
sudo pvdisplay # 상세VG (Volume Group) 관리
# VG 생성 (여러 PV를 하나의 VG로 묶기)
sudo vgcreate vg_data /dev/sdb1 /dev/sdc1
# VG에 PV 추가 (용량 확장)
sudo vgextend vg_data /dev/sdd1
# VG에서 PV 제거
sudo vgreduce vg_data /dev/sdd1
# VG 확인
sudo vgs # 요약
sudo vgdisplay # 상세LV (Logical Volume) 관리
# LV 생성
sudo lvcreate -L 30G -n lv_root vg_data # 크기 지정
sudo lvcreate -l 100%FREE -n lv_home vg_data # VG 남은 공간 전부
# LV 확인
sudo lvs # 요약
sudo lvdisplay # 상세
# LV에 파일 시스템 생성
sudo mkfs.ext4 /dev/vg_data/lv_root
# 마운트
sudo mount /dev/vg_data/lv_root /mnt/rootLV 확장 (온라인 리사이즈)
# LV 크기 확장 (10GB 추가)
sudo lvextend -L +10G /dev/vg_data/lv_root
# 또는 특정 크기로 확장
sudo lvextend -L 50G /dev/vg_data/lv_root
# 파일 시스템도 함께 확장 (-r 옵션)
sudo lvextend -r -L +10G /dev/vg_data/lv_root
# 수동으로 파일 시스템 확장
# ext4:
sudo resize2fs /dev/vg_data/lv_root
# xfs:
sudo xfs_growfs /mnt/rootLV 스냅샷
# 스냅샷 생성 (원본 LV의 변경분만 저장하므로 크기는 작게)
sudo lvcreate -L 5G -s -n lv_root_snap /dev/vg_data/lv_root
# 스냅샷 마운트 (백업 용도)
sudo mount -o ro /dev/vg_data/lv_root_snap /mnt/snap
# 스냅샷에서 복원
sudo lvconvert --merge /dev/vg_data/lv_root_snap10. RAID 기초
RAID 레벨 비교
| RAID | 이름 | 최소 디스크 | 사용 가능 용량 | 내결함성 | 특징 |
|---|---|---|---|---|---|
| 0 | Striping | 2 | N x 디스크 | 없음 | 최고 성능, 하나만 고장나도 전체 손실 |
| 1 | Mirroring | 2 | 1 x 디스크 | 1개 | 완전 복제, 읽기 성능 향상 |
| 5 | Striping + Parity | 3 | (N-1) x 디스크 | 1개 | 패리티 분산 저장, 범용 |
| 6 | Striping + Dual Parity | 4 | (N-2) x 디스크 | 2개 | RAID 5보다 안전 |
| 10 | Mirroring + Striping | 4 | N/2 x 디스크 | 미러 당 1개 | 성능 + 안정성, 비용 높음 |

mdadm - 소프트웨어 RAID 관리
# RAID 1 생성 (2개 디스크 미러링)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# RAID 5 생성 (3개 디스크)
sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
# RAID 상태 확인
cat /proc/mdstat
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 mdadm /dev/md0 --fail /dev/sdb1 # 장애 표시
sudo mdadm /dev/md0 --remove /dev/sdb1 # 제거
sudo mdadm /dev/md0 --add /dev/sde1 # 새 디스크 추가 (자동 리빌드)
# RAID 중지
sudo mdadm --stop /dev/md011. dd 명령어
dd는 블록 단위로 데이터를 복사하는 저수준 도구. 매우 강력하지만 실수하면 데이터가 손실될 수 있다.
# 디스크 전체 복제
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress
# ISO 이미지를 USB에 굽기
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress conv=fsync
# 디스크 이미지 백업
sudo dd if=/dev/sda of=/backup/sda.img bs=4M status=progress
# 이미지에서 복원
sudo dd if=/backup/sda.img of=/dev/sda bs=4M status=progress
# 디스크 완전 삭제 (복구 불가)
sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress
# 또는 랜덤 데이터로 (보안 삭제)
sudo dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
# 빈 파일 생성 (1GB)
dd if=/dev/zero of=testfile bs=1M count=1024
# MBR 백업 (첫 512바이트)
sudo dd if=/dev/sda of=mbr_backup.bin bs=512 count=1주요 옵션:
if=- 입력 파일/디바이스 (input file)of=- 출력 파일/디바이스 (output file)bs=- 블록 사이즈 (한 번에 읽고 쓰는 크기)count=- 복사할 블록 수status=progress- 진행 상황 표시conv=fsync- 쓰기 완료 보장
주의:
if와of를 바꾸면 데이터가 파괴된다. 실행 전 반드시 확인.
12. 디스크 I/O 모니터링
iostat - I/O 통계
# 기본 출력
iostat
# 디바이스별 상세 통계 (1초 간격, 5회 반복)
iostat -dx 1 5
# 출력 예시 (주요 컬럼):
# Device r/s w/s rkB/s wkB/s await %util
# sda 12.5 8.3 200.0 150.0 3.2 15.0
#
# r/s, w/s - 초당 읽기/쓰기 요청 수
# rkB/s, wkB/s - 초당 읽기/쓰기 KB
# await - 평균 I/O 대기 시간 (ms) → 높으면 디스크 병목
# %util - 디스크 사용률 → 100%에 가까우면 포화 상태
# 사람이 읽기 쉬운 단위 (-h는 일부 버전만 지원)
iostat -dxm 1 # MB 단위iotop - 프로세스별 I/O 사용량 (top 스타일)
# 기본 실행 (root 권한 필요)
sudo iotop
# 실제 I/O를 발생시키는 프로세스만 표시
sudo iotop -o
# 배치 모드 (스크립트용)
sudo iotop -b -n 3 # 3회 출력 후 종료
# 주요 인터랙티브 키:
# o - 활성 프로세스만 토글
# p - 프로세스/스레드 토글
# 좌/우 화살표 - 정렬 기준 변경실전 정리: 새 디스크 추가 전체 흐름
# 1. 디스크 확인
lsblk
sudo fdisk -l /dev/sdb
# 2. 파티셔닝 (GPT)
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary ext4 0% 100%
# 3. 파일 시스템 생성
sudo mkfs.ext4 -L "data" /dev/sdb1
# 4. 마운트 포인트 생성
sudo mkdir -p /mnt/data
# 5. UUID 확인
blkid /dev/sdb1
# 6. /etc/fstab에 등록
echo 'UUID=xxxx-xxxx /mnt/data ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstab
# 7. 마운트 및 검증
sudo mount -a
df -h /mnt/data