LVM(Logical Volumn Manager)개념과 설정

Fedora 21 설치하다가 Partitioning Scheme 목록에 LVM이라는게 있던데 궁금해서 정리


        




LVM(Logical Volume Manager)



이름에서 냄새가 나듯이 Logical Volume을 효율적이고 유연하게 관리하기 위한 커널의 한 부분이자 프로그램이다.


기존에는 파일시스템이 블록 장치에 직접 접근해서 읽고/쓰기를 했다면


LVM을 사용하면 파일 시스템이 LVM이 만든 가상의 블록 장치에 읽고/쓰기를하게 된다.



이와 같이


LVM은 물리적 스토리지 이상의 추상적 레이어를 생성해서 논리적 스토리지(가상의 블록 장치)를 생성할 수 있게 해준다.


직접적으로 물리적 스토리지를 사용하는 것보다 다양한  측면에서 유연성을 제공한다.


유연한 용량

크기 조정 가능한 스토리지 풀(Pool)

온라인 데이터 재배치

편의에 따라 장치 이름 지정

디스크 스트라이핑

미러 볼륨

볼륨 스냅샷


현재 LVM1과 LVM2가 있으며, LVM2는 LVM1이상으로 기능이 개선되었고 내용은 다음과 같다.


유연한 용량

보다 효율적인 메타데이터 스토리지

보다 향상된 복구 포멧

새로운 ASCII 메타데이터 포멧

메타데이터로 원자 변경

메타데이터의 이중 복사본


덧붙여서 LVM2는 스냅샷과 클러스터 지원을 제외하고 LVM1과 역 호환성이 있다.


vgconvert 명령어로 LVM1 포멧에서 LVM2 포멧으로 변환이 가능하다.





1. LVM 용어정리와 간단한 설명



PV(Physical Volume)

LVM에서 블록 장치를 사용하려면 PV로 초기화를 해야한다.

즉, 블록 장치 전체 또는 그 블록 장치를 이루고 있는 파티션들을

LVM에서 사용할 수 있게 변환한것이다.

예를 들어 /dev/sda1, /dev/sda2들을 LVM으로 쓰기위해 PV라는 형식으로 변환한것이다.

PV는 일정한 크기의 PE(Physical Extent)들로 구성이 된다.


※ 블록 장치 : 블록 단위로 접근하는 스토리지. 예를 들어 대용량 하드 디스크


PE(Physical Extent)

PV를 구성하는 일정한 크기의 블록으로 LVM2에서의 기본크기는 4MB이다.

LV(Logical Volume)의 LE(Logical Extent)들과 1:1로 맵핑된다.

그렇기에 항상 PE와 LE의 크기는 동일하다.


즉, 아래 그림과 같은 모습이다.

블록 장치(물리적 디스크)의 파티션들을 PV들로 초기화 시킨모습이다.

각각의 PV들은 동일한 크기의 PE들로 구성이된다.




VG(Volume Group)

PV들의 집합으로 LV를 할당할 수 있는 공간이다.

즉, PV들로 VG를 생성하는 과정은 LV로 할당할 수 있는 디스크 공간의 풀(Pool)을 생성하는것으로 보면된다.

사용자는 VG안에서 원하는데로 공간을 쪼개서 LV로 만들 수 있다.


아래 그림과 같이 위에서만든 PV들을 하나의 VG1로 묶었다.





LV(Logical Volume)

사용자가 최종적으로 다루게되는 논리적인 스토리지이다.

위에서도 언급했지만, LV를 구성하는 LE들이 PV의 PE들과 맵핑하면서 존재하게된다.


LE(Logical Extent)

LV를 구성하는 일정한 크기의 블록으로 LVM2에서 기본크기는 4MB이다.

위에서 언급했지만, 항상 PE와 LE의 크기는 동일하다.


아래 그림은 위에서 만든 VG1에서 사용자가 원하는 크기대로 분할해서 LV1과 LV2를 만든 모습이다.

꼭 VG의 모든 공간을 다 써야되는건 아니다.

각각의 LV들은 동일한 크기의 LE로 구성이되며 그림에는 표시안됬지만 PE들과 맵핑된다.






2. LVM Architecture

(1.에서 설명한것과 중복되는 내용이지만 Detail하게 적은내용)


1.


LVM에서는 LV(Logical Volume)이 다루는 기본 물리적 스토리지 단위


파티션이나 디스크 전체 같은 블록 장치이다.


LVM에서 해당 블록 장치를 사용하려면 PV(Physical Volume)로 초기화 되어야 한다.


위에서 예로 들었지만


/dev/sda1, /dev/sda2를 LVM으로  사용하기위해 PV라는 형식으로 초기화하는 것이 필요하다는 것이다.


(※ 블록 장치 : 개별 바이트 단위가 아니라 일정 크기(Block)단위로 접근하는 장치. 예를 들어 하드 디스크)




블록 장치를 PV로 초기화하면 아래 그림과 같은 구성을 가진다.



