본문 바로가기
모의해킹 침해대응 과정/Liunx 관리

리눅스 LVM / day 8, 9

by 알거음슴 2021. 4. 8.

LVM (Logical Volume Manager)

가상볼륨방식, PV(Physical Volume) 을 LV(Logical Volume) 으로 전환하여 사용하는 방식. 여러가지의 PV를 묶어서 논리적으로 연결시켜 LV 로 하여금 이용하는 방식이다.

[용어해설]

볼륨 (Volume) : 블록단위로 접근하는 스토리지(저장소) = disk / partitions

 

1. 장점 및 기능 : 확장성, 안정성, 편의성(관리용이) 가 유리하다.

 유연한 용량 

 크기조정 가능한 스토리지 풀

 온라인 데이터 재배치

 디스크 스트라이핑 (DIsk Stripe)

 미러 볼륨 (Mirror Volume)

 볼륨 스냅샷 (Volume Snapshot)

* 스냅샷 (Snapshot)

파일은 inode 와 datablack 으로 구성되어있다. 

백업(backup) 은 inode 와 datablack 를 모두 복사해두는 방식.

스냅샷(Snapshot) 은 inode 만 복사해두는 방식.

 

 

2. 주요 개념/용어

1) 용어

 PV (Physical Volume) : 물리적인 볼륨 Disk 또는 Partitions

 VG (Volume Group) : PV들의 집합 가상 디스크  

 LV (Logical Volume) : VG 공간을 전체 또는 분할하여 논리적으로 할당한 공간. 가상 파티션

 PE (Physical Extent) : 기본단위 4M, VG 내 PV의 볼륨의 최소단위 (1m ~ 256m 사이 지정가능)

 LE (Logical Extent) : 기본단위 4M LV 내 볼륨을 지정하는 최소단위

 

2) 가상 파티션을 나누는 방식. (LV 생성방식)

 Table (LV생성 기본값)

PE 와 LE가 1:1로 지정되는 방식 하나의 PV 내 PE 를 LE와 순차적 매핑을 진행하는 방식 

 Mirror

PE 와 LE가 2:1 or 3:1 등으로 지정되는 방식 (tow-way, three-way)

 Stripe

PE 와 LE 1:1 로 지정되는 방식, 여러 PV 내 PE 를 LE 와 동시다발적 매핑을 진행하는 방식.

 

3. 구성

 1) 사용중이지 않은 DISK를 장착하여 확인한다.

[root@server1 ~]# ls -l /dev/sd? 
brw-rw---- 1 root disk 8,  0 Apr  8 17:59 /dev/sda
brw-rw---- 1 root disk 8, 16 Apr  8 17:59 /dev/sdb
brw-rw---- 1 root disk 8, 32 Apr  8 18:03 /dev/sdc
brw-rw---- 1 root disk 8, 48 Apr  8 17:59 /dev/sdd
brw-rw---- 1 root disk 8, 64 Apr  8 17:59 /dev/sde
brw-rw---- 1 root disk 8, 80 Apr  8 17:59 /dev/sdf

 

 

 2) Disk 를 하나의 파티션으로 구성. (Partition System ID: 8e) 

[root@server1 ~]# fdisk /dev/sdc

Command (m for help): p
Disk /dev/sdc: 1 GiB, 1073741824 bytes, 2097152 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
Disklabel type: dos
Disk identifier: 0x86800e60

Device      Boot  Start        End  Sectors   Size     Id  Type
/dev/sdc1          2048  2097151 2095104  1023M 83  Linux

 

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): p
Disk /dev/sdc: 1 GiB, 1073741824 bytes, 2097152 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
Disklabel type: dos
Disk identifier: 0x86800e60

Device     Boot  Start        End  Sectors    Size      Id  Type
/dev/sdc1         2048  2097151  2095104  1023M  8e  Linux LVM

... 이하 모든 disk 동일작업 진행

[root@server1 ~]# fdisk -l | grep LVM
/dev/sdc1        2048 2097151 2095104 1023M 8e Linux LVM

/dev/sdd1        2048 2097151 2095104 1023M 8e Linux LVM

/dev/sde1        2048 2097151 2095104 1023M 8e Linux LVM

/dev/sdf1        2048 2097151 2095104 1023M 8e Linux LVM

 

 

 3) PV 생성

* ID 8e 이어야 만 가능.

