LVM 구성

Logical Volume Manager의 심화 구성 및 관리 완벽 가이드


Logical Volume Manager의 심화 구성 및 관리 완벽 가이드

목표: 프로덕션 환경에서 LVM을 설계하고 최적화할 수 있는 수준


🏗️ LVM 아키텍처 심화

구성 요소 상세

┌─────────────────────────────────────────────────────┐
│                    볼륨 그룹 (VG)                      │
│  ┌───────────────────────────────────────────────┐  │
│  │              논리적 볼륨 (LV)                    │  │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐         │  │
│  │  │  LV-1   │ │  LV-2   │ │ LV-snap │         │  │
│  │  │ /var/www│ │ /var/db │ │ (10GB)  │         │  │
│  │  └────┬────┘ └────┬────┘ └────┬────┘         │  │
│  │       └───────────┴───────────┘               │  │
│  │              PE (Physical Extents)             │  │
│  │         4MB 단위 청크 (기본값)                  │  │
│  └───────────────────────────────────────────────┘  │
│         │              │              │             │
│    ┌────┴────┐   ┌────┴────┐   ┌────┴────┐        │
│    │   PV1   │   │   PV2   │   │   PV3   │        │
│    │/dev/sdb1│   │/dev/sdc1│   │/dev/sdd1│        │
│    │  500GB  │   │  500GB  │   │  500GB  │        │
│    └─────────┘   └─────────┘   └─────────┘        │
│         Physical Volumes (물리적 볼륨)              │
└─────────────────────────────────────────────────────┘

PE (Physical Extent)와 LE (Logical Extent)

개념설명기본 크기
PE물리적 볼륨의 최소 할당 단위4MB
LE논리적 볼륨의 최소 할당 단위4MB (PE와 1:1 매핑)
# PE 크기 확인
sudo vgdisplay vg_name | grep "PE Size"

# VG 생성 시 PE 크기 지정
sudo vgcreate -s 16M vg_name /dev/sdb1

🔧 고급 PV 관리

PV 세그먼트 분석

# PV 세그먼트 상세 정보
sudo pvdisplay -m /dev/sdb1

# PV 사용 현황
sudo pvs -o +pv_used,pv_free

# PV 메타데이터 백업
sudo pvck /dev/sdb1
sudo dd if=/dev/sdb1 of=pv_backup.bin bs=512 count=10

PV 이동 (데이터 마이그레이션)

# 1. 새 PV 추가
sudo pvcreate /dev/sde1
sudo vgextend vg_name /dev/sde1

# 2. 기존 PV의 데이터 이동
sudo pvmove /dev/sdb1
sudo pvmove /dev/sdb1 /dev/sde1  # 특정 대상 지정

# 3. 진행 상황 모니터링
watch sudo pvs

# 4. 기존 PV 제거
sudo vgreduce vg_name /dev/sdb1
sudo pvremove /dev/sdb1

📊 VG 고급 관리

VG 확장 전략

# 자동 확장 (큰 디스크 추가)
sudo vgextend vg_name /dev/sdf1

# 여러 PV 동시 확장
sudo vgextend vg_name /dev/sdg1 /dev/sdh1

# 최대 PV 수 확인
sudo vgdisplay vg_name | grep "Max PV"

# VG 메타데이터 백업
sudo vgcfgbackup vg_name
# 백업 위치: /etc/lvm/backup/vg_name

# VG 메타데이터 복원
sudo vgcfgrestore vg_name -f /etc/lvm/backup/vg_name

VG 분할 (VG Split)

# 기존 VG에서 새 VG 분할
# 1. LV를 새 VG로 이동할 수 없음
# 2. 대신: 새 VG 생성 → 데이터 복사 → 기존 LV 제거

# 또는 pvmove 사용
sudo vgcreate new_vg /dev/sdi1
sudo pvmove /dev/sdb1 new_vg

VG 병합 (VG Merge)

# 두 VG 병합
sudo vgmerge dest_vg source_vg

# 조건:
# - source_vg의 LV가 모두 비활성화
# - 이름 충돌 없음

💾 LV 고급 기능

스트라이프 (Striping) — 성능 향상

