공유할 서비스 선택

TECH


TECH

OS [Linux] LVM 소개 및 설정

페이지 정보

작성자 LeeHyongDong 아이디로 검색 전체게시물 댓글 0건 조회 844회 좋아요 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로 맵핑됩니다.

 

66ea0254c009c93e43c837c9b5d5e7cb_1569808637_1019.png
 

 

 

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은 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명령어는 용량이 남는 논리볼륨의 용량을 줄일수 있는 명령어입니다.

7b0855f0fc17c0cba2f5c1949a556f39_1570173548_4018.png

논리볼륨의 용량을 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를 제거하려면 사용중인 오류 메시지와 함께 삭제가 안됩니다.

  f556d6a2dcf3cb4c6af03320e28c0572_1570011264_1118.png
 
>>> 위 오류는 마운트를 해제해준다면 쉽게 해결이 가능합니다. 

마찬가지로 vg에 속해있는 pv는 삭제가 되지 않습니다.

 f556d6a2dcf3cb4c6af03320e28c0572_1570011088_0392.png 

해결 방법은 VG를 제거하고 PV를 제거하면 됩니다. 

댓글목록

등록된 댓글이 없습니다.

TECH 목록
번호 제목 작성자 작성일 조회수
57 Middleware 미들웨어 아이디로 검색 전체게시물 09-19 24
(Monitoring) WAS 오픈소스 모니터링 소개 "Grafana & Prometues을 사용한 모니터링 방법"

카테고리 : Middleware

24 0
작성자 : 미들웨어 20/09/19
56 OS LeeHyongDong 아이디로 검색 전체게시물 09-15 38
[Linux] RedHat Insights 설명 및 설정

카테고리 : OS

38 0
작성자 : LeeHyongDong 20/09/15
55 Middleware 미들웨어 아이디로 검색 전체게시물 09-01 81
(Monitoring) WAS 오픈소스 모니터링 소개 "Scouter"

카테고리 : Middleware

81 0
작성자 : 미들웨어 20/09/01
54 OS LeeHyongDong 아이디로 검색 전체게시물 08-17 127
[Linux] CentOS 및 Oracle linux에서 RHEL로 전환방법

카테고리 : OS

127 0
작성자 : LeeHyongDong 20/08/17
53 Middleware 미들웨어 아이디로 검색 전체게시물 08-16 92
(OutOfMemory-3) OutOfMemory 발생시 slack 알람으로 메세지 전송 스크립트

카테고리 : Middleware

92 0
작성자 : 미들웨어 20/08/16
52 ETC Leesangwoo 아이디로 검색 전체게시물 08-12 213
Docker 소개

카테고리 : ETC

213 0
작성자 : Leesangwoo 20/08/12
51 Middleware 미들웨어 아이디로 검색 전체게시물 08-03 207
(OutOfMemory-2) OutOfMemoryError 원인과 대책 & "GC란?..튜닝방법 공개"..Jstat, Jmater, Visual GC

카테고리 : Middleware

207 0
작성자 : 미들웨어 20/08/03
50 OS LeeHyongDong 아이디로 검색 전체게시물 07-28 299
[Linux] fence loop 설명 및 방지

카테고리 : OS

299 0
작성자 : LeeHyongDong 20/07/28
49 Middleware 미들웨어 아이디로 검색 전체게시물 07-18 271
(OutOfMemory-1) OutOfMemnory 란? OOM & HeapDump 파일생성 및 분석 가이드

카테고리 : Middleware

271 0
작성자 : 미들웨어 20/07/18
48 Middleware 미들웨어 아이디로 검색 전체게시물 07-18 213
(Nginx-6) Nginx 사용하는 옵션정리 6_php-fpm & zabbix 모니터링

카테고리 : Middleware

213 0
작성자 : 미들웨어 20/07/18
Total 57건
게시물 검색

주식회사 클럭스| 대표 : 이찬호| 사업자등록번호 : 107-87-27655
주소 : 서울특별시 영등포구 국회대로 800, 여의도파라곤
E-mail : sales@chlux.co.kr
Copyright © 클럭스 www.chlux.co.kr All rights reserved.
상단으로Top