pvcreate <DISK> : PV 생성 명령어

pvs : pv 확인 명령어

pvremove : PV를 지우는 명령어

* PV 정보들을 확인하는 명령어 : pvscan, lvmdiskcan

[root@server1 ~]# pvcreate /dev/sdc1
WARNING: xfs signature detected on /dev/sdc1 at offset 0. Wipe it? [y/n]: y  ( 파일시스템 포맷여부 )
Wiping xfs signature on /dev/sdc1.
Physical volume "/dev/sdc1" successfully created.

[root@server1 ~]# pvs
  PV          VG  Fmt   Attr  PSize       PFree   
  /dev/sdc1      lvm2  ---   1023.00m  1023.00m

... 이하 모든 disk 동일작업 진행

 

[root@server1 ~]# pvs
  PV          VG  Fmt   Attr   PSize       PFree   
  /dev/sdc1      lvm2  ---   1023.00m  1023.00m
  /dev/sdd1      lvm2  ---   1023.00m  1023.00m
  /dev/sde1      lvm2  ---   1023.00m  1023.00m
* pvs 정보 분석

 PV : PV 이름

 VG : PV 가 포함된 VG 이름

 Fmt : LVM 버전

 Attr : LVM thrtjd

 PSize : PV 크기

 PFree : PV 남은 공간

 

[실습] PV 생성, 삭제, 이름변경 등 옵션을 수행해보자

 

 

 4) VG 생성

-> 최소한 하나 이상의 PV가 있어야 생성가능

vgcreate : VG를 생성하는 명령어   ( -s = pv의 size 변경 )

vgremove : VG를 삭제하는 명령어

vgextend : VG에 PV를 추가하는 명령어  /  vgreduce : VG에 일부 PV를 제거하는 명령어

vgrename : VG의 이름을 재지정 하는 명령어

vgs / vgdisplay / vgscan : VG를 확인하는 명령어

 

[root@server1 ~]# vgcreate vg1 /dev/sd[cde]1
  Volume group "vg1" successfully created
[root@server1 ~]# vgs
  VG   #PV  #LV  #SN  Att r     VSize     VFree 
   cl     1     3      0    wz--n-  <59.00g      0 
  vg1   3      0      0   wz--n-   <2.99g  <2.99g

 

[실습] VG 생성, 삭제, 이름변경 등 옵션을 수행해보자

 

 

 5) LV 생성 (LV의 이름은 자동생성됨)

lvcreate : LV를 생성 (이하 옵션과 함깨 사용되어야함)

lvcreate -L 10G vg1 :  용량을 지정하여 LV 생성, (기본단위는 M 단위 단위기호 사용가능)

lvcreate -n lv1 : LV의 이름을 지정하여 생성

lvcreate -l 20% vg1 : 용량을 %로 지정하여 LV 생성

lvcreate -l 100%FREE : 남은 용량의 전체를 지정하여 LV 생성

 

lvremove : LV를 삭제

lvrename vg1 lv1 lv2 : LV 이름 재지정

lvextend -L 12G : LV의 용량을 12G로 맞춰라

lvextend -L +1G : LV의 용량에 1G를 추가하라

lvextend -l +100%FREE : LV의 용량에 남은공간을 모두 추가하라

lvreduce -L 3G : LV의 용량을 3G로 맞춰라

lvreduce -L -3G : LV의 용량에 3G를 제거하라

lvs / lvscan / lvdisplay : LV 정보확인용 명령어

 

