▶︎ 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 설치
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