# 2개 PV에 걸쳐 스트라이프
sudo lvcreate -i 2 -I 64 -L 100G -n striped_lv vg_name
# -i: 스트라이프 수
# -I: 스트라이프 크기 (KB)

# 3개 PV에 걸쳐 스트라이프
sudo lvcreate -i 3 -I 128 -L 200G -n fast_lv vg_name

# 스트라이프 확인
sudo lvs -o +stripes,stripesize

미러 (Mirroring) — 이중화

# RAID 1 유사 미러
sudo lvcreate -m 1 -L 100G -n mirrored_lv vg_name
# -m: 미러 수

# 미러 로그 디스크 지정
sudo lvcreate -m 1 --mirrorlog disk -L 100G -n mirrored_lv vg_name

# 미터 확인
sudo lvs -o +copy_percent,devices

# 미터 동기화 진행 상황
sudo lvs -o +copy_percent

RAID LV (LVM 내장 RAID)

# RAID 5
sudo lvcreate --type raid5 -L 300G -n raid5_lv vg_name /dev/sdb1 /dev/sdc1 /dev/sdd1

# RAID 6
sudo lvcreate --type raid6 -L 400G -n raid6_lv vg_name /dev/sd[b-e]1

# RAID 10
sudo lvcreate --type raid10 -L 200G -n raid10_lv vg_name /dev/sd[b-e]1

# RAID 상태 확인
sudo lvs -a -o +raid_sync_action,raid_mismatch_count
sudo cat /proc/mdstat

씬 프로비저닝 (Thin Provisioning)

# 씬 풀 생성
sudo lvcreate -L 500G -T vg_name/thin_pool

# 씬 LV 생성
sudo lvcreate -V 100G -T vg_name/thin_pool -n thin_lv1
sudo lvcreate -V 100G -T vg_name/thin_pool -n thin_lv2

# 씬 풀 상태 확인
sudo lvs -a
sudo lvs -o +thin_count,thin_id

# 씬 풀 자동 확장
sudo lvchange --monitor y vg_name/thin_pool

# 씬 풀 메타데이터 크기 조정
sudo lvextend -L +10G vg_name/thin_pool_tmeta

캐시 (Cache)

# SSD를 캐시로 사용
# 1. 캐시 풀 생성
sudo lvcreate -L 50G -n cache_pool vg_name /dev/ssd1

# 2. 기존 LV에 캐시 연결
sudo lvconvert --type cache-pool vg_name/cache_pool
sudo lvconvert --type cache --cachepool vg_name/cache_pool vg_name/slow_lv

# 캐시 상태 확인
sudo lvs -a -o +cache_dirty_blocks,cache_read_hits,cache_read_misses

# 캐시 분리
sudo lvconvert --splitcache vg_name/slow_lv

📸 스냅샷 심화

스냅샷 작동 원리

원본 LV (100GB)
├─ 데이터 블록 A
├─ 데이터 블록 B
└─ 데이터 블록 C

스냅샷 생성 시:
├─ 원본 LV (변경 추적 활성화)
└─ 스냅샷 LV (10GB) ──> 변경 전 데이터 복사본 저장

쓰기 시:
1. 원본 블록 변경 전 → 스냅샷에 복사 (Copy-on-Write)
2. 원본 블록 새 데이터로 업데이트

스냅샷 관리

# 스냅샷 생성 (원본 LV 크기의 20% 권장)
sudo lvcreate -L 20G -s -n db_snap /dev/vg_name/db_lv

# 스냅샷 목록
sudo lvs -a -o +origin,snap_percent

# 스냅샷 사용량 모니터링
watch 'sudo lvs -o +snap_percent'

# 스냅샷 자동 확장
sudo lvchange --monitor y vg_name/db_snap

# 스냅샷 병합 (원본으로 복원)
sudo umount /var/lib/mysql
sudo lvconvert --merge vg_name/db_snap
# 또는
sudo lvremove vg_name/db_snap  # 스냅샷 삭제

# 스냅샷 마운트 (읽기 전용으로 백업)
sudo mkdir /mnt/snap
sudo mount -o ro /dev/vg_name/db_snap /mnt/snap
sudo tar czf backup.tar.gz /mnt/snap
sudo umount /mnt/snap

스냅샷 체인 (Snapshot Chain)

