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)
최대 디스크 크기2TB9.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 -b

blkid - 블록 디바이스 속성 조회

# 모든 디바이스의 UUID, 파일 시스템 타입 표시
blkid
 
# 출력 예시:
# /dev/sda1: UUID="1234-ABCD" TYPE="vfat" PARTUUID="abcd1234-01"
# /dev/sda2: UUID="a1b2c3d4-..." TYPE="ext4" PARTUUID="abcd1234-02"
 
# 특정 디바이스만 조회
blkid /dev/sda1

fdisk -l - 파티션 테이블 상세 확인

# 모든 디스크의 파티션 테이블 (root 권한 필요)
sudo fdisk -l
 
# 특정 디스크만 확인
sudo fdisk -l /dev/sda

3. 파티셔닝

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) → w

parted - 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. 파일 시스템 비교

항목ext4xfsbtrfstmpfs
최대 파일 크기16TB8EB16EBRAM 크기
최대 볼륨 크기1EB8EB16EBRAM 크기
저널링OOCoW-
축소 가능OXO-
스냅샷XXO (네이티브)-
특징안정성, 범용대용량/고성능스냅샷, 압축, RAID 내장메모리 기반 (재부팅 시 소멸)
주요 용도기본 리눅스 FSRHEL 기본, 대규모 서버유연한 스토리지 관리/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/sdb1

fsck - 파일 시스템 검사/복구

# 반드시 언마운트 상태에서 실행해야 함!
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/sdb2

tune2fs - 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/sda2

6. 마운트

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

마운트 옵션

옵션설명
defaultsrw, suid, dev, exec, auto, nouser, async
ro / rw읽기 전용 / 읽기쓰기
noexec실행 파일 실행 금지
nosuidSUID/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  0

UUID 사용 권장 이유: 디바이스 이름(/dev/sda1)은 디스크 추가/제거 시 변경될 수 있지만, UUID는 고유값이므로 안정적.

# fstab 수정 후 검증 (재부팅 없이 테스트)
sudo mount -a
 
# fstab에 설정된 특정 마운트포인트만 마운트
sudo mount /home

7. 디스크 사용량

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 devtmpfs

du - 디렉토리 사용량

# 현재 디렉토리 총 사용량 (-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/null

8. 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  0

Swap 파일 설정

# 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  0

Swap 관리

# 현재 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/root

LV 확장 (온라인 리사이즈)

# 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/root

LV 스냅샷

# 스냅샷 생성 (원본 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_snap

10. RAID 기초

RAID 레벨 비교

RAID이름최소 디스크사용 가능 용량내결함성특징
0Striping2N x 디스크없음최고 성능, 하나만 고장나도 전체 손실
1Mirroring21 x 디스크1개완전 복제, 읽기 성능 향상
5Striping + Parity3(N-1) x 디스크1개패리티 분산 저장, 범용
6Striping + Dual Parity4(N-2) x 디스크2개RAID 5보다 안전
10Mirroring + Striping4N/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/md0

11. 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 - 쓰기 완료 보장

주의: ifof를 바꾸면 데이터가 파괴된다. 실행 전 반드시 확인.

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