15/120

김건호·2022년 2월 25일
0

LVM(Logical Volume Manage)

여러 개의 하드디스크를 합쳐서 한 개의 파일시스템으로 사용하는 것
필요에 따라 다시 나눌 수 있음
=> 유동적으로 디스크의 용량을 관리

논리 볼륨의 구조

  • PV(Phisical Volume) : 물리 장치와 직접 매핑, 다양한 장치로 생성 가능
  • VG(Volume Group) : 하나 이상의 PV로 구성, 사용 가능한 PE를 LV에 할당
  • LV(Logical Volume) : 실질적인 사용 공간, VG범위 내에서 생성
  • PE(Phisical Extent) : PV를 구성하는 기본단위, 데이터 저장 단위
  • LE(Logical Extent) : LV를 이루는 기본단위, 기본적으로 PE와 1대1매칭

Physical Volume

물리 볼륨 : 파티션

pvcreate

물리볼륨 생성

# pvcreate [장치명]
[root@localhost ~]# pvcreate /dev/sdb[1-4]
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
  Physical volume "/dev/sdb3" successfully created.
  Physical volume "/dev/sdb4" successfully created.

pvdisplay

pv속성출력

# pvdisplay [장치명]
[root@localhost ~]# pvdisplay /dev/sdb1
  "/dev/sdb1" is a new physical volume of "4.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               4.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               MqOJMN-G5dE-AmKO-D1DV-7z2V-G2kI-0EXDST

pv의 생성여부 확인 가능(이 부분은 blkid에서도 확인가능)

[root@localhost ~]# blkid
...
/dev/sdb1: UUID="MqOJMN-G5dE-AmKO-D1DV-7z2V-G2kI-0EXDST" TYPE="LVM2_member"'
...

pvremove

물리볼륨 삭제

# pvremove [pv명]
[root@localhost ~]# pvremove /dev/sdb[1-4]
  Labels on physical volume "/dev/sdb1" successfully wiped.
  ...

Volume Group

볼륨 그룹 : 물리 볼륨을 합쳐서 1개의 물리 그룹으로 만듬

vgcreate

볼륨그룹 생성

# vgcreate [vg명] [pv명]
[root@localhost ~]# vgcreate vg0 /dev/sdb[13]
  Volume group "vg0" successfully created

vgcreate는 필요한 pv를 스스로 만들어서 자신의 볼륨으로 만들 수 있음

[root@localhost ~]# blkid
/dev/sda1: UUID="88f82736-89b0-49e6-88c5-165c88bcc5bf" TYPE="swap"
/dev/sda2: UUID="231c776b-3197-4e9f-a142-6b80be0ca930" TYPE="xfs"
[root@localhost ~]# vgcreate vg0 /dev/sdb[1-4]
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
  Physical volume "/dev/sdb3" successfully created.
  Physical volume "/dev/sdb4" successfully created.
  Volume group "vg0" successfully created

옵션

  • -s n[M,G] : pe 사이즈 지정
[root@localhost ~]# vgcreate vg1 /dev/sdb[24] -s 8M
  Volume group "vg1" successfully created
  
[root@localhost ~]# vgdisplay vg1
  ...
  PE Size               8.00 MiB
  ...

vgdisplay

볼륨 그룹의 속성 확인

[root@localhost ~]# vgdisplay vg0
  --- Volume group ---
  VG Name               vg0
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               9.99 GiB
  PE Size               4.00 MiB (디폴트는 4 메가)
  Total PE              2558
  Alloc PE / Size       0 / 0
  Free  PE / Size       2558 / 9.99 GiB
  VG UUID               ihpb5z-u5FD-0Ir3-DhbP-LM5Y-Ia3a-y3xoV0

vgremove

볼륨그룹 삭제

# vgremove [vg명]
[root@localhost ~]# vgremove vg0
  Volume group "vg0" successfully removed

vgextend

볼륨그룹 확장

# vgextend [vg명] [pv명]
[root@localhost ~]# vgdisplay vg0
...
  VG Size               9.99 GiB
  PE Size               4.00 MiB
...

[root@localhost ~]# vgextend vg0 /dev/sdb2
  Volume group "vg0" successfully extended
  
[root@localhost ~]# vgdisplay vg0
...
   VG Size               <13.99 GiB # 볼륨그룹이 확장이 됐음
  PE Size               4.00 MiB
...

vgreduce

볼륨그룹 축소

# vgreduce [vg명] [pv명]
[root@localhost ~]# vgreduce vg0 /dev/sdb2
  Removed "/dev/sdb2" from volume group "vg0“

