LVM(Linux Volume Manager) 구축하기

2010.05.12 07:39

조인상 조회 수:15314

원문 : http://www.ischo.net -- 조인상 // 시스템 엔지니어

Writer : http://www.ischo.net -- ischo // System Engineer in Replubic Of Korea

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

본문 : http://www.ischo.net -- 조인상 //시스템 엔지니어

+++++++++++++++++++++++++++++++++++++++++++++++++++++++


출처 : http://cafe.naver.com/nsis.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=3764


LVM(Linux Volume Manager) 구축하기

                                                                     

I. 시스템 사양

  - PC 의 vmware 상에서 하드를 2개 추가하여 할 예정

  - OS : redhat 9 2.4.20-31.9(yum으로 커널 컴파일 한 버전)

  - vmware에서 구축

  - HDD 3개 : 이중 sad1(2G) 과 sdc1(2G) 에 구축예정

  - CPU : Pentium 4 2.8Ghz

  - memory : 1G(physical) + 1G(swap)




II . 구축하기

1. 먼저 디스크에 리눅스 LVM 파일 시스템을 만들어준다.

[root@angka root]# fdisk /dev/sdb




Command (m for help): n

Command action

  e  extended

  p  primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-261, default 1):

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-261, default 261):

Using default value 261




Command (m for help): t

Selected partition 1

Hex code (type L to list codes): 8e        <-- 반드시 LVM으로 포맷해준다.

Changed system type of partition 1 to 8e (Linux LVM)




Command (m for help): p




Disk /dev/sdb: 2147 MB, 2147483648 bytes

255 heads, 63 sectors/track, 261 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes




  Device Boot    Start      End    Blocks  Id  System

/dev/sdb1            1      261  2096451  8e  Linux LVM




Command (m for help): w

The partition table has been altered!




Calling ioctl() to re-read partition table.

Syncing disks.




/dev/sdc 도 똑같은 방법으로 LVM 으로 만들어준다.




fdisk -l 명령으로 sdb 와 sdc가 LVM으로 만들어 졌는지 확인한다.




[root@angka root]# fdisk -l




Disk /dev/sda: 11.8 GB, 11811160064 bytes

255 heads, 63 sectors/track, 1435 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes




  Device Boot    Start      End    Blocks  Id  System

/dev/sda1  *        1      510  4096543+  83  Linux

/dev/sda2          511      637  1020127+  82  Linux swap

/dev/sda3          638      1435  6409935  83  Linux




Disk /dev/sdb: 2147 MB, 2147483648 bytes

255 heads, 63 sectors/track, 261 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes




  Device Boot    Start      End    Blocks  Id  System

/dev/sdb1            1      261  2096451  8e Linux LVM <-- 파일 시스템 파입이 LVM이어야한다.




Disk /dev/sdc: 2147 MB, 2147483648 bytes

255 heads, 63 sectors/track, 261 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes




  Device Boot    Start      End    Blocks  Id  System

/dev/sdc1            1      261  2096451  8e  Linux LVM







2. pvcreate 명령으로 물리적인 볼륨을 생성한다.




[root@angka root]# pvcreate /dev/sdb1

pvcreate -- physical volume "/dev/sdb1" successfully created




[root@angka root]# pvcreate /dev/sdc1

pvcreate -- physical volume "/dev/sdc1" successfully created




[root@angka root]#




3. sdb1 과 sdc1을 하나의 물리적 볼륨으로 묶어준다. 볼륨 그룹 이름은 angkaVG 로 한다.

[root@angka root]# vgcreate angkaVG /dev/sdb1 /dev/sdc1

vgcreate -- INFO: using default physical extent size 4 MB

vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte

vgcreate -- doing automatic backup of volume group "angkaVG"

vgcreate -- volume group "angkaVG" successfully created and activated




[root@angka root]#




4. vgdisplay 명령으로 볼륨그룹이 잘 생성되었는지 확인한다.

[root@angka root]# vgdisplay

--- Volume group ---

VG Name              angkaVG

VG Access            read/write

VG Status            available/resizable

VG #                  0

MAX LV                256

Cur LV                0

Open LV              0

MAX LV Size          255.99 GB

Max PV                256

Cur PV                2

Act PV                2

VG Size              3.98 GB <-- 2G 2개를 묶었으므로 4G가 나온다.

PE Size              4 MB

Total PE              1020

Alloc PE / Size      0 / 0

Free  PE / Size      1020 / 3.98 GB

VG UUID              HJNDS6-X7U4-BVlx-pPiG-uAkD-2Fup-cMqeqP







[root@angka root]#

