infra
Platform

모듈 맵

[Linux] 디스크 관리와 LVM

0 / 20 완료

펼치기

Linux-master · 05 / 20

[Linux] 디스크 관리와 LVM

fdisk/parted로 파티션을 구성하고 LVM으로 유연한 논리 볼륨을 생성·확장합니다

🚨INCIDENT ALERT
HIGH

운영팀 슬랙에 알람이 떴습니다. "DB 서버 /data 파티션 사용률 94%". 지금 당장 PostgreSQL을 내릴 수 없고, 물리 디스크를 교체하면 서비스 중단입니다. LVM으로 구성했다면 클라우드 콘솔에서 디스크 한 장 추가하고 명령어 세 줄로 서비스 중단 없이 해결됩니다. 처음 서버를 구성할 때 왜 LVM을 써야 하는지, 이 모듈이 알려줍니다.

디스크 관리와 LVM

프로덕션 서버를 운영하다 보면 디스크 용량 부족은 반드시 마주치는 상황입니다. 과거에는 서비스를 중단하고 파티션을 다시 구성해야 했지만, LVM(Logical Volume Manager)을 사용하면 서비스 중단 없이 온라인으로 볼륨을 확장할 수 있습니다. 이 챕터에서는 파티셔닝 기초부터 LVM 3계층 구조, 온라인 확장까지 실무에 바로 적용할 수 있는 기술을 학습합니다.


이번 챕터에서 배울 것

파티셔닝과 파일시스템 기초를 다진 뒤 LVM으로 유연한 스토리지 관리를 구현합니다. 리눅스마스터 1급 시험의 핵심 실기 주제이며, 실무에서 가장 자주 활용되는 스토리지 기술입니다.

  • 1MBR과 GPT 파티션 테이블 구조 — 주/확장/논리 파티션, 2TB 한계
  • 2fdisk와 parted 인터랙티브 명령으로 파티션 생성·삭제 (n/d/p/t/w/q)
  • 3mkfs.ext4/mkfs.xfs로 파일시스템 생성, mount와 /etc/fstab 영구 마운트 설정
  • 4LVM 3계층(PV → VG → LV) 구성과 온라인 확장(lvextend + resize2fs/xfs_growfs)
  • 5LVM 스냅샷으로 서비스 중단 없이 특정 시점 데이터 보호
실습 환경 준비

디스크 파티셔닝과 LVM 실습에는 root 권한과 실습용 가상 디스크(예: /dev/sdb)가 필요합니다. 운영 서버에서 직접 실습하기보다 VM 환경에서 디스크를 추가하여 진행하세요. 잘못된 파티셔닝은 데이터 손실을 유발합니다.

가상 디스크 장치 확인 (실습용 추가 디스크 /dev/sdb 필요)
lsblk
lvm2 패키지 설치 확인
rpm -q lvm2 || dpkg -l lvm2 2>/dev/null | grep lvm2
parted 도구 설치 확인
parted --version
root 권한 확인
sudo -v
💡개념

MBR과 GPT 파티션 테이블 구조

파티션 테이블이란?

디스크를 여러 논리적 영역으로 나누는 것을 파티셔닝이라 하며, 각 파티션의 시작 위치·크기·유형 정보를 저장하는 구조가 파티션 테이블입니다. 리눅스에서는 MBR과 GPT 두 가지 표준을 사용합니다.

MBR (Master Boot Record)

MBR은 디스크의 첫 번째 512바이트 섹터에 저장되는 전통적인 파티션 테이블 형식입니다.

MBR 섹터 구조 (512 bytes)
┌─────────────────────────────────────────────┐
│  부트 코드 (446 bytes) — GRUB Stage 1 위치   │
├─────────────────────────────────────────────┤
│  파티션 테이블 (64 bytes = 4개 × 16 bytes)   │
│  ┌──────────┬──────────┬──────────┬────────┐│
│  │ 주파티션1 │ 주파티션2 │ 주파티션3 │확장파티션││
│  └──────────┴──────────┴──────────┴────────┘│
├─────────────────────────────────────────────┤
│  매직 넘버 (2 bytes) — 0x55AA               │
└─────────────────────────────────────────────┘

