Last Updated on 1월 24, 2024 by Jade(정현호)
Contents
LVM 대한 간략 소개
LVM 은 Logical Volume Manager 의 약자로서, 저장 장치들을 좀 더 효율적이고 유연하게 관리 할수 있는 커널의 부분 과 프로그램을 말합니다.
처음 IBM에서 개발되었는데, 그 후에 OSF(현재는 OpenGroup http://www.opengroup.org)에서 차용을 하여 OSF/1 operating system 에서 쓰였습니다.
지금은 HP-UX, Digital Unix operating system, AIX 등의 상용 유닉스에서 쓰고 있습니다.
리눅스 버전은 현재 HP-UX의 것을 모델로 하여 Sistina Software 사(http://www.sistina.com)에서 Open Source로 개발하고 있습니다.
좀더 이해하기 쉽게 밑의 그림을 보면서 설명을 하겠습니다.
Physical Volume 이란 하나의 디스크 혹은 파티션입니다
쉽게 디스크라고 생각하면 위의 그림은 디스크 3개를 1개의 그룹으로 묶습니다. 그룹을 Volume Group 이라고 부르며 raid 0 을 사용해 보신분이라면 조금 이해가 빠르실 겁니다.
그렇게 3개의 디스크를 하나의 볼륨 그룹으로 만들고 2개의 논리적 볼륨으로 나눕니다 논리적 볼륨은 쉽게 파티션이라고 생각하시면 됩니다
만약 위의 2개의 LV(로지컬 볼륨)에 / 과 /home 파티션을 잡아서 사용하게 되면 / 와 /home 파티션에 해당되는 곳에 I/O는 3개의 디스크에서 Striping 이 되게 됩니다
/home 에 유저가 파일을 읽거나 쓸 때 => 파티션을 access 할 때 3개의 디스크가 I/O를 나눠서 처리한다는 것이죠
물론 파일이 쓰일 때도 3개의 디스크에 나뉘어져서(striping) 쓰이게 됩니다 Access 가 많은 파일이나 특정 블록에서 Hot block 이나 contention(경합) 이 발생될 확률이 줄어들며 Disk I/O 가 분산되기에 그만큼 각각 디스크 I/O를 좀더 효율적으로 사용가능 합니다.
또 하나의 장점 위에서 설명한 것처럼 / 와 /home 을 만들어놓고 운용 중에 / 용량은 남는 /home 의 용량이 부족할 때 / 용량을 줄이고 /home을 늘릴수 있습니다
또한 하드 나 파티션을 VG(볼륨그룹) 에 추가후에 / 와 /home 과 같은 LV 를 늘릴수도 있습니다 기존의 파티션에서 용량부족시 하던 해결법과 다른 면을 볼수있는 부분이죠
이 정도만 알고 설치 시 LVM 설정으로 설치하는 법 과 설치 후 운용법에 대해서 말씀드리겠습니다
Fedora 설치시 LVM
포스팅에서는 Virtualbox 환경에서 페도라 리눅스 사용하여 진행하였으며 작성 시점 대비 현재 버전차이가 있으므로 설치 스크린샷은 내용 참조만 하시면 됩니다.
디스크는 초기에 8GB 용량 3개를 사용하여 설치 후 3GB 디스크를 하나를 더 장착한다는 시나리오로 진행하겠습니다
설치법은 동일하니 파티션 설정만 설명하겠습니다 사용자 레이아웃 으로 진행합니다.
위의 설명처럼 8GB 디스크 3개가 장착된 상황입니다
파티셔닝은 / 6GB, swap 1GB 로 설정하고 나머지는 3개의 PV로 설정 후 1개의 VG 로 생성하고 다시 3개의 LV 를 만들어서 /home /data /var 로 만들겠습니다
일단 sda(첫번째 하드) 에 / 파티션에 6GB로 생성합니다.
/dev/sdb(2번째디스크) 에다가 swap 을 1GB 로 생성합니다.
/dev/sda 와 sdb, sdc 에 위와 같이 PV로 생성하며 최대 가능한 용량으로 채움으로 해서 3개의 PV를 생성을 합니다.
PV 3개를 생성 후 화면의 우측에 있는 LVM(L) 버튼을 누르면 화면과 같이 나타납니다 볼륨 그룹은 VG의 이름이며 사용할 물리적 볼륨 에 보면 3개만들어준 PV를 볼수있습니다
추가(A) 를 누른후 마운트 지점과 용량을 지정하고 OK를 누릅니다
포스팅에서는 /home /data /var 로 생성하였습니다.
3개의 LV를 확인할 수 있습니다.
현재 파티셔닝 상태
현재 파티셔닝은 아래 그림과 같이 됩니다
/dev/sda1 에는 / 파티션
/dev/sdb2 에는 swap 파티션
나머지 공간에 3개의 디스크에서 PV를 3개를 생성해서 하나의 VG으로 생성한후 3개의 LV를 만든 것입니다. 이런 식으로 설치시에 LVM으로 설치가 가능합니다
여러 개의 디스크가 있을 때 Access 가 많을 만한 파티션을 LV에 만들어주는 것도 좋을 듯하고 용량이 부족할 수도 있는 파티션은 LV로 만들어서 차후에 변경이 용이하게 하는 것도 좋을 듯합니다
시스템-> 관리 -> 논리적 볼륨 관리 를 실행해서 본 화면입니다. 설명한 것처럼 구성이 되어있습니다
LVM 구성 변경
그 다음은 디스크를 하나 장착 후 VG에 추가한후 새로운 LV를 생성하는 것과 생성된 LV를 줄이고 다른 쪽을 늘리는 테스트를 해보겠습니다
디스크 생성 및 상태 확인
~]# vgdisplay -v 를 하면 vg에 관한 정보를 상세히 볼 수 있습니다
lvscan 을 통해 현재 LV상태를 알 수 있습니다
~]# lvscan
ACTIVE '/dev/vg_fedora12/LogVol01' [9.77 GB] inherit
ACTIVE '/dev/vg_fedora12/LogVol00' [3.91 GB] inherit
ACTIVE '/dev/vg_fedora12/LogVol02' [3.46 GB] inherit
~]# fdisk -l
Disk /dev/sdd: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
fdisk -l 보면 중간에 /dev/sdd 라고 4번째 디스크가 있고 파티션 되지 않은 상태입니다.
LVM 추가
파티션 생성
~]# fdisk /dev/sdd
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-391, default 1): (엔터)
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-391, default 391): (엔터)
Using default value 391
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
파티션이 생성되었고 생성된 파티션 타입을 변경하겠습니다.
~]# fdisk /dev/sdd
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sdd: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x11d06658
Device Boot Start End Blocks Id System
/dev/sdd1 1 391 3140676 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
Note
8e는 Linux LVM 타입의 ID입니다
pvcreate 로 PV를 생성
[root@fedora12 oracle]# pvcreate /dev/sdd1
Physical volume "/dev/sdd1" successfully created
vgextend 로 기존 vg 에 신규 pv 추가
[root@fedora12 oracle]# vgextend vg_fedora12 /dev/sdd1
Volume group "vg_fedora12" successfully extended
vgextend 명령어는 아래와 같습니다.
~]# vgextend 기존_vg명 추가할_pv
LV 생성시 용량 지정 방법 2가지
- 용량으로 지정하는것
- PE로 지정하는 방법
~]# vgdisplay -v | grep "PE Size"
Finding all volume groups
Finding volume group "vg_fedora12"
PE Size 4.00 MB
PE Size가 4메가씩 할당되었다는 걸 알 수 있습니다.
vgdisplay -v 를 해서 보면 아래에 새로 추가한 /dev/sdd1 의 정보 중에 아래의 정보로 PE 의 개수를 알 수 있습니다.
Total PE / Free PE 766 / 766
용량은 지정은 PE사이즈 * 갯수 입니다
766 * 4 = 3064
용량 지정으로 생성
lvcreate -L(용량지정) 용량MB 기존VG명 -n 생성할LV이름
~]# lvcreate -L 3064M vg_fedora12 -n LogVol03
PE 개수 지정 으로 생성
PE 지정법은 개수로 지정하는 것입니다. 사이즈는 4MB 임으로 위의 용량이 알아서 계산되어 생성됩니다.
~]# lvcreate -l 766 vg_fedora12 -n LogVol03
-l(소문자 엘) PE갯수 입니다
~]# lvscan
ACTIVE '/dev/vg_fedora12/LogVol01' [9.77 GB] inherit
ACTIVE '/dev/vg_fedora12/LogVol00' [3.91 GB] inherit
ACTIVE '/dev/vg_fedora12/LogVol02' [3.46 GB] inherit
ACTIVE '/dev/vg_fedora12/LogVol03' [2.99 GB] inherit
LogVol03 에 3기가 용량이 LV로 추가된 것을 확인할 수 있습니다
이제 원하는 파일시스템으로 만든 후 마운트 하려는 디렉토리 생성한다음 마운트를 진행하겠습니다
파일 시스템 추가
파일 시스템으로 포맷을 진행합니다.
~]# mkfs.ext4 /dev/vg_fedora12/LogVol03
~]# mkdir /data2
~]# mount /dev/vg_fedora12/LogVol03 /data2
다음부팅때도 마운팅되도록 fstab에 입력하도록 하겠습니다. 현재 시스템에서 마운트 된 정보는 /etc 아래에 있는 mtab 에 기록되어 있습니다
~]# cat /etc/위와 같이 | grep data2 >> /etc/fstab
위와 같이 리다이렉션 을 이용해서 추가해도 되고 mtab의 마운트 된 정보를 그대로 복사해서 fstab에 추가해도 됩니다
df -h 로 확인해보면 /data2 에 마운트가 되어있는 걸 확인할 수 있습니다
~]# df -h
/dev/mapper/vg_fedora12-LogVol03
2.0G 69M 1.99G 4% /data2
LV 사이즈 변경
이제는 /data2 에 해당하는 LV를 용량을 줄이고 /home 을 늘리도록 하겠습니다 1200MB로 줄이고 800MB정도를 다시 VG에 반납합니다.
~]# umount /data2
~]# e2fsck -f /dev/vg_fedora12/LogVol03
~]# resize2fs /dev/vg_fedora12/LogVol03 1200M
~]# lvreduce -L 1200M /dev/vg_fedora12/LogVol03
WARNING: Reducing active logical volume to 1.17 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce LogVol03? [y/n]: y
Reducing logical volume LogVol03 to 1.17 GB
Logical volume LogVol03 successfully resized
-l 옵션을 사용시에는 PE 개수를 써주시면 됩니다.
-L 과 -l 둘 다 반환할 만큼의 용량(PE개수)이 아닌 원하는 줄여진 용량(PE개수)를 써주셔야 합니다
2000MB에서 1500으로 변경하고자 할 때 -L 500M 하게 되면 2000-500 해서 1500 이 아 500MB로 줄어듭니다.
줄일때는 resize2fs 에서 MB 용량으로 줄이게 되니 lvreduce 에서도 동일하게 -L 로 MB 용량을 지정하여 줄이는 것이 좋을 듯합니다.
진행 과정은 반드시 umount -> e2fsck -> resize2fs-> lvreduce 순으로 해야 합니다.
온라인으로 줄이고 남은 1.81G 를 통해서 /home 의 용량의 변경을 시도하도록 하겠습니다.
~]# umount /home
~]# lvextend -L +1.81G /dev/vg_fedora12/LogVol00
1) 사이즈 만큼 늘리기
+ 는 해당 용량만큼이라는 의미이며, +없이 -L 1.81G 를 쓰면 1.81GB 로 늘려라 라는 의미입니다.
즉 위의 예시는 1.81G 를 더 늘리라는 의미입니다.
2) PE 수만큼 늘리기
-l +1000 의 형태는 1000개의 PE 만큼을 더 늘리라는 의미이며, -l 1000 은 PE 개수를 1000개로 늘려라 라는 의미입니다.
PE 수는 vgdisplay 에서 확인할 수 있습니다.
[vgdisplay 에서 PE 정보 예시]
Total PE 23170
Alloc PE / Size 15491 / 60.51 GiB
Free PE / Size 7679 / <30.00 GiB
여기까지 진행하면 LV는 늘어났지만 실제 파일시스템은 늘어나지 않았기에 resize2fs 로 파일시스템을 증가시켜야 합니다.
RHEL 기준으로 3버전은 LVM 버전1 을 사용함으로써 온라인 파일시스템 증가가 불가하고 버전 4부터는 가능하며, RHEL4는 ext2online 명령어를 사용하면 되며, RHEL5는 resize2fs 를 사용하면 됩니다.
사용방법은 resize2fs 와 동일합니다.
~]# ext2online /dev/vg_fedora12/LogVol00
~]# resize2fs /dev/vg_fedora12/LogVol00
더 최신의 리눅스 버전에서 xfs 파일 시스템을 사용한다면 아래의 명령어로 filesystem 증가를 진행하면 됩니다.
~]# xfs_growfs /dev/vg_fedora12/LogVol00
lvscan 으로 확인해보면 /LogVol03 은 줄어들고 /LogVol00 은 늘어났음을 확인할 수 있습니다.
~]# lvscan
ACTIVE '/dev/vg_fedora12/LogVol01' [9.77 GB] inherit
ACTIVE '/dev/vg_fedora12/LogVol00' [5.72 GB] inherit
ACTIVE '/dev/vg_fedora12/LogVol02' [3.46 GB] inherit
ACTIVE '/dev/vg_fedora12/LogVol03' [1.17 GB] inherit
unmount 한 2개의 LV를 마운트하고 df -h 를 하면
[root@fedora12 ~]# mount /dev/vg_fedora12/LogVol00 /home/
[root@fedora12 ~]# mount /dev/vg_fedora12/LogVol03 /data2/
[root@fedora12 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 5.8G 3.0G 2.6G 54% /
tmpfs 293M 0 293M 0% /dev/shm
/dev/mapper/vg_fedora12-LogVol01
9.7G 150M 9.0G 2% /data
/dev/mapper/vg_fedora12-LogVol02
3.5G 338M 2.9G 11% /var
/dev/mapper/vg_fedora12-LogVol00
5.7G 74M 5.3G 2% /home
/dev/mapper/vg_fedora12-LogVol03
1.2G 34M 1.1G 4% /data2
/home 은 늘어나고 /data2는 줄어든 것을 확인할 수 있습니다
redhat 에서는 일반적으로 파일시스템을 umount 한 후에 정상적인 상황에서 resize 하는 것을 권장하고 있습니다.
redhat 문서를 살펴보더라도 umount 후 resize 하는 부분이 많이 확인되며 온라인으로 증가후에도 umount 를 하고 e2fsck 등으로 파일 시스템을 체크하는 내용일 기술되어 있습니다.
순서는 umount => lvextend => e2fsck -f => resize2fs 로 하면 되겠습니다.
이상으로 포스팅을 마치며 시나리오상 기술되지 않은 VG, PV 명령어는 아래에 정리하였습니다.
VG 관련 명령어
먼저 VG 관련된 추가 명령어와 작업 내용에 대해서 확인해 보도록 하겠습니다.
VG 생성
아래 명령은 두 개의 디스크(hda, hdb) 를 합쳐서 new_vg 라는 VG 를 만든다는 의미입니다.
~]# vgcreate -s 16m new_vg /dev/hda /dev/hdb
옵션 -s 16m 은 PE(Physical Extent)의 크기를 16MB로 정하는 것인데, 만약 옵션 -s 가 생략되면 기본적으로 PE의 크기는 4MB가 됩니다.
VG가 만들어지면 /dev/VolumeGroupName 라는 형식으로 디렉토리가 생성되게 되며 위의 예에서는 /dev/new_vg 가 될 것입니다.
VG 명 변경 과 삭제
VG명 변경
~]# vgrename new_vg vg00
VG 삭제
VG에 LV가 남아있지 않고 비활성화되어 있으면 vgremove로 지울 수 있습니다.
비활성화
~] vgchange -a n vg_name
삭제
다음 명령을 통해 삭제가 됩니다.
~]# vgremove vg00
VG(Volume Group) 확장
VG의 확장과 축소는 PV의 추가, 제거로 이루어집니다.
VG(Volume Group) 증가(추가) 방법
VG에 PV를 추가하는 명령은 vgextend인데, vg00이라는 VG에 PV인 /dev/hda2를 추가하려면 다음과 같이 실행하게 됩니다.
~]# vgextend vg00 /dev/hda2
VG(Volume Group) 축소방법
PV를 VG에서 제거하는 명령은 vgreduce 입니다.
그러나 PV의 PE가 사용되어지고 있다면 있으면 제거되지 않게 됩니다. 그 할당된 PE를 다른 PV로 옮겨야 제거됩니다.
PE를 옮길 때는 pvmove 를 사용합니다.
~]# pvmove -n /dev/vg00/data /dev/sda2 /dev/sdc1
명령어 설명) -n /경로/볼륨그룹명/LV명 제거하고자하는PV 이동될PV
위 명령어는 data 라는 LV중 /dev/sdb1에 해당하는 PE를 /dev/sdc1 로 옮기라는 의미입니다.
VG 에서 PV 제거
VG 에서 비어있는 PV(혹은 pvmove로 비워진 PV) 인 /dev/hda2를 vg00에서 제거하려면 아래와 같이 진행합니다.
# vgreduce vg00 /dev/hda2
PV 삭제
위에서 VG에서 /dev/hda2 를 제거하였고 해당 hda2 를 일반 파티션이나 다른 용도로 사용하려면 먼저 PV 를 삭제하면 됩니다.
~]# pvremove /dev/hda2
LV 관련 명령어
LV 이름 변경
# lvrename /dev/vg00/data /dev/vg00/db
LV 삭제방법
# lvremove /dev/vg00/db
연관된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io