LVM 으로리눅스설치및운용 2009 년 12 월 13 일 / 2011 년 2 월 26 일수정됨 http://www.commit.co.kr 정현호 admin@commit.co.kr
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 설정으로설치하는법과설치후운용법에대해서말씀드리겠습니다 스크린샷및디스크숫자부족으로버추얼박스로진행하도록하며 디스크는초기에 8 기가짜리 3 개로설치후 3 기가짜리하나를더달아서한다는시나리오로진행하겠습니다 설치법은동일하니파티션설정만설명하겠습니다사용자레이아웃으로맞춰놓고작업하겠습니다
위의설명처럼 8 기가짜리 3 개를달아놓은상황입니다 파티셔닝은 / 6 기가 swap 1 기가로잡고나머지는 3 개의 PV 로잡은후 1 개의 VG 로잡고
다시 3 개의 LV 를만들어서 /home /data /var 로만들겠습니다 일단 sda( 첫번재하드 ) 에 / 파티션에 6 기가를주고만듭니다 /dev/sdb(2 번째디스크 ) 에다가 swap 을 1 기가생성합니다 /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 로만들어서차후에변경이용이하게하는것도좋을듯합니다 시스템 -> 관리 -> 논리적볼륨관리를실행해서본화면입니다설면한것처럼구성이되어있습니다 그다음은디스크를하나장착후 VG 에추가한후새로운 LV 를생성하는것과 생성된 LV 를줄이고다른쪽을늘리는테스트를해보겠습니다 터미널에서 [root@fedora12 oracle]# vgdisplay -v 를하면 vg 에관한정보를상세히볼수있습니다
[root@fedora12 oracle]# lvscan '/dev/vg_fedora12/logvol01' [9.77 GB] inherit '/dev/vg_fedora12/logvol00' [3.91 GB] inherit '/dev/vg_fedora12/logvol02' [3.46 GB] inherit lvscan 을치면현재 LV 상태를알수있습니다 [root@fedora12 oracle]# 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 번째디스크가보이네요파티션도않되어있고요 파티션을잡아보겠습니다 [root@fedora12 oracle]# 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. 파티션이생성되었고생성된파티션타입을변경하겠습니다 [root@fedora12 oracle]# 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. 8e 는 Linux LVM 타입의 ID 입니다 [root@fedora12 oracle]# pvcreate /dev/sdd1 Physical volume "/dev/sdd1" successfully created pvcreate 로 PV 를생성합니다 [root@fedora12 oracle]# vgextend vg_fedora12 /dev/sdd1 Volume group "vg_fedora12" successfully extended vgextend 로기존 vg 에새로훈 pv 를추가합니다 vgextend 기존 vg 명추가할 pv 입니다 LV 를만들어야하는데요용량지정에는 2 가지가있습니다용량으로지정하는것과 PE 로지정할수있는데요
[root@fedora12 ~]# 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 의정보중에 Total PE / Free PE 766 / 766 PE 의갯수를알수있습니다 일단용량은지정은 PE 사이즈 * 갯수입니다 766 * 4 = 3064 [root@fedora12 oracle]# lvcreate -L 3064M vg_fedora12 -n LogVol03 로만들수있습니다 lvcreate -L( 용량지정 ) 용량 MB 기존 VG 명 -n 생성할 LV 이름 PE 지정법은갯수로지정하는것입니다사이즈는 4MB 임으로위의용량이알아서계산되서생성됩니다 [root@fedora12 oracle]# lvcreate -l 766 vg_fedora12 -n LogVol03 -l( 소문자엘 ) PE 갯수 입니다 [root@fedora12 oracle]# lvscan '/dev/vg_fedora12/logvol01' [9.77 GB] inherit '/dev/vg_fedora12/logvol00' [3.91 GB] inherit '/dev/vg_fedora12/logvol02' [3.46 GB] inherit '/dev/vg_fedora12/logvol03' [2.99 GB] inherit LogVol03 에 3 기가용량이 LV 로추가된것을확인할수있습니다 이제원하는파일시스템으로만든후마운팅할디렉토리생성한다음마운트하겠습니다 [root@fedora12 oracle]# mkfs.ext4 /dev/vg_fedora12/logvol03 [root@fedora12 oracle]# mkdir /data2
[root@fedora12 oracle]# mount /dev/vg_fedora12/logvol03 /data2 다음부팅때도마운팅되도록 fstab 에기록하겠습니다현재시스템에서마운트된정보는 /etc 아래에있는 mtab 에기록되어있습니다 cat /etc/mtab grep data2 >> /etc/fstab 위와같이리다이렉션을이용해서추가해도되고 mtab 의마운트된정보를그대로복사해서 fstab 에추가해도됩니다 [root@fedora12 ~]# df -h /dev/mapper/vg_fedora12-logvol03 2.0G 69M 1.99G 4% /data2 df -h 로확인해보면 /data2 에마운트가되어있는걸확인할수있습니다 이제는 /data2 에해당하는 LV 를용량을줄이고 /home 을늘리도록하겠습니다 1200MB 로줄이고 800MB 정도를다시 VG 에반납합니다. [root@fedora12 oracle]# umount /data2 [root@fedora12 oracle]# e2fsck -f /dev/vg_fedora12/logvol03 [root@fedora12 ~]# resize2fs /dev/vg_fedora12/logvol03 1200M [root@fedora12 ~]# 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 에붙이겠습니다 [root@fedora12 oracle]# umount /home [root@fedora12 ~]# lvextend -L +1.81G /dev/vg_fedora12/logvol00 + 는해당용량만큼이라는의미이며, + 없이 L 1.81G 를쓰면 1.81GB 로늘려라라는의미입니다. 여기까지진행하면 LV 는늘어났지만실제파일시스템은늘어나지않았기에 resize2fs 로파일시스템을늘려주겠습니다. RHEL 기준으로 3 버전은 LVM 버전 1 을사용함으로서온라인파일시스템증가가불가하고 4 부터는가능하며, RHEL4 는 ext2online 명령어를사용하면되며, RHEL5 는 resize2fs 를사용하면됩니다. 사용방법은 resize2fs 와동일합니다. # ext2online /dev/vg_fedora12/logvol00 [root@fedora12 ~]# resize2fs /dev/vg_fedora12/logvol00 lvscan 으로확인해보면 /LogVol03 은줄어들고 /LogVol00 은늘어났음을알수있습니다 [root@fedora12 ~]# lvscan '/dev/vg_fedora12/logvol01' [9.77 GB] inherit '/dev/vg_fedora12/logvol00' [5.72 GB] inherit '/dev/vg_fedora12/logvol02' [3.46 GB] inherit '/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
/dev/mapper/vg_fedora12-logvol03 5.7G 74M 5.3G 2% /home 1.2G 34M 1.1G 4% /data2 /home 은늘어나고 /data2 는줄어든것을확인할수있습니다 Redhat 에서는왠만하면파일시스템을 umount 한후에정상적인상황에서 resize 하는것을권장하는부분이있으며, Redhat 문서를몇개를살펴보더라도 umount 후 resize 하는부분이많이보이며온라인중증가후에도 umount 한후에 e2fsck 등으로파일시스템을체크하는부분이나옵니다. 순서는 umount => lvextend => e2fsck f => resize2fs 로하면되겠습니다. 이상으로포스팅을맞치며 시나리오상나오지않았던 VG 조정부분은따로올려드리겠습니다 # vgcreate -s 16m new_vg /dev/hda /dev/hdb 위의명령은두개의스크를합쳐서 new_vg라는 VG를만든다는것이다. 옵션 -s 16m 은 PE(Physical Extent) 의크기를 16MB로정하는것인데, 만약옵션 -s 가생략되면기본적으로 PE의크기는 4MB가된다. VG가만들어지면 /dev/volumegroupname라는형식으로디렉토리가생기게된다. 위의예에서는 /dev/new_vg 가될것이다. VG(Volume Group) 명변경또는삭제방법 1. 변경방법 # vgrename new_vg vg00 2. 삭제방법 VG에 LV가남아있지않고비활성화되어있으면 vgremove로지울수있다. 비활성화시키는방법은 vgchange -a n vg_name 이고, 다음의명령을통해지워진다. # vgremove vg00 VG(Volume Group) 확장방법 VG의확장과축소는 PV의추가, 제거로이루어진다. 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로옴기라는의미이다. 비어있는 PV( 혹은 pvmove 로비워진 PV) 인 /dev/hda2 를 vg00 에서제거하려면, # vgreduce vg00 /dev/hda2 PV 삭제 위에서 /dev/hda2 를 VG 상에서제외시켰다해당 hda2 를일반파티션이나다른용도로상용하려면 PV 를지워야할것이다. # pvremove /dev/hda2 LV 변경방법 # lvrename /dev/vg00/data /dev/vg00/db LV 삭제방법 # lvremove /dev/vg00/db 스트라이핑확인 # lvs -v --segments Finding all logical volumes LV VG Attr Start SSize #Str Type Stripe Chunk st1 VG0 -wi-a- 0 1.95G 2 striped 512.00K 0 st1 VG0 -wi-a- 1.95G 1.95G 2 striped 512.00K 0 LogVol00 VolGroup00 -wi-ao 0 9.34G 1 linear 0 0 LogVol01 VolGroup00 -wi-ao 0 544.00M 1 linear 0 0