기본적인 LVM 스토리지 설정 및 관리하기
on Linux
LVM이란 Logical Volume Manager의 약자로, 디스크 볼륨을 논리적으로 관리함으로써 스토리지에 유연성을 확보한다.
여유 공간이 남는 디스크가 생기거나, 여러 디스크들을 하나로 묶어서 연속적인 파티션처럼 사용하고 싶은 경우, LVM이 이를 도와준다.
물리적인 디스크를 추가하거나 제거하는 과정에서 이러한 논리적인 파티션의 크기를 확장하거나 축소하는데도 아주 유연하다는 점을 강점으로 갖는다.
개인적으로는 운영체제에서 메모리 공간을 관리하는 것과 비슷하다고 생각한다. 조금 결이 다를 수 있긴 하지만…
프로그램들이 물리 메모리 주소에 직접 접근하는 것이 아니라, 자신은 연속적이라고 생각하는 가상 주소 공간을 사용하지만, 그것이 실제로는 운영체제에 의해 관리되는 파편화된 물리 주소이기 때문이다.
즉, LVM을 사용하지 않는다면 하드디스크를 파티셔닝한 뒤에 해당 파티션 영역을 직접 사용하였지만, LVM의 경우 이들을 논리적으로 그룹화함으로써 사용자 입장에서는 여러 디스크를 연속적인 파티션처럼 사용할 수 있게 해준다.
LVM이라는 레이어가 중간에 개입함으로써, 물리 디스크들을 자신이 관리하며 논리적인 공간으로 나눠주고 사용하게끔 한다는 점에서 그렇게 느꼈다.
대략적인 구조는 아래와 같다.
LVM에서는 크게 VG, PV, LV의 개념이 존재한다.
각각 Volume Group, Physical Volume, Logical Volume의 약자이며, 대부분의 LVM 관련 명령어들이 이러한 두 글자짜리 개념을 앞에 붙인 형식으로 이루어져있기 때문에, 반드시 숙지해야 한다.
예를 들어 pv를 생성할 때는 pvcreate, lv를 생성할 때는 lvcreate와 같은 느낌이다.
먼저 PV는 실제 스토리지 디바이스, 즉 HDD나 SDD 같은 물리적인 디스크 혹은 파티션 등을 의미한다.
여러 물리 디스크를 묶어 LVM 상에서 논리적인 개념으로 사용하기 위해서는, 먼저 이런 디스크들을 PV로 초기화해야한다.
PV는 물리 파티션과 실질적으로 큰 차이는 없지만, 그저 LVM에서 사용하기 위한 개념이라고 보면 된다.
블록 디바이스들을 pvcreate [블록디바이스1] [블록디바이스2] ...
형식의 명령어를 사용해 pv로 만들 수 있다.
bconfiden2@h01~$ sudo pvcreate /dev/vdb /dev/vdc /dev/vdd
Physical volume "/dev/vdb" successfully created.
Physical volume "/dev/vdc" successfully created.
Physical volume "/dev/vdd" successfully created.
생성된 pv들을 확인한다.
bconfiden2@h01~$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/vdb lvm2 --- 2.00g 2.00g
/dev/vdc lvm2 --- 3.00g 3.00g
/dev/vdd lvm2 --- 4.00g 4.00g
출력 결과에서 나온 PSize가 해당 pv의 전체 크기를 나타내며, PFree의 경우 lv가 사용하지 않고 있는, 파티션되지 않은 사용 가능한 크기를 의미한다.
이러한 pv들을 vg(볼륨 그룹)으로 묶어 사용하는데, 이렇게 만들어지는 vg가 하나의 논리적인 디스크라고 보면 된다.
즉, vg를 디스크로 보기 때문에 vg로부터 생성할 수 있는 특정 크기의 파티션이 lv가 되는 것이다.
vg는 vgcreate [vg이름] [블록디바이스1] [블록디바이스2] ...
와 같이 생성한다.
bconfiden2@h01~$ sudo vgcreate volume1 /dev/vdb /dev/vdc
Volume group "volume1" successfully created
만약 pv1이 10기가, pv2가 20기가 크기라고 한다면, 해당 pv들을 묶어 구성한 vg는 논리적으로 총 30기가짜리 연속된 공간을 사용할 수 있게 된다.
현재 예시의 경우에는 2.00g, 3.00g 짜리 pv들 2개로 만들어졌기 때문에, 볼륨 그룹 volume1의 전체 공간인 VSize는 5.00g가 된다.
bconfiden2@h01~$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
volume1 2 0 0 wz--n- 4.99g 4.99g
LVM을 사용하지 않고 고정된 크기의 물리 디스크에서 파티션을 생성하여 사용하는 경우에는, 데이터가 많아질수록 이를 감당할 수 없기 때문에 서버를 내렸다가 새로운 디스크에 데이터를 옮기고 다시 인식시키는 귀찮은 과정이 수반되기 마련이다.
그러나 LVM을 활용한다면, 기존에 사용하던 공간이 부족할 경우 물리 디스크를 추가하여 pv를 생성한 뒤, 해당 pv를 vg에 추가시켜주기만 하면 손쉽게 공간을 확장시킬 수 있다.
기존의 vg에 새로운 pv를 추가하는 명령어는 vgextend [vg이름] [블록디바이스] ...
와 같다.
앞서 미리 초기화해놨던 pv인 /dev/vdd를 기존의 vg에 붙여 공간을 확장시켜보자.
bconfiden2@h01~$ sudo vgextend volume1 /dev/vdd
Volume group "volume1" successfully extended
비슷하게, vg에서 pv를 떼어낼 수도 있다.
bconfiden2@h01~$ sudo vgreduce volume1 /dev/vdd
Removed "/dev/vdd" from volume group "volume1"
bconfiden2@h01~$ sudo pvremove /dev/vdd
Labels on physical volume "/dev/vdd" successfully wiped.
아렇게 vg라는 논리적인 디스크를 만들었다면, LVM 상에서 파티션 역할을 하는 lv를 생성함으로써 사용자가 일반적인 파티션처럼 활용할 수 있다.
lv를 생성할 vg이름과, 원하는 크기, lv를 식별할 수 있는 이름을 같이 넣어 lvcreate [vg이름] --size 사이즈 --name 이름
처럼 사용한다.
bconfiden2@h01~$ sudo lvcreate volume1 --size 1.5G --name smalldata
Logical volume "smalldata" created.
이 때 넣어준 lv의 이름은, 해당 lv를 블록디바이스로써 참조할 때 사용된다.
즉, /dev/[vg이름]/[lv이름]
위치에서 파일로써 접근할 수 있고, 일반적인 블록디바이스들과 비슷하게 파일시스템을 초기화해준 뒤 마운트해서 사용하면 되는 것이다.
특정 vg로부터 lv를 생성하였기 때문에, 다시 vgs를 살펴보면 여유공간이 줄어든 것을 확인할 수 있다.
bconfiden2@h01~$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
volume1 2 0 0 wz--n- 4.99g 3.49g
사용 중이던 lv의 사이즈를 조절하고 싶은 경우, lvresize 명령어를 쓰면 되지만, 크기를 축소시키는 경우에는 데이터가 유실될 수 있으니 주의해야 하며, 프롬프트를 띄워 확인 절차를 거치기도 한다.
lvresize를 사용할 때 앞서 말했듯이 lv를 식별할 수 있는 장치파일의 경로를 넣어준다.
bconfiden2@h01~$ sudo lvresize /dev/volume1/smalldata --size 1G
WARNING: Reducing active logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce volume1/smalldata? [y/n]: y
Size of logical volume volume1/smalldata changed from 1.50 GiB (384 extents) to 1.00 GiB (256 extents).
Logical volume volume1/smalldata successfully resized.
만약 해당 lv에 파일시스템이 구성되었을 경우, –resizefs 옵션을 같이 넣어주지 않으면, 사용할 수 있는 공간 자체는 넓어지더라도 파일시스템이 초기화되지 않아 이를 인식하지 못하는 문제가 발생한다.