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