lvm 활용 A에서 Z까지
시스템 관리자라면 한 번쯤은 파일시스템이 꽉 차 서버가 멈춰버렸던 경험을 갖고
있을 것이다. 불필요한 파일을 지우는 임시 요법으로 해결할 수 없을 경우에는 할 수
없이 기존 시스템을 백업하고 파티션을 새로 구성해 운영체제를 설치하곤 했을
것이다. 그러나 이제 이런 막노동(?)으로부터 해방이다. 리눅스 커널 2.4가 lvm이라는
유용한 기능을 제공하기 때문이다.
김용일 유니워크
——————————————————————————–
로지컬 볼륨 매니저(Logical Volume Manager, 이하 lvm)는 기존에 있던 파티션을 합쳐
새롭게 구성하는 기능이다.
컴퓨터를 사용하다 보면 데이터가 쌓이고, 새로운 프로그램을 설치하다 보면 하드
디스크 공간이 부족한 경우가 생길 수 있다. fdisk(또는 cfdisk)를 사용해 한번
리눅스 파티션의 크기를 정한 후 파티션을 확장하려면 그 안의 내용을 삭제하고,
크기를 늘려야 한다. 이와 같은 구조는 서버에서는 큰 문제가 된다. 서버는 절대
정지해서는 안되는 컴퓨터이기 때문이다. 이 경우 서버가 정지하고, 서버가 멈춘다는
것은 곧 금전적인 손실과 직결된다. 이런 문제점을 해결하기 위해 유닉스에서
일찍부터 도입했던 것이 바로 lvm으로 리눅스 역시 커널 2.4부터 엔터프라이즈 기능
강화 차원에서 lvm을 새롭게 도입한 것이다.
예를 들어, 처음 설치할 때 /home 파티션에 1GB를 할당한 후 나중에 이 파티션을
늘리는 방법은 운영체제를 새로 설치, 파티션을 나누는 방법 밖에 없다. 이때 lvm을
이용, /home 파티션 크기를 10GB로 늘릴 수 있다. 반대로 10GB의 필요없는 /var라는
파티션이 있다면 이것을 줄여 다른 곳에 사용할 수 있다. 또 lvm을 이용하면 기존
하드 디스크의 /home 파티션이 꽉 차 더 이상 사용할 수 없을 때, 하드 디스크를
추가해 /home의 용량을 늘릴 수 있다. lvm은 이렇게 고무줄처럼 파티션을 늘였다
줄였다 할 수 있어 대형 서버에서 아주 유용한 기능이다.
lvm의 기본 개념
lvm을 사용하기 위해 알아야 할 기본적인 용어는 다음과 같다.
PE(physical media) : 일반적인 물리적 하드 디스크를 말한다. /dev/hda, /dev/sda
등을 예로 들 수 있다.
PV(Physical Volume) : 각각의 파티션을 나눈 것을 말한다(/dev/ hda1, /dev/hda2
등). 이 때 파일 타입은 lvm을 사용할 수 있게 0x 8e로 설정해야 한다.
PE(Physical Extents) : 하드 디스크를 제어할 때 블럭(PE) 단위로 제어한다. 블럭
하나는 대개 MB 단위의 크기를 갖는다. 예를 들면 볼륨그룹 크기가 184MB이고, 기본
PE가 4MB일 때 PE의 개수는 46개가 된다. pvcrate에서 옵션으로 -l을 사용하면 pe
단위로 사용하게 된다.
VG(Volume Group) : PV로 되어 있는 파티션을 그룹으로 설정한다. /dev/hda1을 하나의
그룹으로 만들 수도 있고, /dev/hda1 + /dev/hda2처럼 파티션 두 개를 하나의
그룹으로 만들 수 있다. 그밖에도 다양하게 그룹 설정을 할 수 있다.
LV(Logical Volume) : 마운트 포인터로 사용할 실질적인 파티션이다. 크기를 바꿀 수
있다.
Filesystem : ext2, reiserfs 등의 리눅스에서 사용하는 모든 파일시스템을 사용할 수
있다.
lvm은 <그림 1>과 <그림 2>처럼 구성할 수 있다.
lvm 사용을 위한 커널 설정과 컴파일
lvm은 리눅스 커널 2.3 개발 버전이나 2.4 테스트 버전에서 사용할 수 있다. 먼저
커널 컴파일부터 하겠다. 여기서는 리눅스 커널 2.4 test9 버전을 사용한다.
ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.0-test9.tar.gz에서 커널 소스를
다운받는다.
/usr/src/ 디렉토리로 이동한다.
압축을 푼다.
tar xvzf linux-2.4.0-test9.tar.gz
/usr/src/linux 디렉토리로 이동한다.
make xconfig를 실행하면 <화면 1>이 나온다.
<화면 2>에서는 램디스크에 체크해주고, <화면 3>에서는 lvm 관련 항목을
체크한다. 나머지 설정은 자신의 컴퓨터 사양에 맞게 옵션을 지정해야 한다. 모든
설정을 끝냈으면, 커널을 컴파일한다. 컴파일한 커널 이미지를 /etc/lilo.conf에
설정하고 /sbin/lilo를 실행한 후 시스템을 재시작한다.
다음과 같은 부팅 메시지가 나오면 lvm이 정상적으로 설치된 것이다.
………………..
LVM version 0.8final by Heinz Mauelshagen (15/02/2000)
lvm — Driver successfully initialized
………………..
lvm 명령어 사용하기
lvm을 사용하려면 먼저 lvm 관련 패키지를 설치해야 한다. 데비안에서는 다음과 같이
하면 lvm 관련 패키지가 설치된다.
apt-get install lvm
레드햇 계열 배포본을 사용한다면 ftp://ftp.gwdg.de/pub/
linux/misc/lvm/v0.8final/에서 패키지를 다운받아 설치한다.
lvm 관련 명령어는 <표 1>과 같다. 주로 사용하는 것은 create, display, scan,
remove 등이다. pvscan을 실행하면 <리스트 1>과 같이 출력된다. <리스트
1>을 보면 현재 /dev/hda3, /dev/hdd1, /dev/hdd2가 pv로, 즉 lvm(0x8e)으로
설정돼 있는 것을 알 수 있다. 또한 /dev/hda3, /dev/hdd1이 vg1이라는 볼륨 그룹으로
묶여 하나로 구성돼 있음을 알 수 있다. 자세히 살펴보면 /dev/hda3이 1.95GB이고,
/dev/hdd1이 1.95GB이다. 두개의 파티션을 합치면 약 4GB의 vg1을 형성했음을 알 수
있다. 따라서 vg1이라는 4GB의 새로운 논리적인 하드가 하나 만들어진 것이다. 또한
/dev/hdd2에는 아무 그룹도 만들어지지 않은 것을 알 수 있다.
vgdisplay를 실행하면 볼륨 그룹에 대한 자세한 내용을 알 수 있다. <리스트
2>와 같이 볼륨 그룹은 vg1이고, read/write을 할 수 있고, 크기를 조정할 수도
있으며 4GB를 사용할 수 있다. PE는 기본설정이 4MB로 설정되어 있기 때문에 1000개를
사용해야 4GB가 된다.
lvscan을 실행하면 현재 볼륨 그룹과 크기를 알 수 있다. <리스트 3>을 보면 총
3.05GB의 vg1의 그룹에 test, test1이라는 라벨명으로 각각 3GB와 120MB로 설정돼
있음을 알 수 있다.
lvdisplay를 실행해보자. 볼륨 그룹의 내의 논리적인 파티션이 될 곳의 정보가
출력된다. <리스트 4>에 나온 것처럼 볼륨 이름은 /dev/vg1/ test이고, 볼륨
그룹은 vg1이며, 읽고 쓰기가 가능하고, 크기는 2.93GB이다.
lvm 만들기
1. fdisk /dev/hdd를 실행하고 나서 l을 입력하면 <리스트 5>와 같이
파일시스템 타입이 나온다. 8e번 Linux LVM을 선택해 사용해야 한다.
선택 후 p를 누르면 정상으로 설정돼 있는 것을 알 수 있다. w로 저장하고 빠져
나오면 된다.
Command (m for help): p
Disk /dev/hdd: 255 heads, 63 sectors, 784 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 255 2048256 8e Linux LVM
/dev/hdd2 256 765 4096575 8e Linux LVM
/dev/hdd3 766 784 152617+ 5 Extended
/dev/hdd5 766 784 152586 82 Linux swap
2. 파티션 설정을 한 다음 PV를 만들어야 한다. pvcreate를 사용해 다음과 같이
만들어 준다. lvm을 사용하고자 하는 파티션 모두를 다음과 같이 해주면 사용할 수
있다.
# pvcreate /dev/hdd1
pvcreate — reinitializing physical volume
pvcreate — physical volume “/dev/hdd1” successfully created
# pvcreate /dev/hdd2
pvcreate — reinitializing physical volume
pvcreate — physical volume “/dev/hdd2” successfully created
3. 다음으로 볼륨 그룹을 만들어 준다. vgcreate를 사용해 /dev/hdd1와 /dev/hdd2를
vg01 그룹으로 만든다.
# vgcreate vg01 /dev/hdd1 /dev/hdd2
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 “vg01”
vgcreate — volume group “vg01” successfully created and activated
볼륨 그룹 vg01에 대한 정보는 앞서 설명한 것과 같이 vgdisplay를 이용해 알아볼 수
있다. vgdisplay를 실행하면 볼륨 그룹 이름은 vg01로 정의하고, 읽고 쓰기와 크기
변환을 할 수 있고, 현재 5.86GB를 사용할 수 있음을 알 수 있다.
4. 다음으로는 로지컬 파티션을 만들어야 한다. 이곳에 마운트 포인터를 지정,
마운트해 데이터를 저장할 수 있다. 사용 형식은 다음과 같다.
lvcreate <크기> <로지컬 볼륨 이름> <볼륨 그룹>
-L 옵션은 크기를 MB 단위로 입력을, -l은 PE 단위로 입력을 각각 의미하며, -n은
로지컬 볼륨 이름을 나타낸다.
# lvcreate -L 1500M -n lvol1 vg01
lvcreate — doing automatic backup of “vg01”
lvcreate — logical volume “/dev/vg01/lvol1” successfully created
lvcreate -L 500M -n lvol2 vg01
lvcreate — doing automatic backup of “vg01”
lvcreate — logical volume “/dev/vg01/lvol2” successfully created
lvcreate -L 2000M -n lvol3 vg01
lvcreate — doing automatic backup of “vg01”
lvcreate — logical volume “/dev/vg01/lvol3” successfully created
정상적으로 만들어졌는지 알아보려면 lvscan을 사용하면 알 수 있다. lvol1에 1.46GB,
lvol2에 500MB, lvol3에 1.95GB가 만들어졌음을 알 수 있다.
# lvscan
lvscan — ACTIVE “/dev/vg01/lvol1” [1.46 GB]
lvscan — ACTIVE “/dev/vg01/lvol2” [500 MB]
lvscan — ACTIVE “/dev/vg01/lvol3” [1.95 GB]
lvscan — 3 logical volumes with 3.91 GB total in 1 volume group
lvscan — 3 active logical volumes
5. 로지컬 볼륨을 생성한 후 파일을 저장할 수 있도록 파일시스템을 만들어야 한다.
로지컬 볼륨을 하나의 파티션이라 생각하면 된다. 기존의 파티션이랑 다른 점은
크기를 변경할 수 있다는 것이다.
6. 기존의 꽉 찬 디렉토리나 남는 디렉토리, lvm으로 바꿀 디렉토리를 다음과 같이
이름을 바꿔 준다.
# mv /home /home.old
# mv /var /var.old
# mv /data /data.old
이름을 바꾼 디렉토리를 다음과 같이 새로 만들어 준다.
# mkdir /home
# mkdir /var
# mkdir /data
새로 만든 디렉토리에 다음과 같이 마운트한다.
# mount /dev/vg01/lvol1 /home
# mount /dev/vg01/lvol2 /data
# mount /dev/vg01/lvol3 /var
그리고 정상적으로 만들었는지 df를 실행해 마운트돼 있는 디렉토리를 확인한다.
다음과 같이 나오면 정상이다.
# df
Filesystem 1k-blocks Used Available Use% Mounted
on
/dev/hda5 2008108 1780148 125952 94% /
/dev/vg01/lvol1 1511856 20 1435036 1% /home
/dev/vg01/lvol2 495844 13 470231 1%
/data
/dev/vg01/lvol3 2015824 20 1913404 1% /var
이상 없이 마운트했으면 old로 바꾸어 놓은 내용을 다시 복사해 원상 복귀시킨다.
cp -dpR /home.old/* /home
cp -dpR /data.old/* /data
cp -dpR /var.old/* /var
그 다음은 부팅할 때마다 마운트를 할 필요없게 /etc/fstab에 다음과 같이
추가해준다.
/dev/vg01/lvol1 /home ext2 defaults 1 2
/dev/vg01/lvol2 /data ext2 defaults 1 2
/dev/vg01/lvol3 /var ext2 defaults 1 2
이렇게 현재 시스템을 새로 포맷하지 않고 꽉 찬 디렉토리를 lvm으로 만들 수 있다.
다음은 크기 변경을 해보도록 해보겠다.
lvm을 이용한 파티션 크기 변경
볼륨 그룹 바꾸기
볼륨 그룹을 변경하기 위해서는 활성화(ACTIVE) 상태의 볼륨 그룹을
비활성화(inactive)로 만들어줘야 한다. 활성화, 비활성화는 vgchange로 바꿔주면
된다. vgchange -a n vg01이면 비활성화 한다는 의미이고, vgchange -a y는 활성화
한다는 의미다. 볼륨 그룹을 변경하는 명령어는 vgrename이다.
vgrename <기존의 볼륨 그룹 이름> <바꿀 볼륨 그룹 이름>
<리스트 8>과 같은 순서대로 하면 간단히 볼륨 그룹 이름을 바꿀 수 있다.
기존 볼륨 그룹에 파티션 추가하기
기존에 있던 볼륨 그룹의 다른 하드 디스크에 있는 파티션을 추가할 때는 vgextend를
사용해, 하드 디스크나 파티션을 추가할 수 있다. 예를 들면 /dev/hdd1에 있는
myvg라는 파티션에 /dev/hda3의 비어 있는 lvm 파티션을 합칠 경우에 사용한다. 먼저
myvg가 활성화가 되어 있지 않기 때문에 활성화해줘야 한다. 다음과 같이 활성화해
준다.
# pvscan
pvscan — reading all physical volumes (this may take a while…)
pvscan — inactive PV “/dev/hda3” is in no VG [1.95 GB]
pvscan — inactive PV “/dev/hdd1” of VG “myvg” [5.86 GB / 5.86 GB free]
pvscan — total: 2 [7.81 GB] / in use: 1 [5.86 GB] / in no VG: 1 [1.95 GB]
# vgchange -a y myvg
vgchange — volume group “myvg” successfully activated
활성화했으면 vgextend를 사용해 myvg에 /dev/hda3을 다음과 같이 추가해 준다.
# vgextend myvg /dev/hda3
vgextend — INFO: maximum logical volume size is 255.99 Gigabyte
vgextend — doing automatic backup of volume group “myvg”
vgextend — volume group “myvg” successfully extended
정상적으로 됐는지 확인하기 위해 vgdisplay을 실행해보면 같은 볼륨 그룹으로 돼
있는 것을 알 수 있다. 크기를 확인하면 다음과 같이 7.81GB로 확장됐음을 알 수
있다.
# vgdisplay myvg
— Volume group —
VG Name myvg
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 7.81 GB
PE Size 4 MB
Total PE 2000
Alloc PE / Size 0 / 0
Free PE / Size 2000 / 7.81 GB
볼륨 그룹 나누기
vgreduce는 하나로 묶여 있던 볼륨 그룹의 파티션을 나눌 때 사용한다. 예를 들어
myvg /dev/hdd1와 /dev/hda3와 함께 묶여 있는 /dev/hda3를 따로 떼어낼 때 다음과
같이, vgreduce를 사용한다.
vgreduce <볼륨 그룹 이름> <떼어낼 물리적 파티션>
# vgreduce myvg /dev/hda3
vgreduce — doing automatic backup of volume group “myvg”
vgreduce — volume group “myvg” successfully reduced by physical volume:
vgreduce — /dev/hda3
다음과 같이 /dev/hda3와 /dev/hdd1이 서로 분리됐음을 알 수 있다.
# pvscan
pvscan — reading all physical volumes (this may take a while…)
pvscan — inactive PV “/dev/hda3” is in no VG [1.95 GB]
pvscan — ACTIVE PV “/dev/hdd1” of VG “myvg” [5.86 GB / 5.86 GB free]
pvscan — total: 2 [7.81 GB] / in use: 1 [5.86 GB] / in no VG: 1 [1.95 GB]
로지컬 볼륨(파티션) 늘이고, 줄이기
로지컬 볼륨의 크기를 늘리는 방법으로는 다음과 같이 -L+100을 해주는 방법이 있다.
이렇게 하면 다음과 같이 기존의 크기에 100이 추가된다.
# lvextend -L+100 /dev/myvg/lvol2
lvextend — extending logical volume “/dev/myvg/lvol2” to 600 MB
lvextend — doing automatic backup of volume group “myvg”
lvextend — logical volume “/dev/myvg/lvol2” successfully extended
다음과 같이 + 기호를 없애면 해당 숫자의 크기만큼 증가한다.
# lvextend -L900 /dev/myvg/lvol2
lvextend — extending logical volume “/dev/myvg/lvol2” to 900 MB
lvextend — doing automatic backup of volume group “myvg”
lvextend — logical volume “/dev/myvg/lvol2” successfully extended
크기를 줄일 때는 lvreduce를 사용해 줄일만큼의 숫자를 지정하면 그만큼 줄어들게
된다. 크기를 줄일 때는 기존의 데이터가 저장돼 있을 경우를 대비, 정말로 크기를
줄일 것인지를 확인하고 줄이게 되어 있다. 만약 데이터가 저장돼 있는 이상만큼
줄어들게 되면, 기존의 데이터는 당연히 삭제된다. 크기를 줄일 때는 주의해 줄이기
바란다.
# lvreduce -L-300 /dev/myvg/lvol2
lvreduce — WARNING: reducing active logical volume to 600 MB
lvreduce — THIS MAY DESTROY YOUR DATA
lvreduce — do you really want to reduce “/dev/myvg/lvol2”? [y/n]: y
lvreduce — doing automatic backup of volume group “myvg”
lvreduce — logical volume “/dev/myvg/lvol2” successfully reduced
다음과 같이 하면 크기가 300MB로 줄일 수 있다.
# lvreduce -L300 /dev/myvg/lvol2
로지컬 볼륨(파티션) 이름 바꾸기
로지컬 볼륨 이름을 바꾸려면 활성화 상태를 비활성화로 바꿔줘야 한다. 다음과 같이
비활성화로 바꿔준다.
# lvchange -an /dev/myvg/lvol1
lvchange — logical volume “/dev/myvg/lvol1” changed
lvchange — doing automatic backup of volume group “myvg”
로지컬 볼륨의 이름을 변경한다.
lvrename <기존의 로지컬 볼륨> <새로운 볼륨 이름>
# lvrename /dev/myvg/lvol1 /dev/myvg/label1
lvrename — doing automatic backup of volume group “myvg”
lvrename — logical volume “/dev/myvg/lvol1” successfully renamed to
“/dev/myvg/label1”
다음으로 비활성화 상태의 로지컬 볼륨을 활성화로 바꿔 준다.
# lvchange -ay /dev/myvg/label1
lvchange — logical volume “/dev/myvg/label1” changed
lvchange — doing automatic backup of volume group “myvg”
확인해보면 다음과 같이 바뀐 것을 알 수 있다.
# lvscan
lvscan — ACTIVE “/dev/myvg/label1” [1.46 GB]
lvscan — ACTIVE “/dev/myvg/lvol2” [600 MB]
lvscan — ACTIVE “/dev/myvg/lvol3” [1.95 GB]
lvscan — 3 logical volumes with 4 GB total in 1 volume group
lvscan — 3 active logical volumes
스왑 로지컬 볼륨 만들기
다음과 같이 스왑 로지컬 볼륨을 만든다.
lvcreate -L256M -n swap1 myvg
mkswap /dev/myvg/swap1
swapon /dev/myvg/swap1
부팅할 때 자동으로 마운트하기 위해 /etc/fstab에 다음을 추가해주면 된다.
/dev/myvg/swap1 sw swap defaults 0 0
루트 파티션까지 마운트하려면 램드라이브를 만들어 주면 파티션 전체를 로지컬
볼륨으로 사용할 수 있다. 다음과 같이 lvmcreate_initrd를 실행하면 /boot/initrd.
gz라는 파일이 생긴다.
# lvmcreate_initrd
Logical Volume Manager 0.8 by Heinz Mauelshagen 06/08/1999
lvmcreate_initrd — this script creates a LVM initial ram disk in
/boot/initrd.gz
lvmcreate_initrd — making ram filesystem
위와 같이 실행한 후에는 <리스트 9>와 같이 /etc/lilo.conf를 수정해줘야
한다.
위에서 보는 것과 같이 initrd=/boot/initrd.gz라는 파일을 읽을 수 있게 한 줄을
추가해주면 되고, 저장하고 나서 lilo를 실행해주면 된다. 그 다음으로 /etc/fstab을
다음과 같이 수정한다.
/dev/myvg/label1 / ext2 defaults 0 1
맺음말
지금까지 lvm의 대략적인 개념과 설치 과정을 알아보았다. 더 자세한 것은
http://linux.msede.com/lvm/과 http://linuxdoc.org를 참고하면 알 수 있다.
항상 주위에서 파티션을 잘못 나누거나 예상치 못하게 파티션이 꽉 차 고생하는
사람들을 많이 보아왔다. 리눅스의 커널이 업그레이드되면서 추가된 lvm이라는 편리한
기능을 이용해 많은 리눅서들이 파티션의 공포에서 해방되기를 바란다.
필자 연락처 : nalabi at uniwork.co.kr
정리 : 송우일 wooil at sbmedia.co.kr
[출처] http://maso.zdnet.co.kr/maso/2000/11/07/014004,973555825,178.html
안녕하세요 저같은 경우 파티션 전체에 centos를 설치해서 dev/sda 에 모든 용량이 할당되어 있는 상태입니다.
여기에 fdisk -p 로 조회를 해보면
boot 가 1M,
ms basic이 1G,
Linux LVM이 3.7T로
나누어져있는데 LVM을 축소시킬수 있는 방법이 있을까요?
축소 시켜서 다른 디스크로 할당해서 쓰려고 합니다.
lvresize 명령으로 축소는 가능합니다. 하지만 데이터 손실이 될수있습니다. 저도 이래저래 테스트를 좀 했었는데 일부 파일들이 삭제가 되더군요. 완전 클린한 상태가 아니라면 사용을 않는것이 좋을것 같네요