OS [Linux] LVM 소개 및 설정
페이지 정보
작성자 LeeHyongDong 아이디로 검색 전체게시물 댓글 0건 조회 9,987회 좋아요 0회 작성일 19-09-30 10:57본문
LVM의 개념
LVM은 이름과 같이 논리볼륨매니저(Logical Volum Manager)입니다.
기존에는 파일시스템이 블록장치에 직접 접근해서 읽기,쓰기를 했다면 LVM은 파일시스템이 LVM이 만든 가상의 블록장치에 읽기,쓰기를 합니다.
쉽게 풀어 직접적으로 접근하는 것보다 다양하게 유연성을 제공합니다.
LVM은 LVM1과 LVM2가 있습니다
LVM1과 LVM2를 비교하면
구분 | LVM1 | LVM2 |
RHEL 2.1 지원 | X | X |
RHEL 3 지원 | O | X |
RHEL 4 지원 | X | O |
RHEL 6 지원 | O | O |
RHEL 7 지원 | O | O |
빠른 복구를 위한 트랜잭션 메타데이터 | X | O |
GFS로 공유볼륨 마운트 | X | O |
클러스터 스위트 장애 조치 지원 | X | O |
스트라이프 볼륨 확장 | X | O |
PVs,LVs의 최대 개수 | 256PVs,256LVs | 2**32 PVs, 2**32 LVs |
최대 크기 | 2TB | 16TB(32-bit CPU) 8EB(64-bit CPU) |
미러 볼륨 지원 | X | O |
LVM2는 LVM과 역호환됩니다 이전 버전인 LVM은 LVM2 기능과 호환되지 않습니다.
RHEL 7버전에서 LVM을 생성하면 LVM2로 생성되며 확인은 vgdisplay에서 확인할수 있습니다.
생성할 때 옵션 –M을 넣어 LVM1로 생성할지 LVM2로 생성할지 정할수 있습니다.
LVM 용어 정리
- PV 물리볼륨 (Physical Volume)
LVM에서 블록장치를 쓰려면 PV로 블록장치를 이루고 있는 파티션을 초기화해야합니다
즉, LVM에서 관리하기위한 가장 첫 번째 단계라고 볼수 있습니다.
- PE(Physical Extent)
PV를 구성하는 일정한 크기의 블록으로 LVM에서 기본 크기는 4MB입니다.
LE와 1:1로 맵핑됩니다. 그렇기에 항상 PE와 LE는 크기가 동일하며
PE사이즈는 VG를 생성할 때 변경 가능합니다.
- VG 볼륨그룹(Volum Group)
PV들의 집합으로 LV를 할당할 수 있는 공간입니다.
즉 PV들로 VG를 생성하는 과정은 LV를 만드는 디스크 공간을 생성하는 것으로 보면 됩니다.
- LV 논리볼륨(Logical Volume)
사용자가 최종적으로 다루는 논리 볼륨입니다.
- LE(Logical Extent)
LV를 구성하는 일정한 크기의 볼륨으로 기본크기는 4MB입니다.
PE에서 설명했듯이 PE와 1:1로 맵핑됩니다.
LVM의 목적
LVM없이 저장장치를 쓰면 물리디스크를 파티션으로 나눠서 OS에 마운트를 했는데 마운트를 하려면 파티션을 특정 디렉토리와 일치시켜 줘야 했습니다.
하지만 특정 파일 시스템에 마운트된 파티션의 용량이 일정 수준 이상 찼을 때 확장하기 위해 번거로운 작업을 해야했습니다.
1.추가디스크 장착
2.추가 디스크 파티션 생성 및 포맷
3.새로운 마운트 포인트 만들고 추가 파티션 마운트
4.기존 데이터를 새 파티션으로 이동
5.기존 파티션을 언마운트
6.새로운 파티션을 기존 파티션으로 마운트
LVM은 파티션이 아닌 볼륨 단위로 저장장치를 다룰수 있어 물리 디스크를 볼륨그룹(VG)으로 묶고 볼륨그룹을 논리볼륨(LV)으로 분할 관리할 수 있습니다.
마찬가지로 LVM에서 특정 영역의 사용량이 많아져서 저장공간이 부족할 경우 대처가 보다 간단합니다.
1.추가 디스크 장착
2.추가 디스크에 파티션 생성
3.파티션을 물리볼륨으로 초기화
4.물리볼륨을 볼륨그룹에 추가
5. 추가해야하는 논리볼륨의 사이즈를 증가
변경 작업을 할 때 데이터의 삭제 및 이동없이 서비스 구동중 볼륨을 늘리고 줄일수 있습니다
LVM 구축
1. fdisk 파티션 할당
2. pvcreate로 파티션으로 PV 생성
3. vgcreate로 PV들을 묶어 VG를 생성
4. lvcreate로 LV를 생성
5. mkfs로 LV를 파일 시스템 포맷
6. 부팅시 자동으로 저장장치를 읽도록 /etc/fstab에 추가
그림을 기준으로 설명드리겠습니다.
1. fdisk 파티션 할당
# fdisk -l Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x0000b436 Device Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 6293503 2097152 82 Linux swap / Solaris /dev/sda3 6293504 33554431 13630464 83 Linux Disk /dev/sdb: 17.2 GB, 17179869184 bytes, 33554432 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes | cs |
fdisk –l 명령어로 현재 장착된 디스크를 확인할수 있습니다.
fdisk에서 파티션을 나눠 줍니다.
# fdisk /dev/sdb Command (m for help): n //새로운 파티션 생성 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p //주 파티션(p)과 확장 파티션(e)중 주 파티션 선택 Partition number (1-4, default 1): 1 //생성될 파티션의 넘버 First sector (2048-2097151, default 2048): 2048 //디스크의 어디부터 할당할건지 Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): 2097151 //디스크의 어디까지 할당 할건지 Partition 1 of type Linux and of size 1023 MiB is set Command (m for help): t //파티션의 타입을 변경 Selected partition 1 //바꿀 파티션 선택 Hex code (type L to list all codes): 8e //Linux LVM Changed type of partition 'Linux' to 'Linux LVM' | cs |
파티션 생성할 때 커맨드 n입력후 Enter누르면 디폴트 값이 입력됩니다.
만든후 파티션의 타입을 바꿔줍니다
커맨드 t를 입력하면 타입을 변경할수 있습니다
파티션을 하나만 만들었다면 자동으로 그 파티션을 선택하지만 여러 파티션의 경우 파티션을 골라야 합니다.
타입을 변경후 w를 입력해 저장후 종료합니다.
디스크가 여러개면 다른 디스크도 파티션 분할 후 타입을 변경 및 저장합니다.
2. pvcreate로 파티션으로 PV 생성
# pvcreate /dev/sdb1 /dev/sdc1 Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdc1" successfully created. # pvs PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 --- <16.00g <16.00g /dev/sdc1 lvm2 --- <16.00g <16.00g | cs |
pvcreate명령어는 PV를 생성하는 명령어입니다.
/dev/sdc1과 /dev/sdd1을 PV로 만들었습니다.
3. vgcreate로 PV들을 묶어 VG를 생성
# vgcreate data_vg /dev/sdb1 /dev/sdc1 Volume group "data_vg" successfully created # vgs VG #PV #LV #SN Attr VSize VFree data_vg 2 0 0 wz--n- 31.99g 31.99g |
vgcreate 명령어는 VG를 생성하는 명령어입니다.
vgcreate (vg명) (pv명) (pv명)
위 그림에선 한번에 2개의 pv를 묶었지만
만약 vgcreate data_vg /dev/sdc1 만 생성한다면
vgextend 명령어로 확장 가능합니다
확장 명령어는 뒤에서 알려드리겠습니다.
4. lvcreate로 LV를 생성
# lvcreate -L 500M -n data_lv data_vg Logical volume "data_lv" created. # lvcreate -l 10 -n data_lv2 data_vg Logical volume "data_lv2" created. # lvcreate -l 10%vg -n data_lv3 data_vg Logical volume "data_lv3" created. # lvcreate -l 100%FREE -n data_lv4 data_vg Logical volume "data_lv4" created. # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data_lv data_vg -wi-a----- 500.00m data_lv2 data_vg -wi-a----- 40.00m data_lv3 data_vg -wi-a----- <3.20g data_lv4 data_vg -wi-a----- <28.27g |
lvcreate는 LV를 생성하는 명령어입니다.
lvcreate는 옵션을 넣어야 합니다
lvcreate에는 많은 옵션이 존재하지만 자주 쓰는 옵션 3개를 기준으로 설명드리겠습니다.
-l –L –n 이 있는데 –l은 PE사이즈로 크기를 할당 하는 명령어입니다.
PE사이즈는 VG생성할 때 옵션 –s로 사이즈 변경 가능 따로 변경하지 않으면
기본 4MB로 설정됩니다.
ex) 10%VG = vg용량의 10%를 LV로 생성
100%FREE =vg의 여유공간 전부를 LV로 생성
5. mkfs로 LV를 파일 시스템 포맷
# mkfs.xfs /dev/data_vg/data_lv meta-data=/dev/data_vg/data_lv isize=512 agcount=4, agsize=32000 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=128000, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=855, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 | cs |
가장먼저 LV를 파일시스템 형태로 포맷시켜줍니다.
포맷을 한뒤 마운트포인트를 생성합니다
# mkdir /lv{1..4} # ls / bin boot dev etc home lib lib64 lv1 lv2 lv3 lv4 media mnt opt proc root run sbin sos srv sys tmp usr var |
저는 LV를 4개로 나눠 생성했기에 lv1 ~ lv4까지 만들었습니다.
6. 부팅시 자동으로 저장장치를 읽도록 /etc/fstab에 추가
# vim /etc/fstab UUID=319523a4-c838-405f-b5f2-6f0f5cbf19d4 / xfs defaults 0 0 UUID=f5b932a8-b0a3-47dd-92bb-d012afb36373 /boot xfs defaults 0 0 UUID=53ffcb2b-3fed-4572-8e71-b48a093f5add swap swap defaults 0 0 /dev/data_vg/data_lv /lv1 xfs defaults 0 0 /dev/data_vg/data_lv2 /lv2 xfs defaults 0 0 /dev/data_vg/data_lv3 /lv3 xfs defaults 0 0 /dev/data_vg/data_lv4 /lv4 xfs defaults 0 0 |
마운트 포인트에 마운트하기위해 /etc/fstab안에 정보를 넣습니다.
# mount -a # df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 13G 3.6G 9.5G 28% / devtmpfs 905M 0 905M 0% /dev tmpfs 920M 0 920M 0% /dev/shm tmpfs 920M 26M 894M 3% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup /dev/sda1 1014M 166M 849M 17% /boot tmpfs 184M 8.0K 184M 1% /run/user/42 tmpfs 184M 44K 184M 1% /run/user/0 /dev/sr0 4.4G 4.4G 0 100% /mnt /dev/mapper/data_vg-data_lv 497M 26M 472M 6% /lv1 /dev/mapper/data_vg-data_lv2 37M 2.2M 35M 6% /lv2 /dev/mapper/data_vg-data_lv3 3.2G 33M 3.2G 1% /lv3 /dev/mapper/data_vg-data_lv4 29G 33M 29G 1% /lv4 |
mount –a를 입력하면 /etc/fstab에 있는 정보들을 마운트 합니다.
LVM 확장
사용하던 디스크가 거의 다 사용되고 있을 때 서비스를 중지하지 않고 용량의 확장이 가능합니다.
확장을 하려면 추가 디스크 혹은 여유 디스크의 파티션이 있어야 합니다.
# pvcreate /dev/sdd Device /dev/sdd excluded by a filter. # pvs PV VG Fmt Attr PSize PFree /dev/sdb1 data_vg lvm2 a-- <16.00g 0 /dev/sdc1 data_vg lvm2 a-- <16.00g 0 |
2개의 디스크를 data_vg
LVM 삭제
제거하실 때 유의사항
1. LV가 마운트 되어있지 않은가.
2. PV를 제거할때 VG에 속해있지 않은지
3. LV가 있는 상태에서 VG를 제거할경우 하위 LV도 같이 제거된다.
4. 물리장치를 제거할 때 LVM이 존재 하는지
1. LV가 마운트 되어있지 않은가. (마운트 상태 확인)
# vim /etc/fstab # umount /lv{1..4} # df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 13G 3.6G 9.5G 28% / devtmpfs 905M 0 905M 0% /dev tmpfs 920M 0 920M 0% /dev/shm tmpfs 920M 26M 894M 3% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup /dev/sda1 1014M 166M 849M 17% /boot tmpfs 184M 8.0K 184M 1% /run/user/42 tmpfs 184M 44K 184M 1% /run/user/0 /dev/sr0 4.4G 4.4G 0 100% /mnt |
LVM을 생성한 반대로 /etc/fstab의 mount 목록을 지워줍니다
umount /lv{1..4}를 입력해 lv1~4까지의 mount를 해제합니다.
2. 마운트 해제후 LVM제거
mount를 해제한뒤 lvremove로 생성된 lv를 제거해줍니다.
# lvremove /dev/data_vg/data_lv{1..4} Do you really want to remove active logical volume data_vg/data_lv1? [y/n]: y Logical volume "data_lv1" successfully removed Do you really want to remove active logical volume data_vg/data_lv2? [y/n]: y Logical volume "data_lv2" successfully removed Do you really want to remove active logical volume data_vg/data_lv3? [y/n]: y Logical volume "data_lv3" successfully removed Do you really want to remove active logical volume data_vg/data_lv4? [y/n]: y Logical volume "data_lv4" successfully removed |
다음 vg를 제거해줍니다.
# vgremove data_vg Volume group "data_vg" successfully removed |
먼저 lv를 삭제한후 vg를 삭제할경우 즉시 삭제됩니다.
# vgremove data_vg Do you really want to remove volume group "data_vg" containing 4 logical volumes? [y/n]: y Do you really want to remove active logical volume data_vg/data_lv1? [y/n]: y Logical volume "data_lv1" successfully removed Do you really want to remove active logical volume data_vg/data_lv2? [y/n]: y Logical volume "data_lv2" successfully removed Do you really want to remove active logical volume data_vg/data_lv3? [y/n]: y Logical volume "data_lv3" successfully removed Do you really want to remove active logical volume data_vg/data_lv4? [y/n]: y Logical volume "data_lv4" successfully removed Volume group "data_vg" successfully removed |
만약 vg에 lv가 남아있다면 같이 지울건지 물어봅니다
# pvremove /dev/sd{b,c,d}1 Labels on physical volume "/dev/sdb1" successfully wiped. Labels on physical volume "/dev/sdc1" successfully wiped. Labels on physical volume "/dev/sdd1" successfully wiped. |
pvremove명령어로 쓰지않는 pv를 삭제합니다.
LVM 수정
vgreduce와 lvreduce를 설명드리겠습니다.
# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 data_vg lvm2 a-- <16.00g 640.00m /dev/sdc1 data_vg lvm2 a-- <16.00g <16.00g /dev/sdd1 data_vg lvm2 a-- <16.00g <16.00g # vgdisplay --- Volume group --- VG Name data_vg System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size <47.99 GiB PE Size 4.00 MiB Total PE 12285 Alloc PE / Size 3935 / 15.37 GiB Free PE / Size 8350 / <32.62 GiB VG UUID c23Ava-8eH7-kiUP-8uGU-iu0O-HFnG-aVErSG |
먼저 vgreduce를 설명드리겠습니다.
vgreduce는 하나의 볼륨 그룹에 2개 이상의 물리 볼륨이 있을 때 사용 중이지 않는 물리 볼륨을 볼륨 그룹에서 제거하는 명령어입니다.
# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 data_vg lvm2 a-- <16.00g 640.00m /dev/sdc1 data_vg lvm2 a-- <16.00g <16.00g /dev/sdd1 data_vg lvm2 a-- <16.00g <16.00g # vgreduce data_vg /dev/sdd1 Removed "/dev/sdd1" from volume group "data_vg" # pvs PV VG Fmt Attr PSize PFree /dev/sdb1 data_vg lvm2 a-- <16.00g 640.00m /dev/sdc1 data_vg lvm2 a-- <16.00g <16.00g /dev/sdd1 lvm2 --- <16.00g <16.00g |
vgreduce로 data_vg에 있는 물리 볼륨중 /dev/sdd1을 제거했습니다.
lvreduce명령어는 용량이 남는 논리볼륨의 용량을 줄일수 있는 명령어입니다.
논리볼륨의 용량을 1G로 바꿔보겠습니다.
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data_lv1 data_vg -wi-a----- 1000.00m data_lv2 data_vg -wi-a----- 14.39g # lvreduce /dev/data_vg/data_lv2 -L 10G WARNING: Reducing active logical volume to 10.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce data_vg/data_lv2? [y/n]: y Size of logical volume data_vg/data_lv2 changed from 14.39 GiB (3685 extents) to 10.00 GiB (2560 extents). Logical volume data_vg/data_lv2 successfully resized. # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data_lv1 data_vg -wi-a----- 1000.00m data_lv2 data_vg -wi-a----- 10.00g |
lvreduce의 옵션 -L 혹은 -l은 다른 옵션과 동일하며 -100M와 같이 100M만큼 용량에서 제외할수 있습니다.
ex) lvreduce -l -10 /dev/(vg)/(lv) = 40M만큼 용량 제외
lvreduce는 축소 명령어로 확장은 되지 않습니다.
LVM 오류
문서를 작성하며 생길수 있는 문제를 다뤄 보겠습니다.
마운트가 되어있는 상태로 lv를 제거하려면 사용중인 오류 메시지와 함께 삭제가 안됩니다.
>>> 위 오류는 마운트를 해제해준다면 쉽게 해결이 가능합니다.
마찬가지로 vg에 속해있는 pv는 삭제가 되지 않습니다.
해결 방법은 VG를 제거하고 PV를 제거하면 됩니다.
댓글목록
등록된 댓글이 없습니다.