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로 개발하고 있다. LVM 을 이해하려면 먼저 Software RAID (Redundant Array of Inexpensive Drives)를 언급해야 하는데, 이 둘은 비슷하면서도 큰 차이가 있다. 비슷한 점은 여러 물리적인 디스크들을 하나의 논리적인 디스크처럼 다룰 수 있게 함으로서 조합방법에 따라 고용량, 고속,데이터의 무결성을 실현하는 점이다. 하지만 분명하게 다른 점이 있는데. lvm은 raid보다 관리 및 확장이 비교적 쉬운 반면, raid에는 lvm에는 없는 disk mirroring(RAID level 1), Parity Stripe (RAID level 4,5) 등의 방식이 있어서 속도 또는 데이터의 무결성을 보장 받을 수 있다. 그러나 이런 차이점에도 불구하고 lvm이 주목을 받는 이유는 다음과 같다.
•쉬운 관리.
•서로 다른 많은 디바이스 조합 지원.
•직관적인 저장 장치로의 접근.
•뛰어난 확장성.
•믿을만한 안전성과 효율.
•스냅샷 기능 지원.
이와 같은 특징들로 인해 사용자들이 얻는 이득은 많다.
VG(Volume Group)은 LVM의 가장 기본적인 요소이다. 쉽게 말하자면 가상 디스크라고 할 수 있는데, 하나 이상의 실제 물리적으로 존재하는 블록디바이스가 모여서 VG를 이루게 된다. 그 물리적인 블록 디바이스를 PV (Physical Volume)라고 하는데, 거의 대부분의 장치를 PV로 쓸 수 있다.
하드디스크 및 그 파티션, 소프트웨어/하드웨어 RAID 장치, 심지어 Loopback 블록 디바이스(파일 시스템상의 파일을 블록 디바이스처럼 쓸 수 있게 해준다)까지도 말이다. PV와 대비되는 것이 LV(Logical Volume)이다.
이것은 가상 파티션이라고도 할 수 있는 데, VG를 적당히 나누어 할당한 것이 LV이다. 사용자는 LV를 일반 디스크나 파티션처럼 쓰면 된다. 정리하자면, 하나 이상의 PV가 모여 VG를 이루고, VG를 가상적으로 나누어할당하면 LV이다.
1. PV(Physical Volume) 초기화 작업
# fdisk /dev/hda
Command (m for help): t
Partition number (1-6): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)
Command (m for help): w
# fdisk /dev/hdb
Command (m for help): t
Partition number (1-6): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)
Command (m for help): w
# pvcreate /dev/hda2
pvcreate -- physical volume “/dev/hda2”
successfully created
# pvcreate /dev/hdb2
pvcreate -- physical volume “/dev/hdb2”
successfully created
# 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에 LV가 남아있지 않고 비활성화되어 있으면 vgremove로 지울 수 있다.
비활성화시키는 방법은, # vgchange -a n vg00 이고, 다음의 명령으로 지
워진다.
# vgremove vg00
VG의 확장과 축소는 PV의 추가, 제거로 이루어진다.
VG에 PV를 추가하는 명령은 vgextend인데, vg00이라는 VG에 PV인
/dev/hda2를 추가하려면 다음과 같이 실행해야 한다.
# vgextend vg00 /dev/hda2
PV를 VG에서 제거하는 명령은 vgreduce이다. 그러나 PV에 PE가 할당되어
있으면 제거되지 않는다. 그 할당된 PE를 다른 PV로 옮겨야 제거될 것이다.
빈 PV인 /dev/hda2를 vg00에서 제거하려면,
# vgreduce vg00 /dev/hda2
VG에 LV를 만들면 /dev/VolumeGroupName/LogicalVolumeName의 형식으로
블록디바이스가 만들어진다. 이것은 일반 블록 디바이스와 다를 바 없는
용도로 쓸 수 있다.
LV 를 만드는 명령은 lvcreate인데 일반적인 예는 다음과 같다.
# lvcreate -L 4g -n data vg00
위의 명령은 4GB 크기로 vg00이라는 VG에 data라는 새로운 LV를 만드는
것이다. 옵션 ‘-L’은 LV의 크기를 지정하는 것인데, 숫자 뒤의 접미사에
따라 숫자의 단위가 달라진다. k는 KB, m은 MB, g는 GB, t는 TB를 뜻한다.
만약, 접미사가 안 붙어있으면 숫자의 단위는 MB가 된다. ‘-L’ 대신
‘-l’를 쓸 수도 있는데, ‘-l’ 뒤에는 LE의 갯수를 쓰면 된다
# lvrename /dev/vg00/data /dev/vg00/db
# lvremove /dev/vg00/db
# lvextend -L +2g /dev/vg00/db
위의 명령은 /dev/vg00/db의 크기를 2GB 만큼 늘린다. 기존의 크기가 4GB
였다면, 옵션 ‘-L 6g’를 줬어도 같은 결과를 보일 것이다. 역시 여기에
서도 옵션 ‘-l’를 쓰면 LE 단위로 늘릴 수 있다.
다음은 일반적인 ext2 의 확장 절차이다.
# umount /var/lib/mysql
# lvextend -L +10g /dev/databases/mysql
# resize2fs /dev/databases/mysql
# mount /dev/databases/mysql /var/lib/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
* 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
먼저 설정 백업 파일의 내용을 보려면 다음과 같이 한다.
# 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
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
환경은 /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
데이터의 변동이 많은 /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 을 지운다.
# umount /mnt
# lvremove /dev/vg01/mysqlbackup
Unix operating system, AIX 등의 상용 유닉스에서 쓰고 있다. 리눅스 버전은 현재 HP-UX의 것을 모델로 하여 Sistina Software 사(http://www.sistina.com)에서 open source로 개발하고 있다. LVM 을 이해하려면 먼저 Software RAID (Redundant Array of Inexpensive Drives)를 언급해야 하는데, 이 둘은 비슷하면서도 큰 차이가 있다. 비슷한 점은 여러 물리적인 디스크들을 하나의 논리적인 디스크처럼 다룰 수 있게 함으로서 조합방법에 따라 고용량, 고속,데이터의 무결성을 실현하는 점이다. 하지만 분명하게 다른 점이 있는데. lvm은 raid보다 관리 및 확장이 비교적 쉬운 반면, raid에는 lvm에는 없는 disk mirroring(RAID level 1), Parity Stripe (RAID level 4,5) 등의 방식이 있어서 속도 또는 데이터의 무결성을 보장 받을 수 있다. 그러나 이런 차이점에도 불구하고 lvm이 주목을 받는 이유는 다음과 같다.
•쉬운 관리.
•서로 다른 많은 디바이스 조합 지원.
•직관적인 저장 장치로의 접근.
•뛰어난 확장성.
•믿을만한 안전성과 효율.
•스냅샷 기능 지원.
이와 같은 특징들로 인해 사용자들이 얻는 이득은 많다.
VG(Volume Group)은 LVM의 가장 기본적인 요소이다. 쉽게 말하자면 가상 디스크라고 할 수 있는데, 하나 이상의 실제 물리적으로 존재하는 블록디바이스가 모여서 VG를 이루게 된다. 그 물리적인 블록 디바이스를 PV (Physical Volume)라고 하는데, 거의 대부분의 장치를 PV로 쓸 수 있다.
하드디스크 및 그 파티션, 소프트웨어/하드웨어 RAID 장치, 심지어 Loopback 블록 디바이스(파일 시스템상의 파일을 블록 디바이스처럼 쓸 수 있게 해준다)까지도 말이다. PV와 대비되는 것이 LV(Logical Volume)이다.
이것은 가상 파티션이라고도 할 수 있는 데, VG를 적당히 나누어 할당한 것이 LV이다. 사용자는 LV를 일반 디스크나 파티션처럼 쓰면 된다. 정리하자면, 하나 이상의 PV가 모여 VG를 이루고, VG를 가상적으로 나누어할당하면 LV이다.
1. PV(Physical Volume) 초기화 작업
# fdisk /dev/hda
Command (m for help): t
Partition number (1-6): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)
Command (m for help): w
# fdisk /dev/hdb
Command (m for help): t
Partition number (1-6): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)
Command (m for help): w
2. PV(Phydical VOlume)생성
# pvcreate /dev/hda2
pvcreate -- physical volume “/dev/hda2”
successfully created
# pvcreate /dev/hdb2
pvcreate -- physical volume “/dev/hdb2”
successfully created
3. VG(Volume Group) 생성
# 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 가 될 것이다.
4. VG(Volume Group)명 변경 또는 삭제방법
4-1. 변경방법
# vgrename new_vg vg004-2. 삭제방법
VG에 LV가 남아있지 않고 비활성화되어 있으면 vgremove로 지울 수 있다.
비활성화시키는 방법은, # vgchange -a n vg00 이고, 다음의 명령으로 지
워진다.
# vgremove vg00
5. VG(Volume Group) 확장방법
VG의 확장과 축소는 PV의 추가, 제거로 이루어진다.
VG에 PV를 추가하는 명령은 vgextend인데, vg00이라는 VG에 PV인
/dev/hda2를 추가하려면 다음과 같이 실행해야 한다.
# vgextend vg00 /dev/hda2
6. VG(Volume Group) 축소방법
PV를 VG에서 제거하는 명령은 vgreduce이다. 그러나 PV에 PE가 할당되어
있으면 제거되지 않는다. 그 할당된 PE를 다른 PV로 옮겨야 제거될 것이다.
빈 PV인 /dev/hda2를 vg00에서 제거하려면,
# vgreduce vg00 /dev/hda2
7. LV(Logical Volume)생성
VG에 LV를 만들면 /dev/VolumeGroupName/LogicalVolumeName의 형식으로
블록디바이스가 만들어진다. 이것은 일반 블록 디바이스와 다를 바 없는
용도로 쓸 수 있다.
LV 를 만드는 명령은 lvcreate인데 일반적인 예는 다음과 같다.
# lvcreate -L 4g -n data vg00
위의 명령은 4GB 크기로 vg00이라는 VG에 data라는 새로운 LV를 만드는
것이다. 옵션 ‘-L’은 LV의 크기를 지정하는 것인데, 숫자 뒤의 접미사에
따라 숫자의 단위가 달라진다. k는 KB, m은 MB, g는 GB, t는 TB를 뜻한다.
만약, 접미사가 안 붙어있으면 숫자의 단위는 MB가 된다. ‘-L’ 대신
‘-l’를 쓸 수도 있는데, ‘-l’ 뒤에는 LE의 갯수를 쓰면 된다
8. LV(Logical Volume)명 변경 및 삭제방법
8-1. 변경방법
# lvrename /dev/vg00/data /dev/vg00/db 8-2. 삭제방법
# lvremove /dev/vg00/db
9. LV(Logical Volume)확장방법
# lvextend -L +2g /dev/vg00/db
위의 명령은 /dev/vg00/db의 크기를 2GB 만큼 늘린다. 기존의 크기가 4GB
였다면, 옵션 ‘-L 6g’를 줬어도 같은 결과를 보일 것이다. 역시 여기에
서도 옵션 ‘-l’를 쓰면 LE 단위로 늘릴 수 있다.
다음은 일반적인 ext2 의 확장 절차이다.
# umount /var/lib/mysql
# lvextend -L +10g /dev/databases/mysql
# resize2fs /dev/databases/mysql
# mount /dev/databases/mysql /var/lib/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
10. LV(Logical Volume) 축소방법
* 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
11. LVM 설정의 Backup 방법
먼저 설정 백업 파일의 내용을 보려면 다음과 같이 한다.
# 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
12. 두개의 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
13. 새로운 디스크로 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
14. 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 을 지운다.
# umount /mnt
# lvremove /dev/vg01/mysqlbackup