[root@server1 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree 
  cl    1   3   0 wz--n- <59.00g     0 
  vg1   3   0   0 wz--n-  <2.99g <2.99g
[root@server1 ~]# lvcreate -L 1G -n lv1 vg1
  Logical volume "lv1" created.
[root@server1 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree 
  cl    1   3   0 wz--n- <59.00g     0 
  vg1   3   1   0 wz--n-  <2.99g <1.99g
[root@server1 ~]# lvcreate -l 100%FREE -n lv2 vg1
  Logical volume "lv2" created.
[root@server1 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree
  cl    1   3   0 wz--n- <59.00g    0 
  vg1   3   2   0 wz--n-  <2.99g    0 

[root@server1 ~]# lvs
   LV     VG    Attr        LSize       Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
   lv1    vg1  -wi-a-----   1.00g                                                    
   lv2    vg1  -wi-a-----  <1.99g     

 

[실습] LV 생성, 삭제, 이름변경 등 옵션을 수행해보자

[참고] LV의 크기를 줄이기 위해서는 백업과정을 거친다.

-> 백업하고난 뒤 크기를 줄이고, 혹시 이상이있으면 복구과정을 진행해야함

-> 스냅샷을 뜨고 크기줄이고, 혹시 이상이 있으면 복구과정을 진행해야함.

 

 6) F/S 생성

mkfs CMD 를 통하여 생성진행

[root@server1 ~]# mkfs.ext4 /dev/vg1/lv1
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 134144 4k blocks and 33600 inodes
Filesystem UUID: 4c35b4c7-fb5b-4881-abf3-7b9a94e7a6a9
Superblock backups stored on blocks: 
32768, 98304

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

 

 7) 마운트

mount CMD를 활용하여 마운트를 진행, 및 LVM setting을 완료한다.

[root@server1 ~]# mkdir -p /lv1 /lv2
[root@server1 ~]# mount /dev/vg1/lv1 /lv1
[root@server1 ~]# mount /dev/vg1/lv2 /lv2
[root@server1 ~]# df
Filesystem          Type      Size  Used Avail Use% Mounted on
devtmpfs            devtmpfs  1.8G     0  1.8G   0% /dev
tmpfs               tmpfs     1.9G     0  1.9G   0% /dev/shm
tmpfs               tmpfs     1.9G   26M  1.8G   2% /run
tmpfs               tmpfs     1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/cl-root xfs        39G  5.6G   33G  15% /
/dev/sda1           xfs      1014M  240M  775M  24% /boot
/dev/mapper/cl-home xfs        19G  179M   19G   1% /home
tmpfs               tmpfs     371M  1.2M  370M   1% /run/user/42
tmpfs               tmpfs     371M  4.6M  367M   2% /run/user/0
/dev/sr0            iso9660   8.7G  8.7G     0 100% /run/media/root/CentOS-8-3-2011-x86_64-dvd
/dev/mapper/vg1-lv1 ext4      500M  804K  463M   1% /lv1
/dev/mapper/vg1-lv2 ext4      976M  2.6M  907M   1% /lv2

 

[참고] /etc/fstab 에 추가하는 방법.

/dev/mapper/vg1-lv1     /lv1    ext4        defaults    1   2
/dev/vg1/lv2                /lv2    ext4        defaults    1   2

2가지 방법으로 내용추가가 가능하다. (어느걸 사용해도 상관없음)

 

[참고] 이전 방식과 LVM 방식의 비교

[이전작업방식] [LVM 작업방식]

() 파티션 작업 (Partition ID 83)
# fdisk /dev/sdc


(
) 파일시스템 작업

# mkfs.ext3 /dev/sdc1

() 마운트 작업

# vi /etc/fstab

# mkdir /oracle

# mount /oracle

() 파티션 작업(Partition ID (83 -> 8e))
# fdisk /dev/sdc
# pvcreate /dev/sdc1
# vgcreate vg1 /dev/sdc1
# lvcreate -l 100%FREE -n lv1 vg1

() 파일시스템 작업

# mkfs.ext3 /dev/vg1/lv1

 

() 마운트 작업
# vi /etc/fstab
# mkdir /oracle
# mount /oracle

 

3. LVM 관리

 1) LVM 용량 관리 ( 파일 시스템에 따른 방법 ) 

 

[참고] 파일시스템 지정 후 LV 의 용량 관리

ext4 : 용량을 늘리고 줄이기 가능. (resize2fs [/dev/vg1/lv2] CMD로 적용 필수)

xfs : 용량을 늘리기는 가능하나 줄이기는 불가. (xfs_growfs [/mnt/point] CMD로 적용 필수)

 

 ex1) ext4의 경우 용량 늘리기.

[root@server1 /dev/mapper]# df /lv[12]
Filesystem          Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1 ext4  500M  401M   63M  87% /lv1
/dev/mapper/vg1-lv2 ext4  976M  403M  507M  45% /lv2

 

[root@server1 /dev/mapper]# lvextend -l 100%FREE /dev/vg1/lv1
  Size of logical volume vg1/lv1 changed from 524.00 MiB (131 extents) to <1.48 GiB (378 extents).
  Logical volume vg1/lv1 successfully resized.

 