# 여러 스냅샷 생성
sudo lvcreate -L 10G -s -n snap1 vg_name/lv
# ... 시간 경과 ...
sudo lvcreate -L 10G -s -n snap2 vg_name/lv
# ... 시간 경과 ...
sudo lvcreate -L 10G -s -n snap3 vg_name/lv

# 스냅샷 체인 확인
sudo lvs -a -o +origin,snap_percent,descendants

🔐 LVM 보안

암호화 (LUKS + LVM)

# 1. 물리적 볼륨 암호화
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup luksOpen /dev/sdb1 pv_crypt

# 2. 암호화된 디바이스에 PV 생성
sudo pvcreate /dev/mapper/pv_crypt

# 3. 나머지 LVM 구성
sudo vgcreate secure_vg /dev/mapper/pv_crypt
sudo lvcreate -L 100G -n secure_lv secure_vg

# 4. 자동 마운트 설정 (/etc/crypttab)
echo "pv_crypt UUID=xxxxx none luks" | sudo tee -a /etc/crypttab

권한 관리

# LVM 명령어 그룹 권한
sudo usermod -aG disk username

# LVM 메타데이터 읽기 전용
sudo chmod 600 /etc/lvm/backup/*
sudo chmod 600 /etc/lvm/archive/*

📈 성능 최적화

I/O 스케줄러

# 현재 스케줄러 확인
cat /sys/block/sda/queue/scheduler

# 스케줄러 변경
echo "deadline" | sudo tee /sys/block/sda/queue/scheduler

# 영구 설정 (/etc/udev/rules.d/)
echo 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"' | \
  sudo tee /etc/udev/rules.d/60-scheduler.rules
스케줄러특징사용처
none스케줄링 없음NVMe, SSD
mq-deadline기한 기반일반적인 사용
kyber큐 기반고성능 SSD
bfq공정 큐데스크톱, 대화형

읽기 전용 마운트 옵션

# 데이터베이스 백업용 LV 읽기 전용 마운트
sudo mount -o ro,noload /dev/vg_name/db_snap /mnt/backup

LVM 캐시 설정

# 캐시 모드 설정
sudo lvchange --cachemode writethrough vg_name/cached_lv
# writethrough: 안전 (캐시와 원본 동시 쓰기)
# writeback: 빠름 (캐시에만 먼저 쓰기)

# 캐시 정책
sudo lvchange --cachepolicy cleaner vg_name/cached_lv
# cleaner: 안전한 제거를 위해 더티 블록 플러시
# smq: 안정적 MQ (기본)

🐛 LVM 문제 해결

VG 활성화 실패

# VG 활성화
sudo vgchange -ay vg_name

# 모든 VG 활성화
sudo vgchange -ay

# VG 복구
sudo vgcfgrestore -f /etc/lvm/backup/vg_name vg_name

# 메타데이터 손상 시
sudo pvcreate --uuid xxx --restorefile /etc/lvm/backup/vg_name /dev/sdb1

LV 손상

# LV 상태 확인
sudo lvdisplay /dev/vg_name/lv

# 파일시스템 검사
sudo fsck /dev/vg_name/lv

# LV 복구 (스냅샷에서)
sudo lvconvert --merge vg_name/lv_snap

# 데이터 복구
sudo ddrescue /dev/vg_name/lv /backup/lv.img

공간 부족

# VG 여유 공간 확인
sudo vgs -o +vg_free

# LV 확장
sudo lvextend -L +50G /dev/vg_name/lv
sudo resize2fs /dev/vg_name/lv

# 씬 풀 공간 부족
sudo lvextend -L +100G vg_name/thin_pool

📋 체크리스트

  • PV/VG/LV 설계
  • 스트라이프/미러/RAID 구성
  • 씬 프로비저닝
  • 캐시 구성
  • 스냅샷 전략
  • 성능 최적화
  • 백업/복구 절차
  • 모니터링 설정

🔗 관련 노트

  • 02-05-디스크-관리 — 기본 디스크 관리
  • 02-07-RAID-구성 — 소프트웨어 RAID
  • 02-05-디스크-관리 — ZFS 파일시스템
  • 03-02-성능-모니터링 — I/O 성능
  • 백업-복구-전략 — 백업 전략

마지막 업데이트: 2026-06-01