MBR의 파티션 구조:

  • 주 파티션(Primary): 최대 4개. 직접 파일시스템을 생성하거나 부팅에 사용
  • 확장 파티션(Extended): 주 파티션 1개를 확장 파티션으로 지정하면, 그 안에 논리 파티션을 여러 개 생성 가능
  • 논리 파티션(Logical): 확장 파티션 내부에 생성, 장치 번호는 5번부터 시작
MBR 파티션 예시:
/dev/sda1  (주 파티션 — /boot)
/dev/sda2  (주 파티션 — swap)
/dev/sda3  (주 파티션 — /)
/dev/sda4  (확장 파티션)
  /dev/sda5  (논리 파티션 — /data)
  /dev/sda6  (논리 파티션 — /backup)

MBR 한계: 32비트 LBA 주소 방식으로 최대 2TB(2^32 × 512 bytes) 디스크만 지원합니다.

GPT (GUID Partition Table)

GPT는 UEFI 표준의 일부로, MBR의 한계를 극복한 현대적 파티션 테이블 형식입니다.

GPT 구조:
┌────────────────────────────────────────────┐
│  Protective MBR (섹터 0 — 하위 호환성)       │
├────────────────────────────────────────────┤
│  Primary GPT Header (섹터 1)                │
├────────────────────────────────────────────┤
│  Partition Entry Array (섹터 2~33)          │
│  — 최대 128개 파티션 정보 저장               │
├────────────────────────────────────────────┤
│  ... 실제 파티션 데이터 영역 ...              │
├────────────────────────────────────────────┤
│  Backup Partition Entry Array              │
├────────────────────────────────────────────┤
│  Backup GPT Header (디스크 마지막 섹터)       │
└────────────────────────────────────────────┘
항목MBRGPT
최대 디스크 크기2TB9.4ZB (사실상 무제한)
최대 파티션 수4개(주) + 논리128개
파티션 구분주/확장/논리모두 동등
헤더 복구불가 (단일 MBR)가능 (헤더 이중화)
UEFI 부팅불가필수
부팅 파티션주 파티션에 부트 플래그EFI System Partition (ESP)

💡개념

fdisk와 parted, 파일시스템 생성과 마운트

fdisk — 인터랙티브 파티셔닝

fdisk는 리눅스에서 가장 널리 사용되는 파티셔닝 도구입니다. 인터랙티브 모드로 동작하며, 변경 사항은 w를 입력하기 전까지 디스크에 기록되지 않습니다.

fdisk 주요 명령 정리

로컬 터미널
# /dev/sdb 파티션 테이블 편집
sudo fdisk /dev/sdb
명령기능
m도움말 표시
p현재 파티션 테이블 출력
n새 파티션 생성
d파티션 삭제
t파티션 타입 변경 (82=swap, 83=Linux, 8e=LVM)
l파티션 타입 코드 목록
w변경 사항 저장 후 종료
q저장 없이 종료
gGPT 파티션 테이블로 변경

fdisk로 LVM 파티션 생성 예시

로컬 터미널
sudo fdisk /dev/sdb

Command: n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-20971519, default 2048): [Enter]
Last sector: +10G

Command: t
Hex code: 8e          # Linux LVM 타입 지정

Command: p
Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1        2048 20973567 20971520  10G 8e Linux LVM

Command: w
The partition table has been altered.
Syncing disks.
로컬 터미널
# 커널에 파티션 테이블 재인식 요청
sudo partprobe /dev/sdb

parted — 2TB+ 디스크와 GPT 지원

로컬 터미널
# GPT 파티션 테이블 생성
sudo parted /dev/sdb mklabel gpt

# 파티션 생성 (1MiB 정렬 시작, 10GiB 크기)
sudo parted /dev/sdb mkpart primary 1MiB 10GiB

# 파티션 정보 확인
sudo parted /dev/sdb print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  10.7GB  10.7GB               primary
로컬 터미널
# 비대화식 parted (스크립트 자동화에 유용)
sudo parted -s /dev/sdc \
  mklabel gpt \
  mkpart primary 1MiB 5GiB \
  mkpart primary 5GiB 10GiB \
  print

