-
Notifications
You must be signed in to change notification settings - Fork 0
Logical Volume Manager
소프트웨어쪽은 원리보다 용어를 이해하는게 더 어려운 경우가 많다. 용어 자체가 추상적인데, 그나마 줄여서 표현하기 때문이다. 특히 "논리적", "추상적" 따위의 단어가 들어가면 전혀 감이 잡히지 않는 경우가 많다.
그래서 애초에 포기해버리는 경우가 많다.
사람은 애초에 추상적인 것보다는 구체적인 것을, 논리적인 것보다는 직관적인 것을 더 잘 이해한다. 학자가 아닌 평범한 사람들이 지금 수준의 추상적인 생각을 한거는 2세기가 채 안되지 싶다. 그러니 머리에 들어올리가 만무하다.
가장 좋은 방법은 구체화하는 것이다. 구체화하는 가장 좋은 방법은 자신의 경험을 직접 글로 나타내는 것이다. 그림이 포함된다면 그보다 좋을 수 없겠다.
해서 한 시간이면, 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으로 할 수 있는 것들을 정리해보자.
- 새로운 블럭 장치를 추가할 경우, 기존 파일 시스템의 변경 없이 볼륨의 크기 조정 가능.
- 간단하게 LV를 확장 가능.
- LV로 부터 읽기 전용의 snapshot를 생성 가능.
- RAID 0처럼 PV를 2개 이상 엮어서 데이터를 읽고 쓰기가 가능. 대역폭 증가.
- 하지만 parity 기능은 없음. fault tolerance하지 않음.
- RAID 1처럼 mirror 구성을 할 수 있음.
위에서 RAID 0 처럼 PV를 엮어서 대역폭을 증가하는 방법에 대해서 알아본다.
- Linear Mapping LV: 일반적인 방식이다. 블럭 장치에 데이터를 쓰듯이 순차적으로 쓴다.
- Striped Mapping LV: 두 개의 PV를 striping해서 사용한다. PV의 PE는 적당한 크기의 조각들로 나누어지는데, LVM은 데이터를 두 PV에 분산하여 할당을 한다. 그래서 두개의 PV에서 동시에 데이터를 읽고 쓸수 있게 되어서 대역폭 증가 효과를 볼 수 있다. 물론 이런 효과를 얻을려면 PV가 독립된 장치여야 한다. 같은 장치내의 파티션이라면 오히려 역효과가 날 것이다.
서비스의 중지 없이 백업을 하려고 할 때는 백업 과정 도중 데이터의 변경을 특히 신경써야 한다. 이 문제는 Snapshot LV를 이용해서 해결할 수 있다. 이 기능을 이용하면 특정 시점의 데이터 상태를 고정할 수 있다. 고정하기 원하는 LV를 복사해서 읽기 전용의 새로운 LV를 만들면 된다.
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: 0x000000002G byte 크기의 블럭 장치가 각각 /dev/sdb, /dev/sdc에 마운트된 것을 확인할 수 있다.
현재 시스템의 physical volume을 먼저 확인해 보자.
# pvscan
No matching physical volumes found만든 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를 생성한다. lv의 그룹으로 하나 이상의 PV를 볼륨 그룹으로 묶어준다.
# vgcreate myVG /dev/sdb /dev/sdc
Volume group "myVG" successfully created이제 lv를 생성한다. 크기는 1G로 잡아준다.
# lvcreate -L 1000M myVG
Logical volume "lvol0" createdlvdisplay로 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으로 잘 생성되었음을 볼 수 있다.
이제 파일 시스템 사용하듯이 포맷하고 마운트해서 사용하면 된다.
# 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)볼륨 크기 키우기. 사용하다 보니 볼륨이 꽉찼다. LV의 크기를 500M 만큼 증가시켜 보자.
# lvextend -L+500M /dev/myVG/lvol0 /dev/sdb /dev/sdc
Extending logical volume lvol0 to 1.46 GiB
Logical volume lvol0 successfully resizedlv 크기가 확장된 것을 확인할 수 있다. 그러나 지금은 볼륨만 커진 상태이며 실제 파일 시스템은 확장되지 않은 상태이다.
# 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.마지막으로 df나 cfdisk로 파티션 크기가 실제로 증가했는지 확인하면 된다.