장치 시작부분에 LVM Label이 위치하며 기본적으로 2번째 Sector에 있다.


Lable에는 다음과 같은 정보가 저장된다.


PV에 해당하는 UUID(임의 고유 식별자)

Byte단위의 블록 장치의 크기

NULL로 종료되는 Data 영역 위치 목록

NULL로 종료되는 Metadata 영역 위치 목록


VG(Volume Group)의 ASCII로 쓰여진설정정보를 Metadata라고 한다.


(VG의 구성요소로써 Metadata가 존재하는것같다)


VG의 Metadata의 복사본들은 해당 VG안의 PV들의 Metadata 영역에 저장되고 관리된다.


즉, 같은 VG에 속하는 모든 PV들은 동일한 Metadata를 가지게된다.


더자세한 건

http://goo.gl/XCYAYz

Lable이랑 Metadata의 모든 구성요소 다나와있어 여기에


2.


PV로 초기화된 장치들을 VG(Volume Group)으로 통합된다.


PV들을 VG로 통합하는 과정은 LV를 생성할 수 있는 디스크 공간의 풀(Pool)을 생성하는것과 같다.


VG는 일정한 크기의 PE(Physical Extent)로 분할이된다.




VG는 LE들을 PE로 맵핑함을 통해 LV를 생성한다.



생성된 LV는 파일 시스템 및 어플리케이션(예를들어 Database)로 사용된다.


즉, 사용자가 다루게되는것은 LV라는 뜻이다.


3.


위에서 LE와 PE가 맵핑되면서 LV가 생성된다고 했다.


맵핑되는 방식에 따라


선형(Linear) LV / 스트라이프(Striped)된 LV / 미러(Mirrored) LV


 총 3가지 유형이 있다.



1) 선형(Linear) LV


하나의 LV으로 PV들을 모으는 방법이다.


예를 들어, 두개의 60GB 디스크(PV들을 의미)를 가지고 120GB의 LV를 만드는 방식이다.



LV만을 사용하는 사용자 입장에서는 120GB의 하나의 장치(LV)만 있게된다.


물론 다음과 같이 구성도 가능하다.



http://goo.gl/T1gE50


2) 스트라이프된(Striped) LV


LVM의 LV에 데이터를 기록하게되면, 파일 시스템은 PV에 데이터를 기록하게되는데(PE와 LE의 맵핑된대로)


스트라이프된 LV을 생성해서 데이터가 PV에 기록되는 방식을 바꿀수 있다.


대량의 순차적 읽기/쓰기 작업의 경우에 효율을 높일 수 있는 방법이다.



스트라이프 방식은 Round-Round 방식으로 미리 지정된 PV들에 데이터를 분산 기록해서 성능을 높인다.


게다가 스트라이프 방식은 읽고/쓰기를 병렬로 실행할 수 있다고도한다.


아래 그림은 스트라이프된 LV를 보여주는데


LV에 데이터를 기록을 할 때, 각각의 PV들에 번갈아가며 기록한다.


번갈아가는 기준은 데이터의 크기인데 이를 스트라이프 크기라고하며 Extent의 크기(PE/LE크기)를 초과할수 없다.



http://goo.gl/l1bQV5


3) 미러(Mirrored) LV


이름 그대로 다른 블록 장치에 저장된 데이터의 복사본을 저장하는 방식이다.


데이터가 하나의 PV에 저장될때, 이를 미러하고있는 PV에 동일한 데이터가 저장된다.


이를 통해 장치에 장애가 발생하게 될경우 데이터를 보호할 수 있게된다.


하나의 장치에 장애가 발생하게 되면, 선형(Linear)으로 저장되어있기에 다른 장치에서 쉽게 접근이 가능해진다.


어떤 부분이 미러를 써서 동기화되었는지에 대한 로그를 디스크에 저장한다.



http://goo.gl/gBHxyv


4.


LVM은 스냅샷 기능을 가지고 있다.


스냅샷이 생성된 이후에는 변경된 데이터 영역만을 복사하기에


스냅샷 기능에는 최소 스토리지 용량이  필요하다. 상황에 맞게 잘 할당해야한다.


스냅샷 스토리지로 할당한 공간이 부족하면 스냅샷이 정지된다.


스냅샷을 찍을때에는 파일시스템의 I/O의 정지가 필요없다.


http://goo.gl/w5XTc2




3. LVM 적용해보자


빨리보기


Step 1.

fdisk를 이용해 저장장치에 파티션을 설정한다(파티션 타입을 LVM 타입으로)


Step 2.

pvcreate을 이용해 1.에서 설정한 파티션으로 PV를 생성한다.


Step 3.

vgcreate으로 2.에서 만든 PV들을 묶어 VG를 생성한다.


Step 4.

vgdisplay로 VG가 제대로 생성됬는지 확인한다.


Step 5.

lvcreate로 LV를 사용자가 원하는대로 생성한다.


Step 6.

mkfs를 이용해 5.에서 생성한 LV에 파일시스템 포멧을 한다.