파일시스템 생성과 마운트

로컬 터미널
# ext4 파일시스템 생성
sudo mkfs.ext4 /dev/sdb1

# XFS 파일시스템 생성 (대용량 파일·고성능 I/O에 유리)
sudo mkfs.xfs /dev/sdb2

# UUID 확인 (fstab 등록에 사용)
sudo blkid /dev/sdb1
# /dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"

/etc/fstab 영구 마운트 설정

로컬 터미널
# 마운트 포인트 생성
sudo mkdir -p /data

# /etc/fstab에 UUID 방식으로 추가 (장치명 변경에 안전)
echo 'UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890  /data  ext4  defaults  0  2' \
  | sudo tee -a /etc/fstab

# fstab 검증 및 마운트 적용
sudo mount -a

# 마운트 확인
df -hT /data
# Filesystem     Type  Size  Used Avail Use% Mounted on
# /dev/sdb1      ext4  9.8G   24K  9.3G   1% /data

fstab 6개 필드:

<장치>          <마운트포인트>  <타입>  <옵션>     <dump>  <pass>
UUID=a1b2...   /data           ext4    defaults   0       2

dump  : 0=dump 백업 제외, 1=포함
pass  : 0=fsck 검사 안 함, 1=루트(우선), 2=일반 파티션

💡개념

LVM 3계층 구조 — PV, VG, LV

LVM 아키텍처

LVM(Logical Volume Manager)은 물리적 디스크를 추상화하여 유연하게 스토리지를 관리하는 리눅스 커널 기능입니다. 전통적인 파티셔닝의 고정된 크기 제한을 극복하여 온라인 확장, 스냅샷이 가능합니다.

LVM 3계층 구조:

물리 디스크           PV                  VG                LV
──────────           ──                  ──                ──
/dev/sdb1  →  pvcreate  →  ┐
/dev/sdc1  →  pvcreate  →  ├→  vgcreate vg_data  →  lvcreate lv_app (15G)
/dev/sdd   →  pvcreate  →  ┘                      →  lvcreate lv_log  (5G)
계층명칭설명
PVPhysical VolumeLVM으로 등록된 실제 파티션 또는 디스크
VGVolume Group하나 이상의 PV를 묶은 스토리지 풀
LVLogical VolumeVG에서 할당한 가상 파티션. 파일시스템을 올리는 단위

PV (Physical Volume) 명령

로컬 터미널
# PV 생성
sudo pvcreate /dev/sdb1 /dev/sdc1

# PV 목록 (요약)
sudo pvs
  PV         VG      Fmt  Attr PSize   PFree
  /dev/sdb1  vg_data lvm2 a--  <10.00g     0
  /dev/sdc1  vg_data lvm2 a--  <10.00g  5.00g
로컬 터미널
# PV 상세 정보
sudo pvdisplay /dev/sdb1
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg_data
  PV Size               10.00 GiB / not usable 4.00 MiB
  PE Size               4.00 MiB     # Physical Extent 크기
  Total PE              2559
  Free PE               0
  Allocated PE          2559

VG (Volume Group) 명령

로컬 터미널
# VG 생성
sudo vgcreate vg_data /dev/sdb1 /dev/sdc1

# VG 목록
sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  vg_data   2   2   0 wz--n- <20.00g 5.00g
로컬 터미널
# VG에 새 PV 추가 (스토리지 풀 확장)
sudo pvcreate /dev/sdd1
sudo vgextend vg_data /dev/sdd1

LV (Logical Volume) 명령

로컬 터미널
# 크기 지정으로 LV 생성
sudo lvcreate -L 15G -n lv_app vg_data

# VG 잔여 공간 전부 사용
sudo lvcreate -l 100%FREE -n lv_log vg_data

# LV 목록
sudo lvs
  LV      VG      Attr       LSize
  lv_app  vg_data -wi-ao---- 15.00g
  lv_log  vg_data -wi-ao----  5.00g
