리눅스에서의 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
오오 좋은 글 감사합니다. 덕분에 수많은 밤을 지샐뻔했는데 복구했네요
퍼가요~^^