Skip to content

Logical Volume Manager

Joshua Jung edited this page Jun 2, 2014 · 2 revisions

1시간이면 LVM 이해할 수 있다

소프트웨어쪽은 원리보다 용어를 이해하는게 더 어려운 경우가 많다. 용어 자체가 추상적인데, 그나마 줄여서 표현하기 때문이다. 특히 "논리적", "추상적" 따위의 단어가 들어가면 전혀 감이 잡히지 않는 경우가 많다.

그래서 애초에 포기해버리는 경우가 많다.

사람은 애초에 추상적인 것보다는 구체적인 것을, 논리적인 것보다는 직관적인 것을 더 잘 이해한다. 학자가 아닌 평범한 사람들이 지금 수준의 추상적인 생각을 한거는 2세기가 채 안되지 싶다. 그러니 머리에 들어올리가 만무하다.

가장 좋은 방법은 구체화하는 것이다. 구체화하는 가장 좋은 방법은 자신의 경험을 직접 글로 나타내는 것이다. 그림이 포함된다면 그보다 좋을 수 없겠다.

해서 한 시간이면, LVM을 이해할 수 있도록 글과 그림으로 설명을 해볼까 한다. 그렇다고 해도 리눅스 운영체제를 어느 정도는 다룰수 있어야 하겠다.

LVM 구조

리눅스 시스템에서 Volume을 만드는 일반적인 방법은 블록 디바이스에 파일 시스템을 만들어서 사용하는 방법이 되겠다. 파일 시스템은 형식에 맞게 포맷해서 사용하면 된다. 그림으로 그려보자면 대략 아래와 같다.

블럭 장치인 /dev/sda1, /dev/sda2를 파일 시스템에 마운트 해서 사용하는 방식이다.

만약 /dev/sda1 을 /mnt/ftp에 마운트 해서 사용하고 싶다면 아래와 같이 하면 된다.

# mkfs -t ext4 /dev/sda1                 # 포맷하고
# mount -t ext4 /dev/sda2 /usr/data/ftp  # 마운트한다.

이 방식은 파일 시스템과 장치가 직접 맵핑되기 때문에 사용이 직관적이라는 장점이 있다. 하지만 하드웨어를 직접 다루는 기술들이 그렇듯이 __유연하지 않다__는 단점이 있다. 처음 /dev/sda1의 크기를 10G로 잡았는데, 용량이 부족하면 어떻게 해야 할까? 장치를 새로 마련하는 방법 밖에 없다. 장치를 여러 개 묶어서 크기를 늘리는 것도 쉬운 일이 아니다. 파티션을 나눠야 할 경우도 같다.

특히 대량의 데이터를 사용하는 일이 많은 요즘에는 disk를 함께 묶어서 단일한 거대 storage를 구성해야 할 필요성이 늘어나고 있다. 물리적인 볼륨을 논리적인 단일 볼륨으로 묶는 것이다.

이때 LVM을 사용한다. Logical이란 말은 대상을 추상화 하겠다는 것이다. File System과 블럭 디바이스 사이에 추상화 계층을 하나 더 두는 개념이다. 아래 그림을 보라.

논리적인 볼륨을 하나 만들어서 블럭 장치들을 하나로 묶었다. 그 다음 적절한 크기로 나눠서 사용하면 된다. 논리적이니 만큼 볼륨을 새로 만들거나 기존 볼륨의 크기를 늘리거나 하는 일을 자유롭게 할 수 있다. 개인이 사용한다면, 볼륨을 나누어서 사용하는 것에 관심이 있을 것이고. Cloud 쪽 일을 하는 사람이라면 볼륨을 하나로 묶는 것에 관심이 많을 것이다.

LVM이라는 것은 Logical Volume를 Managing하는 인터페이스를 제공하는 Storage 소프트웨어인 셈이다.

LVM를 좀 더 자세히 살펴 보자. LVM에서 가장 밑에 있는게 물리적 볼륨이다. 이것을 PV(Physical Volume)라고 한다. 위 그림은 2개의 PV로 구성되어 있습니다. 그리고 PV는 PE라는 블럭의 모음으로 구성된다. PE는 Physical Extents의 줄임말이다.

PV위에 VG가 있다. Volume Group의 줄임말인데, PV를 논리적으로 묶은 볼륨 그룹이다. VG는 하나 이상의 PV로 구성이 된다. 이제 LVM에 Volume을 요청하면, 요청한 크기만큼 LV를 돌려준다. 이 LV를 (/mnt/ftp 등에)마운트 해서 사용하면 된다. 만약 /mnt/ftp의 볼륨 크기를 키울려면 남는 PE를 요청해서 LV 크기를 키우면 된다.

LVM으로 할 수 있는 것들

대략 LVM으로 할 수 있는 것들을 정리해보자.

  1. 새로운 블럭 장치를 추가할 경우, 기존 파일 시스템의 변경 없이 볼륨의 크기 조정 가능.
  2. 간단하게 LV를 확장 가능.
  3. LV로 부터 읽기 전용의 snapshot를 생성 가능.
  4. RAID 0처럼 PV를 2개 이상 엮어서 데이터를 읽고 쓰기가 가능. 대역폭 증가.
  • 하지만 parity 기능은 없음. fault tolerance하지 않음.
  1. RAID 1처럼 mirror 구성을 할 수 있음.