로컬 터미널
# LV 장치 경로 (두 형식 모두 동일)
/dev/vg_data/lv_app
/dev/mapper/vg_data-lv_app

온라인 볼륨 확장

ext4 확장

로컬 터미널
# 1. LV 블록 확장
sudo lvextend -L +5G /dev/vg_data/lv_app

# 2. 파일시스템이 새 공간 인식
sudo resize2fs /dev/vg_data/lv_app

# 두 단계를 한 번에 (-r 옵션)
sudo lvextend -L +5G -r /dev/vg_data/lv_app

XFS 확장

로컬 터미널
sudo lvextend -L +5G /dev/vg_data/lv_xfs

# XFS는 반드시 마운트 포인트를 지정
sudo xfs_growfs /mnt/xfs_data

중요: resize2fs는 ext2/ext3/ext4 전용입니다. XFS에 사용하면 오류가 발생합니다.

LVM 스냅샷

로컬 터미널
# COW(Copy-on-Write) 방식 스냅샷 생성 (2GB COW 공간)
sudo lvcreate -L 2G -s -n lv_app_snap /dev/vg_data/lv_app

# 스냅샷 마운트 (읽기 전용으로 과거 상태 접근)
sudo mount -o ro /dev/vg_data/lv_app_snap /mnt/snap

# 원본 복원 (마운트 해제 후)
sudo umount /mnt/snap
sudo lvconvert --merge /dev/vg_data/lv_app_snap

가상 디스크로 LVM 전체 구성 — PV부터 마운트까지

목표

신규 가상 디스크 /dev/sdb를 파티셔닝하여 PV → VG → LV 생성 후 파일시스템을 만들고 /etc/fstab에 등록하여 영구 마운트까지 완료합니다.

로컬 터미널
mkdir -p /tmp/linux-master/part1/lvm
# 실습용 가상 디스크 이미지 생성
dd if=/dev/zero of=/tmp/linux-master/part1/lvm/vdisk1.img bs=1M count=1024 2>/dev/null
dd if=/dev/zero of=/tmp/linux-master/part1/lvm/vdisk2.img bs=1M count=1024 2>/dev/null
dd if=/dev/zero of=/tmp/linux-master/part1/lvm/vdisk3.img bs=1M count=1024 2>/dev/null
# 루프백 장치 연결
LOOP1=$(sudo losetup -f --show /tmp/linux-master/part1/lvm/vdisk1.img)
LOOP2=$(sudo losetup -f --show /tmp/linux-master/part1/lvm/vdisk2.img)
LOOP3=$(sudo losetup -f --show /tmp/linux-master/part1/lvm/vdisk3.img)
echo "루프백 장치 생성됨: $LOOP1, $LOOP2, $LOOP3"
echo "이 장치들을 PV로 사용합니다."

1단계: 디스크 상태 확인

로컬 터미널
lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   50G  0 disk
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   49G  0 part /
sdb      8:16   0   20G  0 disk        # 실습 대상 디스크

2단계: fdisk로 LVM 파티션 두 개 생성

로컬 터미널
sudo fdisk /dev/sdb

Command: n
Select (default p): p
Partition number: 1
First sector: [Enter]
Last sector: +10G

Command: t
Hex code: 8e          # Linux LVM

Command: n
Select: p
Partition number: 2
First sector: [Enter]
Last sector: +10G

Command: t
Partition: 2
Hex code: 8e

Command: w
로컬 터미널
sudo partprobe /dev/sdb
lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0  20G  0 disk
├─sdb1   8:17   0  10G  0 part
└─sdb2   8:18   0  10G  0 part

3단계: PV 생성

로컬 터미널
sudo pvcreate /dev/sdb1 /dev/sdb2
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
로컬 터미널
sudo pvs
  PV         VG Fmt  Attr PSize   PFree
  /dev/sdb1     lvm2 ---  <10.00g <10.00g
  /dev/sdb2     lvm2 ---  <10.00g <10.00g

4단계: VG 생성

로컬 터미널
sudo vgcreate vg_practice /dev/sdb1 /dev/sdb2
  Volume group "vg_practice" successfully created