[root@server1 /dev/mapper]# df /lv[12]
Filesystem          Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1 ext4  500M  401M   63M  87% /lv1
/dev/mapper/vg1-lv2 ext4  976M  403M  507M  45% /lv2

 

[root@server1 /dev/mapper]# resize2fs /dev/vg1/lv1
resize2fs 1.45.6 (20-Mar-2020)
Filesystem at /dev/vg1/lv1 is mounted on /lv1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg1/lv1 is now 387072 (4k) blocks long.

[root@server1 /dev/mapper]# df /lv[12]
Filesystem          Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1 ext4  1.5G  402M 1004M  29% /lv1
/dev/mapper/vg1-lv2 ext4  976M  403M  507M  45% /lv2

 

 

 ex2) ext4의 경우 용량을 줄이기 (Filesystem Shrink)

파일시스템 용량을 줄이는 경우의 절차 -> 이행되지 않으면 파일이 망가질 수 있음.!!!

 () 파일시스템 언마운트(umount)

  # umount /lv1

 () 파일시스템 점검(fsck -f/fsck.ext3 -f/e2fsck -f)

  # e2fsck -f /dev/vg1/lv1

 () 파일시스템 용량 줄이기

  # resize2fs -p /dev/vg1/lv1 700M  (700M 로 용량을 줄이는것이 아닌 700M로 만드는것)

 () LV 용량 줄이기

  # lvrecuce -L 700M /dev/vg1/lv1

* 파일시스템에서 지정한 용량과 lvrecuce 에서 지정하는 용량은 반드시 동일해야한다!

 

[참고] resize2fs -p /dev/vg1/lv1 1.5G 형식은 사용이 불가하다

(X) # resize2fs -p /dev/vg1/lv1 1.5G

(0) # resize2fs -p /dev/vg1/lv1 1500M

-> 이렇게 하게 되면.. 바로 파일시스템 망가짐

 

[참고] 용량증설, 감소의 비교

용량의 증설 : lvextend CMD -> resize2fs CMD

용량의 감소 : resize2fs CMD -> lvrecuce CMD * 단 두 CMD에 지정된 용량은 반드시 같아야한다.

 

 

 2) VG 안의 PV 를 새로운 PV 로 교체

피지컬 디스크를 업그레이드 하는 과정에서 PV를 교체하는방법.

pvmove pv1 pv2 : pv1의 파일들을 pv2로 옮긴다.

 

[root@server1 ~]# fdisk /dev/sdg

[root@server1 ~]# pvcreate /dev/sdg1
  Physical volume "/dev/sdg1" successfully created.

[root@server1 ~]# pvs
  PV         VG  Fmt  Attr PSize    PFree   
  /dev/sda2  cl  lvm2 a--   <59.00g       0 
  /dev/sdc1  vg1 lvm2 a--  1020.00m       0 
  /dev/sdd1  vg1 lvm2 a--  1020.00m    4.00m
  /dev/sde1  vg1 lvm2 a--  1020.00m       0 
  /dev/sdf1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdg1      lvm2 ---  1023.00m 1023.00m

[root@server1 ~]# pvmove /dev/sde1 /dev/sdg1
  /dev/sde1: Moved: 9.41%
  /dev/sde1: Moved: 100.00%
[root@server1 ~]# pvs
  PV         VG  Fmt  Attr PSize    PFree   
  /dev/sda2  cl  lvm2 a--   <59.00g       0 
  /dev/sdc1  vg1 lvm2 a--  1020.00m       0 
  /dev/sdd1  vg1 lvm2 a--  1020.00m    4.00m
  /dev/sde1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdf1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdg1  vg1 lvm2 a--  1020.00m       0 

[root@server1 ~]# vgreduce vg1 /dev/sde1
  Removed "/dev/sde1" from volume group "vg1"

 

 3) LV/VG/PV 삭제

작업 순서

 umount 작업

 LV 삭제(lvremove CMD)

 VG 삭제(vgremove CMD)

 PV 삭제(pvremove CMD)

 

 

 

4. Stripe 방식, Mirror 방식 으로 LVM 구성.

 1. Stripe 방식

lvcreate -L 50G -i2 -n lv1 vg1

lvcreate -L 50G -i2 -I64 -n lv1 vg1  (-I : 대문자 i)

 -i 옵션: number of stripes : 볼륨의 갯수를 지정 ex) -i2=2개의 볼륨에 거쳐 생성. ( 자동으로 PV 지정 )

 -I 옵션: stripe size(KB) : 볼륨의 저장기준 지정 (기본값이 64KB) 

 

 1) 생성