Linear Mapping LV 와 Striped Mapping LV

위에서 RAID 0 처럼 PV를 엮어서 대역폭을 증가하는 방법에 대해서 알아본다.

  • Linear Mapping LV: 일반적인 방식이다. 블럭 장치에 데이터를 쓰듯이 순차적으로 쓴다.
  • Striped Mapping LV: 두 개의 PV를 striping해서 사용한다. PV의 PE는 적당한 크기의 조각들로 나누어지는데, LVM은 데이터를 두 PV에 분산하여 할당을 한다. 그래서 두개의 PV에서 동시에 데이터를 읽고 쓸수 있게 되어서 대역폭 증가 효과를 볼 수 있다. 물론 이런 효과를 얻을려면 PV가 독립된 장치여야 한다. 같은 장치내의 파티션이라면 오히려 역효과가 날 것이다.

Snapshot LV

서비스의 중지 없이 백업을 하려고 할 때는 백업 과정 도중 데이터의 변경을 특히 신경써야 한다. 이 문제는 Snapshot LV를 이용해서 해결할 수 있다. 이 기능을 이용하면 특정 시점의 데이터 상태를 고정할 수 있다. 고정하기 원하는 LV를 복사해서 읽기 전용의 새로운 LV를 만들면 된다.

Linux LVM

Linux에서 LVM을 테스트 해보자. 두 개의 SATA 디바이스를 추가하고 이름은 PV1 PV2, 크기는 2G byte로 설정했다.

현재 장치 상태 확인

VM을 실행한 다음 fdisk로 장치 상태를 확인.

# fdisk -l
....
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

2G byte 크기의 블럭 장치가 각각 /dev/sdb, /dev/sdc에 마운트된 것을 확인할 수 있다.

pv 확인하기

현재 시스템의 physical volume을 먼저 확인해 보자.

# pvscan 
No matching physical volumes found

만든 pv가 없으므로 당연히 뜨지 않는다.

pv 만들기

이제 pv를 만들어 보자.

# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created

다시 한번 pvscan으로 확인.

# pvscan
  PV /dev/sdb                      lvm2 [2.00 GiB]
  PV /dev/sdc                      lvm2 [2.00 GiB]
  Total: 2 [4.00 GiB] / in use: 0 [0   ] / in no VG: 2 [4.00 GiB]

vg 만들기

이제 vg를 생성한다. lv의 그룹으로 하나 이상의 PV를 볼륨 그룹으로 묶어준다.

# vgcreate myVG /dev/sdb /dev/sdc
  Volume group "myVG" successfully created

lv 만들기

이제 lv를 생성한다. 크기는 1G로 잡아준다.

# lvcreate -L 1000M myVG
  Logical volume "lvol0" created

lvdisplay로 lv 정보를 확인해 보자.

#lvdisplay 
  --- Logical volume ---
  LV Name                /dev/myVG/lvol0
  VG Name                myVG
  LV UUID                fxc9Lm-MmRh-JTg2-rt6u-2shi-KvPN-udIS73
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                1000.00 MiB
  Current LE             250
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

/dev/myVG/lvol0으로 잘 생성되었음을 볼 수 있다.

mount해서 잘 사용하기

이제 파일 시스템 사용하듯이 포맷하고 마운트해서 사용하면 된다.

# mkfs.ext4 /dev/myVG/lvol0 
# mount -t ext4 /dev/myVG/lvol0 /mnt/ftp/
# mount | grep mnt
/dev/mapper/myVG-lvo10 /mnt/ftp  type ext4 (rw)

Volume 관리하기

볼륨 크기 키우기. 사용하다 보니 볼륨이 꽉찼다. LV의 크기를 500M 만큼 증가시켜 보자.

# lvextend -L+500M /dev/myVG/lvol0 /dev/sdb /dev/sdc 
  Extending logical volume lvol0 to 1.46 GiB
  Logical volume lvol0 successfully resized

lv 크기가 확장된 것을 확인할 수 있다. 그러나 지금은 볼륨만 커진 상태이며 실제 파일 시스템은 확장되지 않은 상태이다.

# df -h
/dev/mapper/myVG-lvol0  985M   18M  918M   2% /mnt/ftp

파일 시스템을 늘려보자. 포맷하지 않고 파티션의 크기를 조절해주는 프로그램을 사용하면 된다.

# resize2fs /dev/myVG/lvol0
resize2fs 1.41.14 (22-Dec-2010)
Filesystem at /dev/myVG/lvol0 is mounted on /mnt/ftp; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/myVG/lvol0 to 384000 (4k) blocks.
The filesystem on /dev/myVG/lvol0 is now 384000 blocks long.

마지막으로 dfcfdisk로 파티션 크기가 실제로 증가했는지 확인하면 된다.

Clone this wiki locally