로컬 터미널
sudo vgdisplay vg_practice | grep -E "VG Name|VG Size|Free"
  VG Name               vg_practice
  VG Size               <20.00 GiB
  Free  PE / Size       5119 / <20.00 GiB

5단계: LV 생성 및 파일시스템 포맷

로컬 터미널
# app용 LV (15GB, ext4)
sudo lvcreate -L 15G -n lv_app vg_practice

# log용 LV (잔여 공간 전부, xfs)
sudo lvcreate -l 100%FREE -n lv_log vg_practice

# 파일시스템 생성
sudo mkfs.ext4 /dev/vg_practice/lv_app
sudo mkfs.xfs  /dev/vg_practice/lv_log

6단계: 마운트 및 fstab 등록

로컬 터미널
sudo mkdir -p /app /log
sudo mount /dev/vg_practice/lv_app /app
sudo mount /dev/vg_practice/lv_log /log

df -hT /app /log
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg_practice-lv_app    ext4   15G   24K   14G   1% /app
/dev/mapper/vg_practice-lv_log    xfs   5.0G   67M  4.9G   2% /log
로컬 터미널
# fstab에 LVM 장치명으로 등록 (재부팅 후에도 자동 마운트)
cat << 'EOF' | sudo tee -a /etc/fstab
/dev/vg_practice/lv_app  /app  ext4  defaults  0  2
/dev/vg_practice/lv_log  /log  xfs   defaults  0  2
EOF

# 검증
sudo mount -a && echo "fstab 검증 OK"
🔍실행 후 확인할 것
  • df -hT /app /log 결과에 vg_practice-lv_app와 vg_practice-lv_log가 각각 마운트됐는가?
  • sudo pvs, vgs, lvs 세 명령어 모두 정상 출력이 나왔는가?
  • mount -a 후 'fstab 검증 OK' 메시지가 출력됐는가?

lvextend로 운영 중 볼륨 50% 확장

목표

서비스가 실행 중인 상태에서 /app(ext4, 15G)을 약 50% 확장(+7.5G)하고 파일시스템이 새 공간을 인식하도록 합니다.

로컬 터미널
mkdir -p /tmp/linux-master/part1/lvm
# 실습용 가상 디스크 이미지 생성
dd if=/dev/zero of=/tmp/linux-master/part1/lvm/vdisk1.img bs=1M count=1024 2>/dev/null
dd if=/dev/zero of=/tmp/linux-master/part1/lvm/vdisk2.img bs=1M count=1024 2>/dev/null
dd if=/dev/zero of=/tmp/linux-master/part1/lvm/vdisk3.img bs=1M count=1024 2>/dev/null
# 루프백 장치 연결
LOOP1=$(sudo losetup -f --show /tmp/linux-master/part1/lvm/vdisk1.img)
LOOP2=$(sudo losetup -f --show /tmp/linux-master/part1/lvm/vdisk2.img)
LOOP3=$(sudo losetup -f --show /tmp/linux-master/part1/lvm/vdisk3.img)
echo "루프백 장치 생성됨: $LOOP1, $LOOP2, $LOOP3"
echo "이 장치들을 PV로 사용합니다."

확장 전 상태 확인

로컬 터미널
df -hT /app
Filesystem                      Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg_practice-lv_app  ext4   15G  8.2G  5.8G  59% /app
로컬 터미널
sudo vgs vg_practice
  VG          #PV #LV #SN Attr   VSize   VFree
  vg_practice   2   2   0 wz--n- <20.00g    0
로컬 터미널
# VG 여유 공간이 없으면 새 PV를 추가하여 vgextend 필요
sudo pvcreate /dev/sdc
sudo vgextend vg_practice /dev/sdc

sudo vgs vg_practice
  VG          #PV #LV #SN Attr   VSize   VFree
  vg_practice   3   2   0 wz--n- <40.00g <20.00g

LV 및 파일시스템 확장 (ext4)

로컬 터미널
# LV 크기 확장 (+7.5G)
sudo lvextend -L +7.5G /dev/vg_practice/lv_app
  Size of logical volume vg_practice/lv_app changed from 15.00 GiB to 22.50 GiB.
  Logical volume vg_practice/lv_app successfully resized.
