Logical Volume Management(LVM)이란?
LVM은 Logical Volume Management의 약자로 디스크 공간을 동적으로 관리할 수 있는 Linux 운영 체제의 기능입니다. LVM은 물리적 Disk와 파일 시스템 간에 추상화 계층을 제공하며, 유연하고 확장 가능한 방식으로 Disk공간을 관리할 수 있도록 지원합니다. LVM을 사용하면 여러 논리 볼륨을 생성하고 물리적 스토리지 디바이스를 더 작은 부분으로 분할하여 별도의 논리 볼륨으로 관리할 수 있습니다. 이렇게 하면 디스크 공간을 보다 쉽게 관리할 수 있으며 운영 체제를 다시 설치하지 않고도 시스템에 스토리지를 추가할 수 있습니다.
LVM의 특징
- 유연성: LVM을 사용하면 파일 시스템이나 저장된 데이터에 영향을 주지 않고 논리적 볼륨을 생성, 크기 조정 및 삭제할 수 있습니다. 따라서 변화하는 스토리지 요구사항에 쉽게 적응할 수 있습니다.
- 확장성: LVM을 사용하면 여러 물리적 스토리지 디바이스를 단일 논리 볼륨으로 결합하여 필요에 따라 시스템에 스토리지를 쉽게 추가할 수 있습니다.
- 성능: LVM을 사용하여 여러 물리적 스토리지 장치에 걸쳐 데이터를 스트라이핑할 수 있으므로 I/O 성능이 향상됩니다.
- 스냅샷: LVM을 사용하면 논리 볼륨의 스냅샷을 생성할 수 있으며, 이 스냅샷은 백업 또는 재해 복구용으로 사용할 수 있습니다.
- 향상된 Disk 관리: LVM은 Disk 공간을 관리하는 편리하고 유연한 방법을 제공하므로 Disk 관리 작업을 단순화하고 Disk 공간 부족 가능성을 줄일 수 있습니다.
- 운영 체제 독립성: LVM은 운영 체제에 구애받지 않는 기능으로, 특정 운영 체제에 연결되지 않습니다. 이렇게 하면 호환성 문제를 걱정하지 않고 시스템 간에 논리적 볼륨을 이동할 수 있습니다.
LVM의 구조
LVM의 구조는 다음과 같은 몇 가지 다른 구성 요소로 구성됩니다.
- Physical Volume(물리 볼륨)=PV: 물리 볼륨은 LVM에서 사용하는 실제 Disk 저장 장치입니다. 디스크 파티션 또는 전체 디스크가 될 수 있습니다. LVM에서 디스크를 사용하려면 우선 PV로 초기화 해야합니다. 즉, 디스크 내 파티션들을 LVM에서 사용 할 수 있게 변환이 필요합니다.
- Volume Group(볼륨 그룹)=VG: 볼륨 그룹은 단일 엔터티로 관리되는 물리적 볼륨의 모음입니다. 여러 물리적 볼륨을 단일 볼륨 그룹으로 결합하여 보다 크고 유연한 스토리지 풀을 생성할 수 있습니다.
- Logical Volume(논리 볼륨)=LV: 논리적 볼륨은 LVM의 구성 요소입니다. 볼륨 그룹 내에 생성되며 기존 디스크 관리 시스템의 디스크 파티션과 동일합니다. 논리적 볼륨은 필요에 따라 동적으로 크기를 조정, 생성 및 삭제할 수 있습니다.
- File Systems(파일 시스템)=FS: 파일 시스템은 논리적 볼륨 위에 생성되며 데이터를 저장하는 데 사용되는 구조입니다.
LVM은 물리적 스토리지 디바이스와 그 위에 구축된 파일 시스템 간에 추상화 계층을 제공합니다. 따라서 Disk 공간을 동적으로 관리하고 변화하는 요구사항에 쉽게 적응할 수 있는 유연하고 확장 가능한 스토리지 솔루션을 만들 수 있습니다.
LVM 생성(추가) 방법 - example
해당 챕터에서는 새 파티션 생성/PV/VG/LV 생성 및 Mount 까지 진행하여 신규 LVM 구성 프로세스에 대해 실습합니다.
*목표: 20GiB 새 파티션 생성 / 신규VG: VG01 / 신규LV: Lv_data
1) 먼저 lsblk 명령어로 서버의 블록장치 리스트를 확인
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 59G 0 part
├─VG00-lv_root 253:0 0 30G 0 lvm /
├─VG00-lv_swap 253:1 0 2G 0 lvm [SWAP]
├─VG00-lv_sw 253:2 0 10G 0 lvm /sw
├─VG00-lv_var_crash 253:3 0 4G 0 lvm /var/crash
├─VG00-lv_home 253:4 0 8G 0 lvm /home
└─VG00-lv_log 253:5 0 5G 0 lvm /log
sr0 11:0 1 1024M 0 rom
/dev/sda2 물리볼륨 밑에 VG00이라는 볼륨그룹 밑에 여러 lv_* 로 나타나는 논리볼륨들이 생성되어 있는 것을 볼 수 있습니다.
2) fdisk -l 명령어로 추가할 디스크 확인
[root@localhost ~]# fdisk -l
Disk /dev/sda: 60 GiB, 64424509440 bytes, 125829120 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb057974b
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 2099199 2097152 1G 83 Linux
/dev/sda2 2099200 125829119 123729920 59G 8e Linux LVM
Disk /dev/mapper/VG00-lv_root: 30 GiB, 32212254720 bytes, 62914560 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 /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
우리는 LVM을 추가 생성해야할 디스크 /dev/sdb 20GiB를 확인 할 수 있습니다.
3) fdisk로 추가된 디스크를 LVM type으로 파티셔닝 진행
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.37.4).
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.
Created a new DOS disklabel with disk identifier 0x57f5eac2.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039):
Created a new partition 1 of type 'Linux' and of size 20 GiB.
Command (m for help): t
Selected partition 1
Hex code or alias (type L to list all): 8e
Changed type of partition 'Linux' to 'Linux LVM'.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
fdisk /dev/sdb로 파티셔닝 시작 → n(새 파티션 생성) → 파티션 type: p → 파티션넘버: 1(default 선택) → 첫번째 섹터: Enter키(default) → 마지막 섹터: Enter키(default) ▶▶ 새로운 파티션 생성
Command (m for help) : t(type 설정) → 8e( Linux LVM type) → w(write: 저장) ▶▶ 생성된 파티션 타입을 LVM으로 지정
LVM 형태의 dev/sdb1라는 파티션이 생성되었습니다.
[root@localhost ~]# fdisk -l
...
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 41943039 41940992 20G 8e Linux LVM
4) PV(물리 볼륨) 생성
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VG00 lvm2 a-- <59.00g 0
pvs 명령어로 기존 PV를 확인해보면 /dev/sda2만 존재하며 /dev/sdb1에 대한 PV 생성이 필요합니다.
#pvcreate[장치 파티션 경로]
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VG00 lvm2 a-- <59.00g 0
/dev/sdb1 lvm2 --- <20.00g <20.00g
💡 LVM 형태의 dev/sdb1라는 20GiB 파티션이 생성된 것을 확인할 수 있습니다.
5) VG(볼륨 그룹 생성)
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VG00 1 6 0 wz--n- <59.00g 0
vgs 명령어로 생성된 VG를 확인 할 수 있으며, 새로운 VG를 생성합니다.
#vgcreate [VG명] [PV1]
[root@localhost ~]# vgcreate VG01 /dev/sdb1
Volume group "VG01" successfully created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VG00 1 6 0 wz--n- <59.00g 0
VG01 1 0 0 wz--n- <20.00g <20.00g
💡 VG01이라는 새로운 VG가 추가되었습니다.
6) LV(논리 볼륨) 생성
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_home VG00 -wi-ao---- 8.00g
lv_log VG00 -wi-ao---- 5.00g
lv_root VG00 -wi-ao---- 30.00g
lv_sw VG00 -wi-ao---- <10.00g
lv_swap VG00 -wi-ao---- 2.00g
lv_var_crash VG00 -wi-ao---- 4.00g
lvs 명령어로 기존에 생성되어있는 LV리스트를 확인할 수 있습니다.
#lvcreate -L [볼륨용량] -n [LV명] [VG명] **▶****▶ 필요한 용량을 배분하는 경우**
#lvcreate -l 100%FREE -n [LV명] [VG명]▶▶ VG볼륨에 남아있는 용량 전부를 배분할 경우
root@localhost ~]# lvcreate -L 20G -n lv_data VG01
or
[root@localhost ~]# lvcreate -l 100%FREE -n lv_data VG01
Logical volume "lv_data" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_home VG00 -wi-ao---- 8.00g
lv_log VG00 -wi-ao---- 5.00g
lv_root VG00 -wi-ao---- 30.00g
lv_sw VG00 -wi-ao---- <10.00g
lv_swap VG00 -wi-ao---- 2.00g
lv_var_crash VG00 -wi-ao---- 4.00g
lv_data VG01 -wi-a----- <20.00g
💡 VG01이라는 볼륨그룹 내에 lv_data 라는 새로운 LV가 추가 되었습니다.
7) 생성된 LV 확인
[root@localhost ~]# fdisk -l
...
Disk /dev/mapper/VG01-lv_data: 20 GiB, 21470642176 bytes, 41934848 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
8) LV를 마운트할 폴더 생성
#mkdir /data
9) 추가한 LV 포멧
#mkfs.[파일시스템유형] [경로] ▶▶ 보통 ext4 or xfs 파일시스템 유형을 주로 사용함
[root@localhost ~]# mkfs.xfs /dev/VG01/lv_data
meta-data=/dev/VG01/lv_data isize=512 agcount=4, agsize=1310464 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
data = bsize=4096 blocks=5241856, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
10) 추가한 LV 마운트
#mount /dev/[VG명]/[LV명] [마운트할 폴더]
[root@localhost /]# mount /dev/VG01/lv_data /data
[root@localhost /]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 733M 12M 722M 2% /run
/dev/mapper/VG00-lv_root 30G 3.6G 27G 12% /
/dev/mapper/VG00-lv_home 8.0G 90M 8.0G 2% /home
/dev/mapper/VG00-lv_log 5.0G 68M 5.0G 2% /log
/dev/mapper/VG00-lv_sw 10G 104M 9.9G 2% /sw
/dev/mapper/VG00-lv_var_crash 4.0G 61M 4.0G 2% /var/crash
/dev/sda1 1014M 246M 769M 25% /boot
tmpfs 367M 4.0K 367M 1% /run/user/0
/dev/mapper/VG01-lv_data 20G 175M 20G 1% /data
💡df -h 명령어로 Mount포인트가 /data로 지정된 LVM을 확인할 수 있습니다.
11) fstab으로 LVM 자동 마운트 설정
/etc/fstab 내에 경로 / 파일시스템 유형 / defaults 0 0 저장
#systemctl daemon-reload
[root@localhost /]# vi /etc/fstab
# /etc/fstab
# Created by anaconda on Mon Feb 6 13:34:32 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/VG00-lv_root / xfs defaults 0 0
/dev/mapper/VG00-lv_home /home xfs defaults 0 0
/dev/mapper/VG00-lv_log /log xfs defaults 0 0
/dev/mapper/VG00-lv_sw /sw xfs defaults 0 0
/dev/mapper/VG00-lv_var_crash /var/crash xfs defaults 0 0
/dev/mapper/VG00-lv_swap none swap defaults 0 0
/dev/mapper/VG01-lv_data /data xfs defaults 0 0
'OS > Linux' 카테고리의 다른 글
🛠[TroubleShooting] root password reset 방법 (0) | 2024.06.23 |
---|---|
🛠[TroubleShooting] Failed to start firewalld : dynamic firewall daemon (0) | 2024.02.05 |
ls명령어 옵션 (0) | 2021.10.24 |
CP(Copy) 명령어 및 옵션 (0) | 2021.10.24 |
파이프, 필터, 리디렉션 (0) | 2021.07.28 |
SysAdmin 메모장📑
안녕하세요. System Engineer를 꿈꾸며 끄적이는 메모장입니다.