Step 7.

부팅시 자동으로 저장장치를 읽도록 /etc/fstab에 적기



설명시작


VMware로 Fedora20 Minimal 설치해서


선형 LV를 만드는걸 실습할것이다.


실습을 위해 하드디스크(SCSI) 20GB를 하나 추가했다.


(기존에 있는 하디드스크(SCSI)는 이미 LVM적용되있엉)




Step 1.
fdisk를 이용해 저장장치에 파티션을 설정한다(파티션 타입을 LVM 타입으로)


fdisk -l을 입력하면 파티션 테이블이 출력되는데 새로 추가한 하드디스크가 인식되는지 확인한다.


 아래 캡쳐를 보면 새로 추가한 하드디스크가 /dev/sdb로 잡혔다.


기존에 환경을 설명하자면


20GB크기의 /dev/sda가 있고 /dev/sda1과 /dev/sda2로 나눠져 있는데


/dev/sda1은 /boot(부트로더가 Logical Volume을 읽지를 못한다네??)


/dev/sda2는 LVM설정되어 있고


LV로써 /dev/maaper/fedora-swap과 /dev/maaper/fedora-root가 존재한다.




아무튼 /dev/sdb에다가 fdisk를 이용해 파티션을 나눈다.


실습에서는 10GB / 6GB / 4GB로 총 3개의 파티션을 나눌 것이다.


fdisk   /dev/sdb로 가서 Command로 n과 t를 이용해 생성 및 파티션 타입을 변경해준다.



위의 작업을 3번 해서 총 3개의 파티션을 생성해준다.


(3번째 생성할때 +4G 입력 하면 값 벗어났다고하는데 아마 MBR그거 때매 그런듯? 걍 디폴트값 때려)



그리고 Command로 w를 입력해서 저장하고 fdisk -l로 확인해본다.




Step 2.
pvcreate을 이용해 1.에서 설정한 파티션으로 PV를 생성한다.


pvcreate   /dev/sdb1

pvcreate   /dev/sdb2

pvcreate   /dev/sdb3


위와 입력하면 각 파티션들이 PV로써 존재하게 된다.


pvscan 명령어를 통해 현재 존재하는 PV 목록을 볼수 있다. 




Step 3.
vgcreate으로 2.에서 만든 PV들을 묶어 VG를 생성한다.


vgcreate   VG이름   PV이름[ PV이름 ...]


아래 캡쳐와 같이 testvg라는 이름으로 위에서 생성한 PV를 포함하는 VG를 생성해준다.


vgscan으로 현재 존재하는 VG의 목록을 볼수 있다.




Step 4.
vgdisplay로 VG가 제대로 생성됬는지 확인한다.


vgdisplay   [VG이름]




Step 5.
lvcreate로 LV를 사용자가 원하는대로 생성한다.


다음과 같이 입력했다.


lvcreate   -L 10GB   -n testLV1   testvg

testvg에서 30GB의 크기를 가지는 testLV1이름의 LV를 생성


lvcreate   -l 10%VG   -n testLV2   testvg

testvg에서 testvg의 10%만큼의 크기를 가지는 testLV2이름의 LV를 생성


lvcreate   -l 100%FREE   -n testLV3   testvg

testvg에서 나머지 공간을 모두 가지는 testLV3이름의 LV를 생성


마지막으로 lvscan으로 LV가 생성됬는지 확인한다.




Step 6.
mkfs를 이용해 5.에서 생성한 LV에 파일시스템 포멧을 한다.


파일시스템으로 ext4을 쓰기위해


mkfs.ext4   /dev/mapper/testvg-testLV1

mkfs.ext4   /dev/mapper/testvg-testLV2

mkfs.ext4   /dev/mapper/testvg-testLV3




Step 7.
부팅시 자동으로 저장장치를 읽도록 /etc/fstab에 적기


vi   /etc/fstab


다음과 같은 구문을 제일 아래에 추가한다.


/dev/mapper/testvg-testLV1   /lv1   ext4   defaults   0   0

/dev/mapper/testvg-testLV2   /lv2   ext4   defaults   0   0

/dev/mapper/testvg-testLV3   /lv3   ext4   defaults   0   0


부팅시에 생성한 LV들을 /lv1, /lv2, /lv3에 마운트하겠다는 뜻이다.


지금 당장 마운트하는 작업을 안했다. 다음 재부팅 시에는 마운트가 될 것이며


만일 에러가난다면 dmesg를 확인하면 될 것같다.






[출처]



'' 카테고리의 다른 글

dm-3: WRITE SAME failed. Manually zeroing  (0) 2015.01.17
리눅스 Man 명령어의 구성(Section 1 to 9)  (0) 2015.01.17
LVM(Logical Volumn Manager)개념과 설정  (4) 2015.01.15
YUM(Yellowdog Updater Modified)  (0) 2015.01.14
Linux Kernel과 GNU/Linux  (0) 2015.01.12
useradd와 adduser의 차이  (0) 2014.11.21