로컬 터미널
# ext4 파일시스템 온라인 확장 (언마운트 불필요)
sudo resize2fs /dev/vg_practice/lv_app
resize2fs 1.46.5
Filesystem at /dev/vg_practice/lv_app is mounted on /app; on-line resizing required
The filesystem on /dev/vg_practice/lv_app is now 5898240 (4k) blocks long.
로컬 터미널
df -hT /app
Filesystem                      Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg_practice-lv_app  ext4   23G  8.2G   14G  37% /app

XFS 볼륨 확장

로컬 터미널
sudo lvextend -L +3G /dev/vg_practice/lv_log

# XFS는 마운트 포인트 지정 (마운트 상태 필수)
sudo xfs_growfs /log
data blocks changed from 1310720 to 2097152

문제 상황

LVM 볼륨을 마운트하고 서버를 재부팅했더니 /app 디렉터리가 비어 있습니다. 데이터는 손실되지 않았지만 마운트가 해제된 상태입니다.

로컬 터미널
df -h
# /app 항목 없음

ls /app
# (비어 있음 — 언마운트 상태)

원인 분석

sudo mount 명령으로 수동 마운트했지만 /etc/fstab에 등록하지 않은 경우입니다. fstab에 없는 마운트는 재부팅 시 자동으로 복원되지 않습니다.

로컬 터미널
cat /etc/fstab
# lv_app 항목 없음 확인됨

해결 방법

로컬 터미널
# 1. LV의 UUID 확인
sudo blkid /dev/vg_practice/lv_app
# /dev/mapper/vg_practice-lv_app: UUID="b1c2d3e4-f5a6-..." TYPE="ext4"

# 2. fstab에 항목 추가
echo '/dev/vg_practice/lv_app  /app  ext4  defaults  0  2' \
  | sudo tee -a /etc/fstab

# 3. fstab 문법 검증 (오류 시 다음 부팅 불능 위험)
sudo mount -a
# 오류 없으면 정상

# 4. 확인
df -hT /app

예방 포인트

  • mount 명령 실행 후 항상 fstab 등록 여부를 확인합니다
  • fstab 수정 후 반드시 sudo mount -a로 문법을 검증합니다
  • LVM 장치명(/dev/vg/lv) 또는 UUID 모두 사용 가능하나 UUID 방식이 더 안전합니다

문제 상황

XFS로 포맷된 LV를 확장한 뒤 resize2fs를 실행했더니 오류가 발생합니다.

로컬 터미널
sudo lvextend -L +5G /dev/vg_practice/lv_log
sudo resize2fs /dev/vg_practice/lv_log
resize2fs 1.46.5
resize2fs: Bad magic number in super-block
while trying to open /dev/vg_practice/lv_log
Couldn't find valid filesystem superblock.

원인 분석

resize2fs는 ext2/ext3/ext4 전용 도구입니다. XFS 파일시스템에는 사용할 수 없습니다.

로컬 터미널
# 파일시스템 유형 확인
sudo blkid /dev/vg_practice/lv_log
# TYPE="xfs"

df -T /log
# Type: xfs

해결 방법

로컬 터미널
# XFS는 xfs_growfs 사용, 마운트 포인트 지정
sudo xfs_growfs /log
data blocks changed from 1835008 to 3145728

파일시스템별 확장 명령 정리

파일시스템확장 명령특이사항
ext4resize2fs <장치>온라인(마운트 상태) 또는 오프라인 모두 가능
xfsxfs_growfs <마운트포인트>반드시 마운트된 상태에서 실행
btrfsbtrfs filesystem resize max <마운트포인트>마운트 포인트 기준

💼
실무 맥락
현업 패턴

상황

운영 중인 PostgreSQL DB 서버의 /var/lib/postgresql 볼륨 사용률이 92%에 달했습니다. DB를 중단하면 서비스 장애가 발생하는 상황에서 디스크를 확장해야 합니다.

조치 절차

