여러 개의 하드디스크를 합쳐서 한 개의 파일시스템으로 사용하는 것
필요에 따라 다시 나눌 수 있음
=> 유동적으로 디스크의 용량을 관리
물리 볼륨 : 파티션
물리볼륨 생성
# 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.
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 [pv명]
[root@localhost ~]# pvremove /dev/sdb[1-4]
Labels on physical volume "/dev/sdb1" successfully wiped.
...
볼륨 그룹 : 물리 볼륨을 합쳐서 1개의 물리 그룹으로 만듬
볼륨그룹 생성
# 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
[root@localhost ~]# vgcreate vg1 /dev/sdb[24] -s 8M
Volume group "vg1" successfully created
[root@localhost ~]# vgdisplay vg1
...
PE Size 8.00 MiB
...
볼륨 그룹의 속성 확인
[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 [vg명]
[root@localhost ~]# vgremove vg0
Volume group "vg0" successfully removed
볼륨그룹 확장
# 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 [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 [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“
# 볼륨 그룹에서 제거 성공
옮겨지는 파티션은 시스템에서 남아있는 공간 파티션으로 랜덤으로 지정
[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
[root@localhost ~]# pvmove /dev/sdb3
/dev/sdb3: Moved: 0.13%
/dev/sdb3: Moved: 91.60%
/dev/sdb3: Moved: 100.00%
확장하는 용량은 제거하고자 하는 pv의 크기보다 같거나 커야 함
논리 볼륨 : 볼륨 그룹을 1개 이상 나눠서 논리 그룹을 나눔
명령어로 확장
최소 단위 : PE(LE)
LV를 만드는 가정 pv생성 -> vg 생성 -> lv 생성 -> lv 포맷 -> lv 마운트
논리볼륨 생성
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와 같은 경로는 시스템이 주로 사용함
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.
파티션 포맷하는 명령어와 같음
[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“
...
파티션의 마운트와 같은 방법
[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 lv경로
[root@localhost ~]# umount /mnt/disk1
[root@localhost ~]# umount /mnt/disk2
[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 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를 권장하지 않는 이유
어느 부분을 축소할지 확정 할 수 없음 -> 기존의 데이터 손상될 가능성이 존재