Profile picture

[Linux] LVM 설치 및 구성하기

JaehyoJJAng2023년 06월 17일

▶︎ 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을 나누어 실제 사용하는 볼륨

image


▶︎ LVM 설치

Ubuntu: 18.04 기준

$ sudo apt-get install -y lvm2 # LVM 설치

CentOS 7 기준

$ yum install -y lvm2 # LVM 설치
$ rpm -qa | grep 'lvm' # 설치 되었는지 확인

▶︎ LVM 구성

  • LVM을 구성하기 위해 하드디스크 1GB짜리를 3개 추가

a. 디스크 목록

lsblk | grep "sd.*" | tail -n 3

sdb               8:16   0    1G  0 disk
sdc               8:32   0    1G  0 disk
sdd               8:48   0    1G  0 disk

# 또는

fdisk -l | grep "Disk /dev/sd.*" | tail -n 3

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

‣ 파티션 생성

fdisk 명령어를 통해 /dev/sdb, /dev/sdc, /dev/sdd 디스크에 대해 파티션을 생성하도록 하자

# fdisk /dev/디스크이름
$ fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x6e621bb5.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151):
Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x6e621bb5

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2097151     1047552   8e  Linux LVM

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
옵션 설명
n 새로운 파티션 분할
p primary 파티션 선택
1 파티션 번호 1 선택
First Cylinder 시작 실린더 번호
Last Cylinder 마지막 실런더 번호
t 파일시스템 유형 선택
8e Linux LVM
p 설정 내용 확인
w 설정 저장

파티션 목록 조회하기

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

‣ 물리 볼륨 생성

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

‣ 볼륨 그룹 생성

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

‣ 논리 볼륨 생성

총 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

‣ 논리 볼륨 경로

a. 생성된 논리 볼륨 경로 확인하기

# 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.xfs /dev/vg_data/lv1
mkfs.xfs /dev/vg_data/lv2
mkfs.xfs /dev/vg_data/lv3

‣ 마운트

a. 마운트 포인트 생성

$ mkdir /my-data{1..3}

b. /my-data 와 마운트

$ mount /dev/mapper/vg_data-lv1 /my-data1
$ mount /dev/mapper/vg_data-lv2 /my-data2
$ mount /dev/mapper/vg_data-lv3 /my-data3

c. 마운트 확인

$ df -h | tail -n 3
/dev/mapper/vg_data-lv3 1009M   33M  977M   4% /my-data
/dev/mapper/vg_data-lv1 1014M   33M  982M   4% /my-data1
/dev/mapper/vg_data-lv2 1014M   33M  982M   4% /my-data2

▶︎ /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

▶︎ display command

Physical volume, Volume group, Logical volume 의 상세정보를 display를 사용하여 확인해볼 수 있다.

# PV 상세정보
$ sudo pvdisplay

# VG 상세정보
$ sudo vgdisplay

# LV 상세정보
$ sudo lvdisplay

Loading script...