여기서 주의할 것은 angkaVG는 단지 볼륨 그룹이지 논리적인 슬라이스가 아니다. angkaVG 자체를 마운트 하려고 하면 오류가 떨어진다. 이것은 마치 하드디스크를 추가하면 /dev/sde 와 같이 물리적인 디스크로 시스템에서 인식할 뿐이다. 그러므로 angkaVG를 다시 lvcreate 이용하여(하드 디스크일 경우는 fdisk이지만) 논리적으로 시스템이 인식하도록 만들어 주어야 한다.







5. angkaVG를 lvcreate를 이용 angkaVG1 4G로 만든다.

[root@angka root]# lvcreate -L 3.98G -n angkaVG1 angkaVG

lvcreate -- rounding size up to physical extent boundary

lvcreate -- doing automatic backup of "angkaVG"

lvcreate -- logical volume "/dev/angkaVG/angkaVG1" successfully created




[root@angka root]#




자 이제 우리가 쓸 수 있는 논리적인 디스크의 이름은 /dev/angkaVG/angkaVG1 이다. 이것의 크기는 4G 이며 이것은 sdb1(2G) + sdc1(2G)를 합쳐놓은 크기이다.




6. angkaVG1을 파일 시스템을 만들고 fsck 까지 한다음에 마운트한다.

[root@angka /]# mkfs.ext3 /dev/angkaVG/angkaVG1

mke2fs 1.32 (09-Nov-2002)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

522240 inodes, 1043456 blocks

52172 blocks (5.00%) reserved for the super user

First data block=0

32 block groups

32768 blocks per group, 32768 fragments per group

16320 inodes per group

Superblock backups stored on blocks:

        32768, 98304, 163840, 229376, 294912, 819200, 884736




Writing inode tables: done                           

Creating journal (8192 blocks): done

Writing superblocks and filesystem accounting information: done




This filesystem will be automatically checked every 37 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@angka /]# fsck -y /dev/angkaVG/angkaVG1

fsck 1.32 (09-Nov-2002)

e2fsck 1.32 (09-Nov-2002)

/dev/angkaVG/angkaVG1: clean, 11/522240 files, 24607/1043456 blocks

[root@angka /]# mount /dev/angkaVG/angkaVG1 /test

[root@angka /]# df -k

Filesystem          1K-blocks      Used Available Use% Mounted on

/dev/sda1              4032092  3364488    462780  88% /

/dev/sda3              6309320  3779156  2209668  64% /oracle

none                    79144        0    79144  0% /dev/shm

/dev/angkaVG/angkaVG1

                      4108224    32828  3866708  1% /test

[root@angka /]#

 

7. 부팅시에도 올라오도록 /etc/fstab 에 넣어준다.

LABEL=/                /                      ext3    defaults        1 1

none                    /dev/pts                devpts  gid=5,mode=620  0 0

LABEL=/oracle          /oracle                ext3    defaults        1 2

none                    /proc                  proc    defaults        0 0

none                    /dev/shm                tmpfs  defaults        0 0

/dev/sda2              swap                    swap    defaults        0 0

/dev/cdrom              /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0

/dev/fd0                /mnt/floppy            auto    noauto,owner,kudzu 0 0

/dev/angkaVG/angkaVG1  /test                  ext3    defaults        1 3





*** LV 크기 조정 ***
lvextent 명령어로 논리볼륨의 크기를 쉽게 늘릴 수 있다.
# lvextend -L+1G /dev/test_lvm/logvol1
lvextend -- extending logical volume "/dev/test_lvm/logvol1" to 3GB
lvextend -- doing automatic backup of volume group "test_lvm"
lvextend -- logical volume "/dev/test_lvm/logvol1" successfully extended

비슷하게 아래와 같이 논리볼륨의 크기를 줄일 수 있다.
# lvreduce -L-1G /dev/test_lvm/lv1
lvreduce -- -Warning: reducing active logical volume to 2GB
lvreduce- -- This may destroy your data (filesystem etc.)
lvreduce -- -do you really want to reduce "/dev/test_lvm/lv1"? [y/n]: y
lvreduce- -- doing automatic backup of volume group "test_lvm"
lvreduce- -- logical volume "/dev/test_lvm/lv1" successfully reduced


//////////// 추가분 /////////////////////


LV의 크기가 커졌어도 파일 시스템에는 영향을 주지 않으므로 파일 시스템 고유의 툴을 이용하여 확장 해주어야 한다.
한 가지 주의해야 할 것은 이렇게 크기를 늘릴 때 순서를 뒤바꾸면 절대 안 된다는 것이다. LV 확장 다음에 파일 시스템의 확장이다.

