리눅스에서의 LVM

1. LVM의 소개
가. LVM : Logival Volume Manager
나. 최초 IBM에서 개발, 현재는 IBM, HP 등 상용 유닉스에서도 쓰임
다. Soft RAID와의 차이점
     raid에 비해 관리 및 확장이 쉬운반면, RAID에는 있는 mirroring, Stripe 등이 없다
라. LVM의 장점
  – 쉬운관리
  – 서로 다른 디바이스 조합 지원
  – 뛰어난 확장성
  – 스냅샷 기능(특정시점 별도의 읽기전용 LV를 생성, 백업 등에 유용하게 이용)

2. LVM 기본지식
가. 용어설명
  – VG : Volume Group , LVM의 가장 기본적인 요소, 가상 디스크, 실제적이 물리 디스크가 여러가 모여서 VG를 이루게 된다.
  – PV : Physical Volume, 실질적인 디스크 장치
  – LV : Logical Volume , 가상 파티션, VG를 적당히 나눈 것

나. 참고사항
  – 한 시스템에서 VG는 99개까지 생성 가능
  – 하나의 VG에는 PV, LV를 합해 최대 256까지 할당 가능

3. LVM 실습
전체적인 순서는 다음과 같다
PV 초기화 -> VG 만들기 -> LV 만들기

가. PV 초기화
  – 실질적인 물리 디바이스를 PV 로 초기화하는 것이 필요
  – 하드 디스크의 경우 fdisk 를 통해 System ID를 0x8e로 변경
  – 아래 방법 참조
    ㄱ. fdisk -l 을 입력해 추가한 디스크 확인(여기서는  /dev/sdb, /dev/sdc, /dev/sdd)사용자 삽입 이미지    ㄴ.각각의 하드디스크 파티션 작업 실시(ex : fdisk /dev/sdb )
   ㄷ.  작업순서 : n ->  p -> 1 -> 엔터 -> 엔터 -> t -> 8e -> w
   참조 :  만일 파티션을 나누지 않고 하드디스크 전체를 PV 로 만들려고 할 때에는 아래 명령어 입력(아래 명령은 한순간에 파티션 정보를 날리는 방법이므로 사용에 유의)
  # dd if=/dev/zero of=/dev/sda bs=512 count=1

  – PV 만드는 명령
   # pvcreate /dev/sdb1

나. VG 만들기, 이름 바꾸기, 지우기
  – VG 만들기
   # vgcreate myvg /dev/sdb1 /dev/sdc1 /dev/sdd1
   # vgdisply
      3의 물리 디스크를 1개의 myvg라는 볼륨그룹을 생성 후 볼륨정보 보기
     
  – VG 이름 바꾸기
    # vgrename myvg vg00

  – VG 비활성화
   # vgchange -a n vg00


  – VG 삭제 하기 (VG에 LV가 남아있지 않고, 비활성화 되어 있을 때 가능)
   # vgremove vg00

다. VG 확장, 축소
 VG의 확장과 축소는 PV의 추가, 제거로 이뤄짐

– VG 에 PV 추가
 # vgextend vg00 /dev/sde1

– VG 에 PV 제거
 # vgreduce vg00 /dev/sde1

라. LV 만들기, 이름 바꾸기, 지우기
VG에 LV 를 만들면 /dev/VolumeGroupName/LogicalVolumeName 의 형식으로 가상의 디바이스가  생성되며, 일반 디바이스와 동일하게 사용할 수 있다.

– LV 만들기
# lvcreate -L 300m -n lv01 vg00
  위 명령은 300m 크기로 vg00 아리는 VG에 lv01 이라는 새로운 LV를 만드는 것임
  ㄱ. -L : LV 크기 지정(k, m, g, t 사용가능)
  ㄴ. -n : LV 이름 지정

– LV 이름 바꾸기
  # lvrename /dev/vg00/lv01 /dev/vg00/data1

– LV 삭제하기
  #lvremove /dev/vg00/data1

– LV 확장시키기
  # lvextend -L +100m /dev/vg00/data1
  data1 이라는 LV의 크기를 100m 늘림, 단 LV의 크기를 늘려준 다음에는 파일 시스템에는 반영되지 않기 때문에 파일시스템도 확장시켜줘야 한다.

  아래는 실무 예제이다.
# umount /app/oracle/data1
# lvextend -L +100m /dev/vg00/data1
# resize2fs /dev/vg00/data1
# mount /dev/vg00/data1 /app/oracle/data1

마. LV 포멧 및 마운트 시키기
  # mkfs.ext3 /dev/vg00/data1
   포멧하기(ext4를 지원하는 경우 mkfs.ext4 )
  # mount /dev/vg00/data1 /app/oracle/data1

   마운트하기
   

4. LVM 활용

(아래부터의 내용은 http://www.lug.or.kr/docs/LINUX/others/01-05-4.htm 의 내용을 그대로 가져옴)



    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




You may also like...

2 Responses

  1. 에몽이 말해보세요:

    오오 좋은 글 감사합니다. 덕분에 수많은 밤을 지샐뻔했는데 복구했네요

  2. GSJ 말해보세요:

    퍼가요~^^

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다