로컬 터미널
# 1. 현재 상태 확인
df -hT /var/lib/postgresql
Filesystem                    Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg_db-lv_pgdata   ext4  200G  184G  7.5G  92% /var/lib/postgresql
로컬 터미널
# 2. VG 여유 공간 확인 (0이면 새 디스크 필요)
sudo vgs vg_db
# VFree: 0

# 3. 클라우드/VMware 콘솔에서 새 디스크 /dev/sdd 연결 후
lsblk | grep sdd
# sdd  8:48  0  100G  0 disk

# 4. 새 PV 생성 및 VG 확장
sudo pvcreate /dev/sdd
sudo vgextend vg_db /dev/sdd

# 5. LV 온라인 확장 (100GB 추가, DB 중단 없음)
sudo lvextend -L +100G /dev/vg_db/lv_pgdata

# 6. 파일시스템 온라인 확장 (DB 서비스 실행 중)
sudo resize2fs /dev/vg_db/lv_pgdata

# 7. 결과 확인
df -hT /var/lib/postgresql
Filesystem                    Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg_db-lv_pgdata   ext4  296G  184G   98G  66% /var/lib/postgresql

현업 포인트

  • LVM 없이 일반 파티션으로 구성된 서버라면 동일 상황에서 DB를 중단하고 데이터를 마이그레이션해야 합니다
  • 처음 서버 구성 시 데이터 볼륨을 LVM으로 구성하는 것이 운영 유연성 확보의 핵심입니다
  • 클라우드 환경(AWS EBS, GCP Persistent Disk)에서도 동일한 LVM 확장 절차가 적용됩니다
  • 확장 전 스냅샷(lvcreate -s)으로 안전망을 확보하는 것이 운영 모범 사례입니다

정리

핵심 개념 요약

주제핵심 내용
MBR vs GPTMBR: 주 파티션 최대 4개, 2TB 한계 / GPT: 128개 파티션, 2TB 이상 지원
fdisk 핵심 키n=생성, d=삭제, p=출력, t=타입(8e=LVM), w=저장, q=취소
parted 장점GPT 완전 지원, -s 옵션으로 스크립트 자동화
/etc/fstabUUID 사용 권장, 수정 후 mount -a로 검증 필수
LVM 생성 순서pvcreatevgcreatelvcreatemkfsmount
온라인 확장 ext4lvextend -L +크기 장치resize2fs 장치
온라인 확장 xfslvextend -L +크기 장치xfs_growfs 마운트포인트
LVM 스냅샷lvcreate -s (COW 방식), lvconvert --merge로 복원

자주 사용하는 명령어 치트시트

로컬 터미널
# 디스크/파티션 정보 확인
lsblk                           # 블록 디바이스 트리 표시
sudo fdisk -l /dev/sdb          # 파티션 테이블 출력
sudo parted /dev/sdb print      # parted로 파티션 정보 확인
sudo blkid                      # UUID 및 파일시스템 유형 확인

# LVM 상태 확인
sudo pvs && sudo vgs && sudo lvs  # 전체 LVM 구성 요약

# LVM 확장 (ext4)
sudo lvextend -L +5G /dev/vg/lv
sudo resize2fs /dev/vg/lv

# LVM 확장 (xfs)
sudo lvextend -L +5G /dev/vg/lv
sudo xfs_growfs /마운트포인트

지식 확인

퀴즈 — 5문제

Q1

MBR(Master Boot Record) 파티션 테이블에서 주 파티션(Primary Partition)의 최대 개수는 몇 개인가요?

Q2

LVM 구성 순서에서 pvcreate 완료 후 vgcreate 실행 전에는 실행할 수 없는 명령은 무엇인가요?

Q3

ext4 파일시스템이 마운트된 LV(논리 볼륨)를 온라인 상태에서 확장하는 올바른 명령 순서는 무엇인가요?

Q4

/etc/fstab에서 장치명(/dev/sdb1) 대신 UUID를 사용하는 주된 이유는 무엇인가요?

Q5

fdisk와 parted의 가장 중요한 기능적 차이점은 무엇인가요?

0 / 5 답변

이것도 배워보세요

linux-master중급 · 65
[Linux] 부팅 프로세스와 systemd
Linux-master 트랙 계속