제거하기 위해서는 파티션 내에 데이터가 없어야한다

데이터가 있어서 오류가 나는 경우

[root@localhost ~]# vgreduce vg0 /dev/sdb1
  Physical volume "/dev/sdb1" still in use

이때 필요한 명령어가 pvmove다

pvmove

물리볼륨 내용 이동

# pvmove [pv명]
[root@localhost ~]# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...
sdb            8:16   0   20G  0 disk
├─sdb1         8:17   0    4G  0 part
│ └─vg0-lv02 253:1    0    3G  0 lvm  /mnt/disk2
├─sdb2         8:18   0    4G  0 part
├─sdb3         8:19   0    6G  0 part
│ └─vg0-lv01 253:0    0    4G  0 lvm  /mnt/disk1
sr0           11:0    1 1024M  0 rom
# 이동
[root@localhost ~]# pvmove /dev/sdb1
  /dev/sdb1: Moved: 0.52%
/dev/sdb1: Moved: 100.00%
# 데이터가 옮겨진 모습
[root@localhost ~]# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...
sdb            8:16   0   20G  0 disk
├─sdb1         8:17   0    4G  0 part
├─sdb2         8:18   0    4G  0 part
│ └─vg0-lv02 253:1    0    3G  0 lvm  /mnt/disk2
├─sdb3         8:19   0    6G  0 part
│ └─vg0-lv01 253:0    0    4G  0 lvm  /mnt/disk1
sr0           11:0    1 1024M  0 rom
[root@localhost ~]# vgreduce vg0 /dev/sdb1
  Removed "/dev/sdb1" from volume group "vg0“
# 볼륨 그룹에서 제거 성공

옮겨지는 파티션은 시스템에서 남아있는 공간 파티션으로 랜덤으로 지정

pvmove 실행 시 용량이 모자라다고 뜨는 경우

[root@localhost ~]# pvmove /dev/sdb3
  Insufficient free space: 1535 extents needed, but only 73 available
  Unable to allocate mirror extents for vg0/pvmove0.
  Failed to convert pvmove LV to mirrored.

pv가 바로되는 경우 볼륨그룹에 나머지 공간이 있어야함 => 기존에 있는 내용들을 합쳐서 공간을 만듬
1. 그룹을 확장(공간을 늘림)

[root@localhost ~]# vgextend vg0 /dev/sdb4
  Volume group "vg0" successfully extended
  1. pvmove 실행
[root@localhost ~]# pvmove /dev/sdb3
  /dev/sdb3: Moved: 0.13%
  /dev/sdb3: Moved: 91.60%
  /dev/sdb3: Moved: 100.00%

확장하는 용량은 제거하고자 하는 pv의 크기보다 같거나 커야 함

Logical Volume

논리 볼륨 : 볼륨 그룹을 1개 이상 나눠서 논리 그룹을 나눔
명령어로 확장
최소 단위 : PE(LE)
LV를 만드는 가정 pv생성 -> vg 생성 -> lv 생성 -> lv 포맷 -> lv 마운트

lvcreate

논리볼륨 생성

lvcreate [vg명] [-L 실제 크기 or -l le 갯수] [-n lv명]
# -l 옵션 사용시 용량 / pe사이즈 를 하여 le 값을 구함
# 여기선 1G로 만들려고 함(pe사이즈는 4M) -> 1024 / 4 = 256
[root@localhost ~]# lvcreate vg0 -l 256 -n lv01
  Logical volume "lv01" created.
  
[root@localhost ~]# lvcreate vg0 -L 2G -n lv02
  Logical volume "lv02" created.

확인

[root@localhost ~]# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...
sdb            8:16   0   20G  0 disk
├─sdb1         8:17   0    4G  0 part
│ ├─vg0-lv01 253:0    0    1G  0 lvm
│ └─vg0-lv02 253:1    0    2G  0 lvm
...

lv의 순서는 시스템에서 랜덤으로 지정

lvm은 경로가 3가지❗

[root@localhost ~]# ls -l /dev/vg0/lv01 /dev/mapper/vg0-lv01 /dev/dm-0
brw-rw----. 1 root disk 253, 0  2월 25 14:26 /dev/dm-0 (실제 지정된 이름)
lrwxrwxrwx. 1 root root      7  2월 25 14:26 /dev/mapper/vg0-lv01 -> ../dm-0
lrwxrwxrwx. 1 root root      7  2월 25 14:26 /dev/vg0/lv01 -> ../dm-0

