LVM 이란?
- 여러 개의 물리 디스크를 합쳐서 하나의 파일 시스템으로 구성
- 서버 운영에 있어서 작은 용량의 HDD를 하나로 합쳐 대용량의 스토리지를 구성할 떄 사용
- 스토리지 확장 및 변경사항에 있어 유연한 대처 및 관리가 가능해짐
LVM(Logical Volume Manager) 는 Linux의 저장 공간을 효율적이고 유연하게 관리하기 위한 Kernel의 한 부분이다.
그렇다면 LVM과 일반 디스크 파티셔닝은 어떤 차이점을 가지고 있을까?
LVM 방식이 아닌 기존 방식의 경우
HDD를 파티셔닝(partitioning) 한 뒤, OS 영역에 마운트하여 R/W(Read/Write) 해주는 방식인데
LVM은 파티션 대신 Volume 이라는 단위로 저장 장치를 다룬다.
이런 방식을 사용하기 때문에 LVM은 스토리지의 확장/변경에 매우 유연하다.
용어
- Physical Volume: 물리적인 볼륨을 뜻하며,
/dev/sdb1
,/dev/sdc1
과 같은 실제 파티션을 의미 - Volume Group: Physical Volume을 합친 그룹을 의미함
- Logical Volume: 합쳐진 Volume Group을 나누어 실제 사용하는 볼륨
LVM 설치
LVM을 설치하는 방법은 다음과 같다.
Ubuntu: 18.04 기준
$ sudo apt-get install -y lvm2 # LVM 설치
CentOS 7 기준
$ yum install -y lvm2 # LVM 설치
$ rpm -qa | grep 'lvm' # 설치 되었는지 확인
LVM 구성하기
그럼 이제 어떻게 LVM을 구성하는지 공부해보자.
사전 준비
- LVM을 구성하기 위해 하드디스크 1GB짜리를 3개 추가
디스크 확인: /dev/sdb
, /dev/sdc
, /dev/sdd
lsblk
sdb 8:16 0 1G 0 disk
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
# 또는
fdisk -l
Disk /dev/sdd: 1073 MB, 1073741824 bytes, 2097152 sectors
Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
LVM 설치
sudo apt update -y
sudo apt install lvm2 -y
파티션 생성
fdisk
또는parted
로 빈 디스크에 LVM 용 파티션을 생성해줘야 한다.type=8e
parted
명령어를 통해 /dev/sdb
, /dev/sdc
, /dev/sdd
디스크에 대해 파티션을 생성하도록 하자
sudo parted /dev/sdb mklabel gpt
sudo parted -a optimal /dev/sdb mkpart primary 0% 100%
sudo parted /dev/sdb set 1 lvm on
# ... /dev/sdc /dev/sdd에도 동일하게 위 작업 진행
파티션 목록 조회하기
lsblk | grep "sd.*" | tail -n 6
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 1023M 0 part
sdc 8:32 0 1G 0 disk
└─sdc1 8:33 0 1023M 0 part
sdd 8:48 0 1G 0 disk
└─sdd1 8:49 0 1023M 0 part
fdisk vs parted
실무에서는 fdisk
, parted
둘 다 자주 쓰이는 명령어지만
필자는 parted
명령어를 사용해 파티션을 구성하는 것을 더 추천한다.
그 이유를 다음과 같이 정리해봤다.
구분 | fdisk | parted |
---|---|---|
지원하는 파티션 테이블 | MBR 위주 (최신 fdisk는 GPT도 지원함) | GPT·MBR 모두 네이티브 지원 |
대용량 디스크 지원 | 2TB 이하 MBR이 한계임, GPT 지원 시에도 그 사용법이 조금 복잡함 | 스크립트·비대화식 모드에서 대용량 디스크(GPT) 다루기 편리 |
사용성 | 간단·경량, 거의 모든 리눅스에 기본 탑재 | 기능이 많아 약간 학습 필요하지만, 한 번 익히면 더 유연하게 사용 가능 |
자동화·스크립트 | 상호작용형이 기본, 자동화하려면 sfdisk 등 별도 도구 필요 | 비대화식(non-interactive ) 모드로 명령 단일화 → 배치 스크립트에 용이 |
리사이즈 | 파티션 생성/삭제만 지원함, 이동·크기 조정은 별도 도구 필요 | 파티션 이동·크기 조정 기능 내장 |
요즘 서버 스토리지는 4TB, 8TB 이상이 일반적이지 않나?
parted
는 GPT를 네이티브로 지원하면서 큰 디스크를 다루는데 제약이 없다.
또한, 파티션 생성뿐 아니라 리사이즈, 이동, 삭제, 클래스 변경까지 통합으로 지원하고 있어 별도 유틸리티 설치 없이 parted
하나로 해결할 수가 있으니 parted
를 사용하도록 하자.
물리 볼륨(PV) 생성
a. pvcreate
명령으로 /dev/파티션이름
에 대해 물리 볼륨 생성하기
pvcreate /dev/sd{b,c,d}1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdd1" successfully created.
b. blkid로 물리 볼륨이 정상적으로 생성 되었는지 확인
blkid | grep "sd.*" | tail -n 3
/dev/sdd1: UUID="FhofjA-bGLM-7PdQ-PV3k-1x9z-M95P-o1Ceky" TYPE="LVM2_member"
/dev/sdc1: UUID="WkHqj8-EKfX-4229-xh2B-HEPy-rT8R-tXFBXs" TYPE="LVM2_member"
/dev/sdb1: UUID="Ik4WV5-zQUZ-zVjb-ryfI-4BXX-tgFI-CzYUDi" TYPE="LVM2_member"
c. 물리 볼륨 목록 출력
pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <37.00g 0
/dev/sdb1 vg_data lvm2 a-- 1020.00m 1020.00m
/dev/sdc1 vg_data lvm2 a-- 1020.00m 1020.00m
/dev/sdd1 vg_data lvm2 a-- 1020.00m 1020.00m
볼륨 그룹(VG) 생성
vgcreate vg_data /dev/sdb1 /dev/sdc1 /dev/sdd1
Volume group "vg_data" successfully created
a. 볼륨 그룹 목록 출력
vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <37.00g 0
vg_data 3 0 0 wz--n- <2.99g <2.99g
논리 볼륨(LV) 생성
총 3GB의 디스크를 1GB, 1GB, 마지막은 전체를 사용하겠다는 의미
이렇게 총 3가지의 논리 볼륨을 생성하자
lvcreate --size 1G --name lv1 vg_data
lvcreate --size 1G --name lv2 vg_data
lvcreate --extents 100%FREE --name lv3 vg_data
a. 논리 볼륨 목록 출력
lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <35.00g
swap centos -wi-ao---- 2.00g
lv1 vg_data -wi-a----- 1.00g
lv2 vg_data -wi-a----- 1.00g
lv3 vg_data -wi-a----- 1012.00m
b. 생성된 논리 볼륨 경로 확인하기
# LV 탐색
$ find /dev -name "lv?" -type l 2>/dev/null
/dev/vg_data/lv3
/dev/vg_data/lv2
/dev/vg_data/lv1
# PV 탐색
$ find / -name "vg_data-lv?" -type l 2>/dev/null
/dev/mapper/vg_data-lv3
/dev/mapper/vg_data-lv2
/dev/mapper/vg_data-lv1
# 블록 디바이스 조회
$ blkid
/dev/mapper/vg_data-lv1: UUID="5422c4bd-6554-45cd-a3b8-7500e8ac86d1" TYPE="xfs"
/dev/mapper/vg_data-lv2: UUID="2f0ab1d1-8717-40cb-bb96-dd0b9e71e959" TYPE="xfs"
/dev/mapper/vg_data-lv3: UUID="0cc198cc-cb3e-4a8f-a92b-6a26f60950d6" TYPE="xfs"
파일시스템 생성
각 LV의 File System을 ext4로 포맷
mkfs.ext4 /dev/vg_data/lv1
mkfs.ext4 /dev/vg_data/lv2
mkfs.ext4 /dev/vg_data/lv3
마운트
a. 마운트 포인트 생성
mkdir /my-data{1..3}
b. /my-data 와 마운트
mount /dev/vg_data/lv1 /my-data1
mount /dev/vg_data/lv2 /my-data2
mount /dev/vg_data/lv3 /my-data3
c. 마운트 확인
$ df -h | tail -n 3
/dev/vg_data/lv1 1009M 33M 977M 4% /my-data1
/dev/vg_data/lv2 1014M 33M 982M 4% /my-data2
/dev/vg_data/lv3 1014M 33M 982M 4% /my-data3
/etc/fstab 등록
서버 재시작 시 자동으로 마운트 해주기 위하여 /etc/fstab
에 파티션 정보를 기록해주자.
1. blkid
명령어로 마운트 하려는 디바이스의 blkid 추출
sudo blkid | grep -E "lv1|lv2|lv3" | awk '{print $2}'
UUID="abd924dc-abb8-49f9-b728-fdac288e1b09"
UUID="d7beedce-23e5-43cf-ab8b-77cd8ebf7645"
UUID="dffgreeq-bbof-21oe-erqa-fferwrgooe33"
2. /etc/fstab에 파티션 정보 기록
vim /etc/fstab
...
UUID=<위에서 추출한 UUID 입력> 마운트할_디렉터리_경로 파일시스템_유형 마운트_옵션 백업_순서 검사_순서
UUID=abd924dc-abb8-49f9-b728-fdac288e1b09 /my-data1 xfs defaults 0 2
UUID=d7beedce-23e5-43cf-ab8b-77cd8ebf7645 /my-data2 xfs defaults 0 2
UUID=dffgreeq-bbof-21oe-erqa-fferwrgooe33 /my-data3 xfs defaults 0 2
기존 LVM에 디스크 확장하는 방법
- 서버에 새롭게 디스크 1개(
/dev/sde
)가 추가되었다고 가정.
1. 새 디스크 파티션 준비
sudo parted /dev/sde mklabel gpt
sudo parted -a optimal /dev/sdd mkpart primary 0% 100%
sudo parted /dev/sde set 1 lvm on
sudo pvcreate /dev/sde1
2. VG에 PV 추가하기
sudo vgextend vg_data /dev/sde1
sudo vgs # Free PE 증가 확인
3. LV 확장하기
sudo lvextend -L +20G /dev/vg_data/lv_storage
4. 파일시스템 크기 조정하기
etx4
기준임.
sudo resize2fs /dev/vg_data/lv_storage
df -h /mnt/storage # 확장 확인
트러블슈팅 커맨드
상황 | 명령어 및 설명 | |
---|---|---|
PV/VG/LV 정보 조회 | pvs / vgs / lvs |
|
상세 정보 | pvdisplay / vgdisplay / lvdisplay |
|
볼륨 그룹 용량 확인 | vgdisplay vg_data |
grep 'Free' |
스냅샷 생성 | lvcreate -L1G -s -n lv_snap /dev/vg_data/lv_storage |
|
스냅샷 병합/삭제 | lvremove /dev/vg_data/lv_snap |
|
LV 확장/축소 | lvextend -L+10G /dev/vg_data/lv_storage resize2fs /dev/vg_data/lv_storage |
|
디스크 고장 시 복구 | 하드웨어 RAID가 아닌 LVM 단독 구성일 때, 손상 PV 제거 후 vgreduce |
|
파일시스템 복구 | fsck.ext4 /dev/vg_data/lv_storage |