다음은 파일 시스템 별 확장 방법이다.
* ext2 : ext2 파일 시스템의 크기를 바꿀 수 있는 명령으로는 resize2fs이 있는데, e2fsprogs 1.19버전 이상에는 기본적으로 포함되어 있다. 그 이하의 버전을 쓴다면 ext2resize라는 프로그램을 다음의 사이트에서 구할 수 있다.
http;//ext2resize.sourceforge.org

다음은 일반적인 ext2 의 확장 절차이다.
# umount /var/lib/mysql
# lvextend -L +10g /dev/databases/mysql
# resize2fs /dev/databases/mysql
# mount /dev/databases/mysql /var/lib/mysql
LVM tool에 포함되어있는 e2fsadm을 쓰면 LV 확장과 파일 시스템의 확장을 동시에 할 수 있다. 다음의 명령은,
# e2fsadm?L +10g /dev/databases/mysql

다음의 두 명령과 같다.
# lvextend -L +10g /dev/databases/mysql
# resize2fs /dev/databases/mysql
* reiserfs : reiserfs는 resize_reiserfs 라는 명령으로 크기를 바꿀 수 있다.

마운트된 상태에서도 크기를 늘릴 수 있는데, 그 예는 다음과 같다.
# lvextend -L +5g /dev/devel/cvs
# resize_reiserfs -f /dev/devel/cvs

언마운트해서 늘리려면 다음 같이 한다.
# umount /var/cvs
# lvextend -L +5g /dev/devel/cvs
# resize_reiserfs -f /dev/devel/cvs
# mount /dev/devel/cvs /var/cvs

6)  LV 축소시키기
lvreduce는 LV의 크기를 줄이는데, 늘릴 때와 마찬가지로 파일 시스템과 별개로 이루어지므로 데이터를 잃어버릴 수 있으니 상당히 조심해야 한다.
작업의 순서는 확장할 때와는 반대로, 파일 시스템의 축소 다음에 LV의 축소이다.
각 파일 시스템 별 축소 방법이다.
* ext2 : e2fsadm 을 쓰는 것이 간단하다.
# umount /home
# e2fsadm -L -2g /dev/vg00/home
# mount /dev/vg00/home /home
* reiserfs : 크기를 늘릴 때와는 달리 마운트 된 상태에서는 줄일 수 없다.
# umount /usr
# resize_reiserfs -s -1g /dev/vg00/usr
# lvreduce -L -1g /dev/vg00/usr
# mount /dev/vg00/usr /usr

7)  설정의 백업과 복구 
LVM Tool들은 기본적으로 몇몇을 제외하고 동작 전의 설정상태를 자동으로 백업해둔다.(절대 데이터의 백업이 아니다!) 그 백업파일들은 /etc/lvmconf 라는 디렉토리에 VolumeGroupName.conf{,.[0-9].old}라는 이름으로 만들어진다. 뒤에 번호가 붙어있지 않은 것은 현재의 설정 내용이고, 그 번호가 클수록 오래된 내용이다. 그러므로 바로 전의 설정 내용을 담고 있는 파일에는 이름 뒤에는 .1.old가 붙어있다.
먼저 설정 백업 파일의 내용을 보려면 다음과 같이 한다.
# vgcfgrestore -f /etc/lvmconf/vg00.conf.1.old -ll -n vg00
이 파일을 이용해 설정을 복구하려면 다음과 같이 한다.
# vgchange -a n vg00
# vgcfgrestore -f /etc/lvmconf/vg00.conf.1.old -n vg00
# vgchange -a y vg00




5. 활용
몇 가지 유용한 활용 예를 보이겠다.

1)  두개의 ide disk를 하나의 striped mapping LV로 묶기
80GB 짜리(실제는 약 76.1GB) IDE 하드디스크 두 개를 striped mapping LV 로 묶는 과정이다.
먼저 블록 디바이스 이름이 /dev/hde, /dev/hdf 인 디스크들을 PV로 만든다.
# pvcreate /dev/hde /dev/hdf
그렇게 만든 PV들을 합쳐서 VG를 만든다.
# vgcreate vg00 /dev/hde /dev/hdf 
이제 VG에 LV를 만든다.
# lvcreate -i 2 -I 4 -L 152g -n striped_lv vg00
위의 명령으로 152GB 짜리 striped mapping LV가 만들어진 것이다. 옵션을 설명하면 ‘-i 2’는 두개의 PV를 striped 하는데 쓰고, ‘-I 4’는 PE를 4KB로 쪼개서 PV들에게 저장한다는 것이다. ‘-I’ 옵션에는 2^n (0 <= n <= 7), 즉 1, 2, 4, 8, 16, 32, 64, 128 의 숫자를 쓸 수 있다.
파일 시스템을 만들고, 마운트를 해서,
# mkreiserfs /dev/vg00/striped_lv
# mount /dev/vg00/striped_lv /mnt
bonnie++ 등의 벤치마킹 프로그랭으로 시험해본 결과, linear mapping LV보다 약 1.5배에서 1.8배까지 속도의 차이가 있었다. 물론 억세스가 많아지면 어떻게 되는지는 필자도 시험을 못했다.

