[ LVM - 개요 ]
○ 개념
· LVM은 리눅스 시스템에서 사용되는 디스크 관리 기술로,
물리적인 하나의 디스크를 논리적인 볼륨으로 나누어 사용
(ex. 하드디스크 1GB 1개와 + 2GB 2개를 5GB처럼 사용)
○ 관련 용어
· PV(Physical Volume = 물리 볼륨) : 실제 하드디스크 파티션
(ex. /dev/sdb)
· VG(Volume Group = 볼륨 그룹) : 여러 개의 PV를 묶은 것
(ex. /dev/sdb1와 /dev/sdb2를 datavol 이라는 그룹으로 묶을때 datavol이 VG)
· LV(Logical Volume = 논리 볼륨) : VG를 적절한 크기의 파티션으로 나눔
(ex. datavol을 ui_app과 ui_was, logdata 로 나눔)

○ 생성 과정

[ LVM - 실습 예제 ]
< MISSION >

추가된 하드 디스크(20GB)를 논리적 볼륨으로 할당 및 구성하시오.
- 조건1 : 구성은 ui_app(5GB), ui_was(5GB), logdata(10GB)
- 조건2 : VG명은 datavg
1. 현재 상태 확인
1-1. 마운트 정보 확인
[root@Test ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 878M 0 878M 0% /dev
tmpfs 907M 0 907M 0% /dev/shm
tmpfs 907M 9.4M 897M 2% /run
tmpfs 907M 0 907M 0% /sys/fs/cgroup
/dev/mapper/rhel_test-root 22G 4.7G 18G 22% /
/dev/mapper/rhel_test-home 13G 138M 13G 2% /home
/dev/sda1 1014M 322M 693M 32% /boot
tmpfs 182M 0 182M 0% /run/user/0
tmpfs 182M 24K 182M 1% /run/user/1000
1-2. 블록 장치 리스트 확인
[root@Test ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─rhel_test-root 253:0 0 22G 0 lvm /
├─rhel_test-swap 253:1 0 4G 0 lvm [SWAP]
└─rhel_test-home 253:2 0 13G 0 lvm /home
sdb 8:16 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
2. 파티셔닝
2-1. fdisk로 디스크 추가·활성화
[root@Test ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x2ddb5703.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 엔터
First sector (2048-41943039, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039):
Created a new partition 1 of type 'Linux' and of size 20 GiB.
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/sdb: 20 GiB, 21474836480 bytes, 41943040 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: 0x2ddb5703
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 41943039 41940992 20G 8e Linux LVM
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
| # /fdisk /dev/sdb (파티셔닝 시작) # n (새 파티션 생성) # p (파티션 타입 : primary) # 엔터 (파티션 넘버 : default 값 1) # 엔터 (첫번째 섹터 : default 값 : 최소) # 엔터 (마지막 섹터 default 값 : 최대) # t (타입 설정) # 8e (Hex Code 입력 → Linux LVM 파일시스템) # p (내용 출력 및 확인) # w (저장) |
2-2. 적용 후 확인
[root@Test ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─rhel_test-root 253:0 0 22G 0 lvm /
├─rhel_test-swap 253:1 0 4G 0 lvm [SWAP]
└─rhel_test-home 253:2 0 13G 0 lvm /home
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
sr0 11:0 1 1024M 0 rom
📍 dev/sdb1 라는 파티션이 생성됨.
3. Physical Volume(PV) 생성
3-1. 현재 상태 확인
[root@Test ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel_test lvm2 a-- <39.00g 4.00m
3-2. 생성
[root@Test ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
3-3. 적용 상태 확인
[root@Test ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel_test lvm2 a-- <39.00g 4.00m
/dev/sdb1 lvm2 --- <20.00g <20.00g
📍 dev/sdb1 라는 물리 볼륨(pv)이 생성됨.
4. Volume Group(VG) 생성
4-1. 현재 상태 확인
[root@Test ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel_test 1 3 0 wz--n- <39.00g 4.00m
4-2. 생성
[root@Test ~]# vgcreate datavg /dev/sdb1
Volume group "datavg" successfully created
4-3. 적용 상태 확인
[root@Test ~]# vgs
VG #PV #LV #SN Attr VSize VFree
datavg 1 0 0 wz--n- <20.00g <20.00g
rhel_test 1 3 0 wz--n- <39.00g 4.00m
📍 datavg 라는 볼륨 그룹이 생성됨
5. Logical Volume(LV) 생성
5-1. 현재 상태 확인
[root@Test ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home rhel_test -wi-ao---- 13.00g
root rhel_test -wi-ao---- 21.99g
swap rhel_test -wi-ao---- 4.00g
5-2. 생성
[root@Test ~]# lvcreate -L 5G -n ui_appvol datavg
Logical volume "ui_appvol" created.
[root@Test ~]# lvcreate -L 5G -n ui_wasvol datavg
Logical volume "ui_wasvol" created.
[root@Test ~]# lvcreate -l 100%FREE -n logdatavol datavg
Logical volume "logdatavol" created.
| # lvcreate -L [볼륨용량] -n [LV명] [VG명] → 필요한 용량을 할당 # lvcreate -l 100%FREE -n [LV명] [VG명] → VG에 남은 용량 할당 lvcreate -L 5G -n ui_appvol datavg lvcreate -L 5G -n ui_wasvol datavg lvcreate -l 100%FREE -n logdatavol datavg |
5-3. 적용 상태 확인
[root@Test ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
logdatavol datavg -wi-a----- <10.00g
ui_appvol datavg -wi-a----- 5.00g
ui_wasvol datavg -wi-a----- 5.00g
home rhel_test -wi-ao---- 13.00g
root rhel_test -wi-ao---- 21.99g
swap rhel_test -wi-ao---- 4.00g
📍 logdatavol, ui_appvol, ui_wasvol 이라는 LV가 생성됨
[root@Test ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─rhel_test-root 253:0 0 22G 0 lvm /
├─rhel_test-swap 253:1 0 4G 0 lvm [SWAP]
└─rhel_test-home 253:2 0 13G 0 lvm /home
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
├─datavg-ui_appvol 253:3 0 5G 0 lvm
├─datavg-ui_wasvol 253:4 0 5G 0 lvm
└─datavg-logdatavol 253:5 0 10G 0 lvm
sr0 11:0 1 1024M 0 rom
📍 /dev/sdb1에 3개의 lvm이 묶음으로 구성됨
6. 마운트를 위한 파일시스템 생성
6-1. LV의 실제 위치 확인
[root@Test ~]# lvdisplay
--- Logical volume ---
LV Path /dev/datavg/ui_appvol
LV Name ui_appvol
VG Name datavg
LV UUID l4QcFX-WRnW-yVbr-uHUK-AVNe-5KJ7-cq2f0E
LV Write Access read/write
LV Creation host, time Test, 2023-12-18 21:02:30 -0500
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
--- Logical volume ---
LV Path /dev/datavg/ui_wasvol
LV Name ui_wasvol
VG Name datavg
LV UUID oP62B7-XBDK-UZuY-mt6r-pq1a-gmcE-hs5uYe
LV Write Access read/write
LV Creation host, time Test, 2023-12-18 21:02:35 -0500
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:4
--- Logical volume ---
LV Path /dev/datavg/logdatavol
LV Name logdatavol
VG Name datavg
LV UUID IXGBV9-Wfw6-WA6Z-To0O-HbUq-VVPA-1eAPbL
LV Write Access read/write
LV Creation host, time Test, 2023-12-19 00:07:26 -0500
LV Status available
# open 0
LV Size <10.00 GiB
Current LE 2559
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:5
6-2. 파일시스템 생성
[root@Test ~]# mkfs.xfs /dev/datavg/ui_appvol
meta-data=/dev/datavg/ui_appvol isize=512 agcount=4, agsize=327680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@Test ~]# mkfs.xfs /dev/datavg/ui_wasvol
meta-data=/dev/datavg/ui_wasvol isize=512 agcount=4, agsize=327680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@Test ~]# mkfs.xfs /dev/datavg/logdatavol
meta-data=/dev/datavg/logdatavol isize=512 agcount=4, agsize=655104 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=2620416, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
| # 생성 ▷ mkfs.[파일시스템유형] [경로] mkfs.xfs /dev/datavg/ui_appvol mkfs.xfs /dev/datavg/ui_wasvol mkfs.xfs /dev/datavg/logdatavol # 삭제 ▷ wipefs --all --force LV경로 wipefs --all --force /dev/datavg/ui_appvol wipefs --all --force /dev/datavg/ui_wasvol wipefs --all --force /dev/datavg/logdatavol |
7. 마운트 할 경로 생성
[root@Test ~]# mkdir /ui_app
[root@Test ~]# mkdir /ui_was
[root@Test ~]# mkdir /logdata
| # 생성 ▷ mkdir [경로] mkdir /ui_app mkdir /ui_was mkdir /logdata |
8. 마운트
mount /dev/datavg/ui_appvol /ui_app
mount /dev/datavg/ui_wasvol /ui_was
mount /dev/datavg/logdatavol /logdata
| #마운트 ▷ mount /dev/[VG]/[LV] /[마운트 할 경로] mount /dev/datavg/ui_appvol /ui_app mount /dev/datavg/ui_wasvol /ui_was mount /dev/datavg/logdatavol /logdata |
9. 시스템 재부팅 시 LVM 자동 마운트
9-1. 현재 상태 확인
[root@Test /]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Dec 14 07:39:22 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel_test-root / xfs defaults 0 0
UUID=80c432b7-8155-47a0-a73d-62695f9f4fcc /boot xfs defaults 0 0
/dev/mapper/rhel_test-home /home xfs defaults 0 0
/dev/mapper/rhel_test-swap swap swap defaults 0 0
9-2. 마운트 자동 등록(fstab)
[root@Test /]# vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Dec 14 07:39:22 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel_test-root / xfs defaults 0 0
UUID=80c432b7-8155-47a0-a73d-62695f9f4fcc /boot xfs defaults 0 0
/dev/mapper/rhel_test-home /home xfs defaults 0 0
/dev/mapper/rhel_test-swap swap swap defaults 0 0
/dev/mapper/datavg-ui_appvol /ui_app xfs defaults 0 0
/dev/mapper/datavg-ui_wasvol /ui_was xfs defaults 0 0
/dev/mapper/datavg-logdatavol /logdata xfs defaults 0 0
10. 시스템 재부팅 및 정상여부 확인
[root@Test /]# sync
[root@Test /]# sync
[root@Test /]# sync
[root@Test /]# sync
[root@Test /]# sync
[root@Test /]# reboot