lv가 많아지게 되면 실제 지정된 이름으로 구분이 힘듬
/dev/vg0/lv01와 같은 경로는 사용자가 주로 사용하고
/dev/mapper/vg0-lv01와 같은 경로는 시스템이 주로 사용함

lvdisplay

lv속성 확인

// lvdisplay /dev/mapper/vg0-lv02 같은 패턴도 가능
[root@localhost ~]# lvdisplay /dev/vg0/lv01
  --- Logical volume ---
  LV Path                /dev/vg0/lv01
  LV Name                lv01
  VG Name                vg0
  LV UUID                WwUd3V-0gGj-AqEo-MULY-EmhZ-wtyv-qBdgvn
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2022-02-25 14:26:49 +0900
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

남은 용량을 다 쓰려고 했는데 이런 에러가 난다면❓

[root@localhost ~]# lvcreate vg0 -L 7G -n lv03
  Volume group "vg0" has insufficient free space (1790 extents): 1792 required.

LE사이즈가 1792가 되야하는데 남은 공간이 1790이라 생기는 문제
다음과 같이 사용

[root@localhost ~]# lvcreate vg0 -l 100%FREE -n lv03
  Logical volume "lv03" created.

lv 포맷

파티션 포맷하는 명령어와 같음

[root@localhost ~]# mkfs -t xfs /dev/vg0/lv01
[root@localhost ~]# mkfs.ext4 /dev/mapper/vg0-lv02

확인

[root@localhost ~]# blkid
...
/dev/mapper/vg0-lv01: UUID="0b2baf8a-30d2-4737-9765-f6c6a09a6057" TYPE="xfs"
/dev/mapper/vg0-lv02: UUID="636ad79c-0d2a-4ee6-bb2c-fc157227e596" TYPE="ext4“
...

lv 마운트

파티션의 마운트와 같은 방법

[root@localhost ~]# mount /dev/vg0/lv01 /mnt/disk1
[root@localhost ~]# mount /dev/mapper/vg0-lv02 /mnt/disk2

마운트 확인

[root@localhost ~]# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...
sdb            8:16   0   20G  0 disk
├─sdb1         8:17   0    4G  0 part
│ ├─vg0-lv01 253:0    0    1G  0 lvm  /mnt/disk1
│ ├─vg0-lv02 253:1    0    2G  0 lvm  /mnt/disk2
│ └─vg0-lv03 253:2    0    7G  0 lvm
...

lvremove

논리볼륨 삭제

lvremove lv경로
  1. 마운트를 먼저 해제
[root@localhost ~]# umount /mnt/disk1
[root@localhost ~]# umount /mnt/disk2
  1. 삭제 진행
[root@localhost ~]# lvremove /dev/mapper/vg0-lv0[23]
Do you really want to remove active logical volume vg0/lv02? [y/n]: y
  Logical volume "lv02" successfully removed
Do you really want to remove active logical volume vg0/lv03? [y/n]: y
  Logical volume "lv03" successfully removed

마운트 해제하지 않고 삭제를 진행한다면❓

[root@localhost ~]# lvremove /dev/vg0/lv01
  Logical volume vg0/lv01 contains a filesystem in use.

현재 사용중이기 때문에 삭제를 할 수 없음

lvextend

논리볼륨 확장

lvextend lv경로 -r(파일시스템 확장)
[root@localhost ~]# lvextend -L +0.5G /dev/vg0/lv01 -r
  Size of logical volume vg0/lv01 changed from 6.00 GiB (1536 extents) to 6.50 GiB (1664 extents).
  Logical volume vg0/lv01 successfully resized.
meta-data=/dev/mapper/vg0-lv01   isize=512    agcount=6, agsize=262144 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1572864, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1572864 to 1703936

-r 옵션을 사용해주지 않으면 파일시스템이 포맷되지 않음=>df -Th로 확인했을 때 용량이 증가되지 않은 걸 확인할 수 있음(확장으로 공간은 늘어났지만 파일시스템을 포맷하지않아 사용가능한 공간으로 인식하지 못한 것)

-r 옵션을 빼먹었어요❗ 다시 확장해야하나요❓ lvm명령어로 확장 가능
xfs 파일시스템 확장

# xfs_growfs [마운트 포인트]
[root@localhost ~]# xfs_growfs /mnt/disk1

ext4 파일시스템 확장

# resize2fs [lv경로]
[root@localhost ~]# resize2fs /dev/vg0/lv02

lvreduce를 권장하지 않는 이유
어느 부분을 축소할지 확정 할 수 없음 -> 기존의 데이터 손상될 가능성이 존재

profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

0개의 댓글