OS/Linux

📖Logical Volume Management(LVM)정의 및 생성 방법

S.A.H 2023. 2. 7. 00:20
반응형

Logical Volume Management(LVM)이란?

LVMLogical Volume Management의 약자로 디스크 공간을 동적으로 관리할 수 있는 Linux 운영 체제의 기능입니다. LVM은 물리적 Disk와 파일 시스템 간에 추상화 계층을 제공하며, 유연하고 확장 가능한 방식으로 Disk공간을 관리할 수 있도록 지원합니다. LVM을 사용하면 여러 논리 볼륨을 생성하고 물리적 스토리지 디바이스를 더 작은 부분으로 분할하여 별도의 논리 볼륨으로 관리할 수 있습니다. 이렇게 하면 디스크 공간을 보다 쉽게 관리할 수 있으며 운영 체제를 다시 설치하지 않고도 시스템에 스토리지를 추가할 수 있습니다.

LVM의 특징

  • 유연성: LVM을 사용하면 파일 시스템이나 저장된 데이터에 영향을 주지 않고 논리적 볼륨을 생성, 크기 조정 및 삭제할 수 있습니다. 따라서 변화하는 스토리지 요구사항에 쉽게 적응할 수 있습니다.
  • 확장성: LVM을 사용하면 여러 물리적 스토리지 디바이스를 단일 논리 볼륨으로 결합하여 필요에 따라 시스템에 스토리지를 쉽게 추가할 수 있습니다.
  • 성능: LVM을 사용하여 여러 물리적 스토리지 장치에 걸쳐 데이터를 스트라이핑할 수 있으므로 I/O 성능이 향상됩니다.
  • 스냅샷: LVM을 사용하면 논리 볼륨의 스냅샷을 생성할 수 있으며, 이 스냅샷은 백업 또는 재해 복구용으로 사용할 수 있습니다.
  • 향상된 Disk 관리: LVM은 Disk 공간을 관리하는 편리하고 유연한 방법을 제공하므로 Disk 관리 작업을 단순화하고 Disk 공간 부족 가능성을 줄일 수 있습니다.
  • 운영 체제 독립성: LVM은 운영 체제에 구애받지 않는 기능으로, 특정 운영 체제에 연결되지 않습니다. 이렇게 하면 호환성 문제를 걱정하지 않고 시스템 간에 논리적 볼륨을 이동할 수 있습니다.

LVM의 구조

LVM의 구조는 다음과 같은 몇 가지 다른 구성 요소로 구성됩니다.

§image출처: https://sgbit.tistory.com/12

  • 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
반응형