2)  세로운 디스크로 PV 교체하기
하드디스크를 확장하면서 기존에 있는 하드디스크를 제거해야 할 때는 다음과 같은 과정을 거치면 된다.
환경은 /dev/hdd, /dev/sda, /dev/sdb가 vg01에 속해있는데, 그중에서 /dev/hdd를 빼고 /dev/sdc를 더하는 과정이다.
먼저 /dev/sdc 를 PV 로 만들고,
# pvcreate /dev/sdc
/dev/sdc를 vg01에 추가한 후에,
# vgextend vg01 /dev/sdc
/dev/hdd의 PE 들을 /dev/sdc로 옮긴다.
# pvmove /dev/hdd /dev/sdc
성공적으로 옮겨졌으면 vg01에서 /dev/hdd를 제거한다.
# vgreduce vg01 /dev/hdd

3)  snapshot LV를 만들어서 안전한 백업하기
데이터의 변동이 많은 /var등의 디렉토리는 백업 도중에 데이터가 엉키는 수가 있다. 그것을 방지하기 위해서, snapshot LV를 만들어 데이터를 고정시킨 후 백업을 하면 된다.
일단 snapshot LV 를 만든다.(한 줄로)
# lvcreate -s -L 5g -n mysqlbackup /dev/vg01/mysql
위의 명령은 /dev/vg01/mysql에 대한 snapshot LV인 /dev/vg01/mysqlbackup를 만든다. 옵션 ‘-s’는 만들어질 LV가 snapshot 형식임을 정해주고 있다. 옵션 ‘-L’ 는 LV 의 최대 크기를 정해준다. 대게 원본 LV와 크기를 같게 하는 것이 좋다. 사실 snapshot LV는 원본이 갱신되는 부분만 고정시키려고 데이터를 가져와 LE에 할당하기 때문에 많은 LE가 필요하지 않다.
이제 만든 LV 를 마운트 시킨 후
# mount /dev/vg01/mysqlbackup /mnt
백업을 하면 된다.
# tar cf /dev/rmt0 /mnt
백업을 마쳤으면 언마운트시킨 후에 snapshot LV 을 지운다.
# mount /mnt# lvremove /dev/vg01/mysqlbackup

<출처 : kldp.org>
번호 제목 글쓴이 날짜 조회 수
공지 [공지] 게시자료 열람자유. 불펌금지입니다. 조인상 2010.12.07 30737
104 원격지에서 FTP이용 백업 조인상 2010.05.09 8677
103 ksh에서 자동완성기능 사용하기 조인상 2010.05.12 10309
102 iptables로 NAT + Portforwarding 구성하기 조인상 2010.05.12 8636
101 NAT로 서비스 받는 컴퓨터에서 MSN 파일 전송기능사용하기 조인상 2010.05.12 8894
100 리눅스 환경에서 Xmanager 사용법 조인상 2010.05.12 19174
99 NAT환경에서 넷미팅 사용하기 조인상 2010.05.12 9524
98 새로운 디스크를 ext3로 파일시스템 생성하기 조인상 2010.05.12 8749
97 APM 설치하기 조인상 2010.05.12 8051
96 mysql 4 버전 설치하기 조인상 2010.05.12 11649
95 터미널에서 한글을!! Unicon 소개/설치 조인상 2010.05.12 12355
94 내가 즐겨사용하는 프롬프트 변수(PS1) 설정치 조인상 2010.05.12 10338
93 NFS 관련 명령어 및 파일들 조인상 2010.05.12 14430
92 2G이상 파일 tar 로 생성 / 분할생성(복사) 조인상 2010.05.12 12983
91 리눅스 가상 IP 설정 조인상 2010.05.12 30751
90 리눅스에 Qlogic2300 HBA카드로 어레이 붙이기 file 조인상 2010.05.12 20195
89 HBA카드의 WWNN과 WWPN에 대한 포럼 내용 조인상 2010.05.12 17497
88 리눅스에서 HBA카드의 WWN확인 방법 조인상 2010.05.12 54453
87 리눅스에서 플로피 사용하기 조인상 2010.05.12 8938
» LVM(Linux Volume Manager) 구축하기 조인상 2010.05.12 15314
85 삼바 세팅 및 사용법 [1] 조인상 2010.05.12 25115
서버에 요청 중입니다. 잠시만 기다려 주십시오...