[root@server1 ~]# pvcreate /dev/sd[cde]1

[root@server1 ~]# vgcreate vg1 /dev/sd[cde]1

[root@server1 ~]# pvs
  PV         VG  Fmt  Attr PSize    PFree   
  /dev/sda2  cl  lvm2 a--   <59.00g       0 
  /dev/sdc1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdd1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sde1  vg1 lvm2 a--  1020.00m 1020.00m

[root@server1 ~]# lvcreate -L 1500M -i3 -n stripelv vg1

[root@server1 ~]# pvs
  PV         VG  Fmt  Attr PSize    PFree  
  /dev/sda2  cl  lvm2 a--   <59.00g      0 
  /dev/sdc1  vg1 lvm2 a--  1020.00m 520.00m
  /dev/sdd1  vg1 lvm2 a--  1020.00m 520.00m
  /dev/sde1  vg1 lvm2 a--  1020.00m 520.00m

 

 2) 확장

(1) VG의 잔여 공간을 할당하기

[root@server1 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree
  cl    1   3   0 wz--n- <59.00g    0 
  vg1   3   1   0 wz--n-  <2.99g 1.52g
[root@server1 ~]# lvextend -l +100%FREE /dev/vg1/stripelv
[root@server1 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree
  cl    1   3   0 wz--n- <59.00g    0 
  vg1   3   1   0 wz--n-  <2.99g    0 

 

(2) VG에 PV 추가

[root@server1 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree
  cl    1   3   0 wz--n- <59.00g    0 
  vg1   3   1   0 wz--n-  <2.99g    0 
[root@server1 ~]# pvcreate /dev/sd[fgh]1.
[root@server1 ~]# vgextend vg1 /dev/sd[fgh]1
[root@server1 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree 
  cl    1   3   0 wz--n- <59.00g     0 
  vg1   6   1   0 wz--n-  <5.98g <2.99g

 

 

 2.Mirror 방식

lvcreate -L 50G -m 1 -n lv1 vg1

 -> -m 옵션: number of copies

lvcreate -L 12G -m 1 -n lv1 vg1 /dev/sdc1 /dev/sdd1

 -> 원하는 PV로 지정을 원할 시 

 

 1) 생성

[root@server1 ~]# pvcreate /dev/sd[cdef]1

[root@server1 ~]# vgcreate vg1 /dev/sd[cdef]1
[root@server1 ~]# pvs
  PV         VG  Fmt  Attr PSize    PFree   
  /dev/sda2  cl  lvm2 a--   <59.00g       0 
  /dev/sdc1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdd1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sde1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdf1  vg1 lvm2 a--  1020.00m 1020.00m

[root@server1 ~]# lvcreate -L 100M -m 1 -n mirrorlv vg1

[root@server1 ~]# pvs
  PV         VG  Fmt  Attr PSize    PFree   
  /dev/sda2  cl  lvm2 a--   <59.00g       0 
  /dev/sdc1  vg1 lvm2 a--  1020.00m  916.00m
  /dev/sdd1  vg1 lvm2 a--  1020.00m  916.00m
  /dev/sde1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdf1  vg1 lvm2 a--  1020.00m 1020.00m

 

 2) 확장

[root@server1 ~]# pvs
  PV         VG  Fmt  Attr PSize    PFree   
  /dev/sda2  cl  lvm2 a--   <59.00g       0 
  /dev/sdc1  vg1 lvm2 a--  1020.00m  916.00m
  /dev/sdd1  vg1 lvm2 a--  1020.00m  916.00m
  /dev/sde1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdf1  vg1 lvm2 a--  1020.00m 1020.00m

[root@server1 ~]# lvextend -L +100M /dev/vg1/mirrorlv
[root@server1 ~]# pvs
  PV         VG  Fmt  Attr PSize    PFree   
  /dev/sda2  cl  lvm2 a--   <59.00g       0 
  /dev/sdc1  vg1 lvm2 a--  1020.00m  816.00m
  /dev/sdd1  vg1 lvm2 a--  1020.00m  816.00m
  /dev/sde1  vg1 lvm2 a--  1020.00m 1020.00m
  /dev/sdf1  vg1 lvm2 a--  1020.00m 1020.00m