컬쥐네 다락방
리눅스 | PV, VG, LV 본문
LVM (Logical Volume Manage)
여러 하드디스크를 합쳐서 한 개의 파일 시스템으로 사용하는 것. 필요에 따라 다시 나눌 수 있다.
ex) 2TB 용량의 하드디스크 2개를 합친 후 다시 1TB와 3TB로 나눠서 사용 가능
Physical Volume (물리 볼륨) : /dev/sda1, /dev/sdb1 등의 파티션
Volume Group (볼륨 그룹) : 물리 불륨을 합쳐서 1개의 물리 그룹으로 만드는 것
Logical Volume (논리 볼륨) : 볼륨 그룹을 1개 이상 나눠서 논리 그룹으로 나눈 것
논리 볼륨 생성
물리적 저장 장치를 논리적 장치로 관리하면서 공간 활용이 유연하고 확장성이 좋다.
미러링 및 스냅샷 기능 지원
저장 장치의 종류와 무관하게 사용가능.
물리 저장 장치 (파티션) | 논리 저장 장치 (논리 볼륨) | |
이름 지정 | 장치 이름 (파티션 넘버) | 사용자 지정 |
확장 | 파티션 제거 후 재생성 | 명령어로 확장 |
최소 단위 | 섹터 | PE(LE) |
보통 PE 와 LE는 1대1 매칭이지만 미러링의 경우 2대1로 매칭도 가능하다.
LV는 LE 단위로 구성되므로 크기도 LE 크기의 배수로 할당된다.
레이드 (RAID 종류)
LVM은 명령어를 통해 RAID 구성을 할 수 있다. 최소 디스크수를 항상 지켜줘야 한다.
종류 | 별칭 | 기능 | 최소 디스크 수 |
RAID 0 | 스트라이프 | 성능 | 2 |
RAID 1 | 미러 | 안정성 | 2 |
RAID 5 | 패리티 | 성능 + 안정성 | 2 |
RAID 10 | X | 성능 + 안정성 | 4 |
관련 명령어
물리 볼륨 생성 : pvcreate 장치명 (ex. /dev/sdxn (x:abc, n:123)
볼륨 그룹 생성 : vgcreate VG명 PV명 -s PE 사이즈
논리 볼륨 생성 : lvcreate VG명 -n LV명 -L 실제 크기 or -l LE 갯수
물리 볼륨 삭제 : pvremove PV명
볼륨 그룹 삭제 : vgremove VG명
논리 볼륨 삭제 : lvremove LV경로 (/dev/볼륨그룹명/논리볼륨명, /dev/mapper/볼륨그룹명-논리볼륨명)
볼륨 그룹 확장 : vgextend vg명 PV명
볼륨 그룹 축소 : vgreduce VG명 PV명
물리 볼륨 내용 이동 : pvmove PV명
논리볼륨 확장 : lvextend -L (+추가크기 or 최종크기) LV경로 -r(파일 시스템 확장)
xfs 파일 시스템 확장 : xfs_growfs 마운트 포인트
ext4 파일 시스템 확장 : resize2fs LV경로
실제 실습 과정 정리
먼저 파티션을 나눈 후에 pvcreate 명령어를 이용해서 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 ~]# 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.
[root@localhost ~]# blkid
/dev/sda1: UUID="88f82736-89b0-49e6-88c5-165c88bcc5bf" TYPE="swap"
/dev/sda2: UUID="231c776b-3197-4e9f-a142-6b80be0ca930" TYPE="xfs"
/dev/sdb1: UUID="9kEytW-YTWC-N0hr-DrYw-yHoa-bQf6-RBfe0J" TYPE="LVM2_member"
/dev/sdb2: UUID="4bTU4p-NLjN-Rh0j-xyg3-r72z-csLw-Dm2OE1" TYPE="LVM2_member"
/dev/sdb3: UUID="W5jIFx-8kf4-Th9X-gLm7-EgoV-L0re-cJSNRX" TYPE="LVM2_member"
/dev/sdb4: UUID="G4xdv4-qTN4-09Vb-1Dis-BEmJ-lfAd-YYG7gf" TYPE="LVM2_member"
PV를 가지고 vgcreate 명령어로 VG를 만들 수 있다. 뒤에 -s 옵션을 통해 PE Size를 조절 가능
vgdisplay를 통해 만들어진 모습을 볼 수 있다
[root@localhost ~]# vgcreate vg1 /dev/sdb[24] -s 8M
Volume group "vg1" successfully created
[root@localhost ~]# vgdisplay vg1
--- Volume group ---
VG Name vg1
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.98 GiB
PE Size 8.00 MiB
Total PE 1278
Alloc PE / Size 0 / 0
Free PE / Size 1278 / 9.98 GiB
VG UUID xTz92N-fB5N-WSjf-TjaP-NQIa-TvoN-4TQC8a
VG를 이용해 LV를 만들어준다
[root@localhost ~]# lvcreate 볼륨그룹명 -ㅣ le갯수 -L 용량 -n lv명^C
[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 ~]# lvdisplay
--- Logical volume ---
LV Path /dev/vg0/lv01
LV Name lv01
VG Name vg0
LV UUID ImkCi7-iHBU-uPK0-vDYL-hyLc-DnAu-gdunBc
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2022-02-25 14:27:30 +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
--- Logical volume ---
LV Path /dev/vg0/lv02
LV Name lv02
VG Name vg0
LV UUID iOQru7-OF8O-dv2L-VHsu-HczD-ZPux-B6jbS4
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2022-02-25 14:27:38 +0900
LV Status available
# open 0
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
최종적으로 만들어진 모습 확인 가능
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 4G 0 part [SWAP]
└─sda2 8:2 0 56G 0 part /
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
├─sdb2 8:18 0 4G 0 part
├─sdb3 8:19 0 6G 0 part
└─sdb4 8:20 0 6G 0 part
sr0 11:0 1 1024M 0 rom
LV를 만들면 경로가 여러가지 생긴다. 기본적으로는 dm-0부터 숫자를 올려가며 생기지만 주로 lv01을 통해 이용한다
[root@localhost ~]# ls -l /dev/vg0/lv01 /dev/mapper/vg0-lv01 /dev/dm-0
brw-rw----. 1 root disk 253, 0 2월 25 14:27 /dev/dm-0
lrwxrwxrwx. 1 root root 7 2월 25 14:27 /dev/mapper/vg0-lv01 -> ../dm-0
lrwxrwxrwx. 1 root root 7 2월 25 14:27 /dev/vg0/lv01 -> ../dm-0
LV를 만드는 과정에서 용량이 부족하면 에러가 발생하는데, 특정 용량을 지정해주지 않고 남은 용량을 모두 지정해주는 방법도 있다.
[root@localhost ~]# lvcreate vg0 -L 7G -n lv03
Volume group "vg0" has insufficient free space (1790 extents): 1792 required.
[root@localhost ~]# lvcreate vg0 -l 100%FREE -n lv03
Logical volume "lv03" created.
[root@localhost ~]# lvdisplay /dev/vg0/lv03
--- Logical volume ---
LV Path /dev/vg0/lv03
LV Name lv03
VG Name vg0
LV UUID kmje8v-1y3s-yUkm-bmBY-Z3ZC-dH1g-Ptr7pl
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2022-02-25 14:35:11 +0900
LV Status available
# open 0
LV Size 6.99 GiB
Current LE 1790
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
이후 파티션처럼 포맷을 진행하고 마운트를 올려준다.
[root@localhost ~]# mkfs -t xfs /dev/vg0/lv01
[root@localhost ~]# mkfs.ext4 /dev/mapper/vg0-lv02
[root@localhost ~]# blkid blkid 명령어로 확인 가능
/dev/sda1: UUID="88f82736-89b0-49e6-88c5-165c88bcc5bf" TYPE="swap"
/dev/sda2: UUID="231c776b-3197-4e9f-a142-6b80be0ca930" TYPE="xfs"
/dev/sdb1: UUID="9kEytW-YTWC-N0hr-DrYw-yHoa-bQf6-RBfe0J" TYPE="LVM2_member"
/dev/sdb2: UUID="4bTU4p-NLjN-Rh0j-xyg3-r72z-csLw-Dm2OE1" TYPE="LVM2_member"
/dev/sdb3: UUID="W5jIFx-8kf4-Th9X-gLm7-EgoV-L0re-cJSNRX" TYPE="LVM2_member"
/dev/sdb4: UUID="G4xdv4-qTN4-09Vb-1Dis-BEmJ-lfAd-YYG7gf" TYPE="LVM2_member"
/dev/mapper/vg0-lv01: UUID="a9409866-37bb-4cf2-872a-3e3896c5d4fe" TYPE="xfs"
/dev/mapper/vg0-lv02: UUID="bb9003a3-e33f-4e76-9ed1-84a271c17141" TYPE="ext4"
[root@localhost ~]# mkdir /mnt/disk{1..3}
[root@localhost ~]# ls /mnt
disk1 disk2 disk3
[root@localhost ~]# mount /dev/vg0/lv01 /mnt/disk1
[root@localhost ~]# mount /dev/mapper/vg0-lv02 /mnt/disk2
LV 삭제 과정
LV를 지우기위해 lvremove 명령어를 사용하면 현재 마운트에 올려져있어서 지울 수 없다.
umount를 사용해서 내려주고 삭제 요청을 진행해야한다.
[root@localhost ~]# lvremove /dev/vg0/lv01
Logical volume vg0/lv01 contains a filesystem in use.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 4G 0 part [SWAP]
└─sda2 8:2 0 56G 0 part /
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
├─sdb2 8:18 0 4G 0 part
├─sdb3 8:19 0 6G 0 part
│ └─vg0-lv03 253:2 0 7G 0 lvm
└─sdb4 8:20 0 6G 0 part
sr0 11:0 1 1024M 0 rom
[root@localhost ~]# umount /mnt/disk1
삭제 과정은 생성 과정과 반대로 진행하면 간단하다.
[root@localhost ~]# lvremove /dev/vg0/lv0[1-3]
Do you really want to remove active logical volume vg0/lv01? [y/n]: y
Logical volume "lv01" successfully removed
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 ~]# vgremove vg0
Volume group "vg0" successfully removed
[root@localhost ~]# vgremove vg1
Volume group "vg1" successfully removed
[root@localhost ~]# pvremove /dev/sdb[1-4]
Labels on physical volume "/dev/sdb1" successfully wiped.
Labels on physical volume "/dev/sdb2" successfully wiped.
Labels on physical volume "/dev/sdb3" successfully wiped.
Labels on physical volume "/dev/sdb4" successfully wiped.
[root@localhost ~]# blkid
/dev/sda1: UUID="88f82736-89b0-49e6-88c5-165c88bcc5bf" TYPE="swap"
/dev/sda2: UUID="231c776b-3197-4e9f-a142-6b80be0ca930" TYPE="xfs"
VG 크기를 확장하는 방법
vgextend를 이용해 다른 PV를 기존 VG에 추가할 수 있다.
반대로 제거는 vgreduce를 사용해서 제거 가능.
[root@localhost ~]# vgextend vg0 /dev/sdb2
Volume group "vg0" successfully extended
[root@localhost ~]# vgdisplay vg0
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 3
Act PV 3
VG Size <13.99 GiB
PE Size 4.00 MiB
Total PE 3581
Alloc PE / Size 1792 / 7.00 GiB
Free PE / Size 1789 / <6.99 GiB
VG UUID iOmb7X-EHD2-9sv3-isA1-UaRF-yGf2-2eskeu
[root@localhost ~]# vgreduce vg0 /dev/sdb2
Removed "/dev/sdb2" from volume group "vg0"
VG 속의 PV를 제거하려면 PV가 사용중이면 불가능하기에 현재 PV안의 내용을 pvmove를 사용해서 다른 곳으로 옮겨주고 제거를 요청해야한다.
[root@localhost ~]# vgreduce vg0 /dev/sdb1
Physical volume "/dev/sdb1" still in use
[root@localhost ~]# pvmove /dev/sdb1
/dev/sdb1: Moved: 0.39%
/dev/sdb1: Moved: 100.00%
[root@localhost ~]# vgreduce vg0 /dev/sdb1
Removed "/dev/sdb1" from volume group "vg0"
LV 추가 확장 방법
lvextend 명령어를 이용해서 추가적으로 크기를 늘릴 수 있다.
추가하고 싶은 용량을 기입하거나 최종 용량을 기입.
같은 PV 내에서 자동으로 용량을 할당해서 만들어준다
[root@localhost ~]# lvextend -L +2G /dev/vg0/lv01 #2G를 추가 요청
Size of logical volume vg0/lv01 changed from 4.00 GiB (1024 extents) to 6.00 GiB (1536 extents).
Logical volume vg0/lv01 successfully resized.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 4G 0 part [SWAP]
└─sda2 8:2 0 56G 0 part /
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 4G 0 part
├─sdb2 8:18 0 4G 0 part
│ ├─vg0-lv01 253:0 0 6G 0 lvm /mnt/disk1
│ └─vg0-lv02 253:1 0 3G 0 lvm /mnt/disk2
├─sdb3 8:19 0 6G 0 part
│ └─vg0-lv01 253:0 0 6G 0 lvm /mnt/disk1 #lv01이 6G로 바뀜
└─sdb4 8:20 0 6G 0 part
sr0 11:0 1 1024M 0 rom
[root@localhost ~]# lvextend -L 7G /dev/vg0/lv02 #최종 용량이 7G가 되도록 요청
Size of logical volume vg0/lv02 changed from 3.00 GiB (768 extents) to 7.00 GiB (1792 extents).
Logical volume vg0/lv02 successfully resized.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 4G 0 part [SWAP]
└─sda2 8:2 0 56G 0 part /
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 4G 0 part
│ └─vg0-lv02 253:1 0 7G 0 lvm /mnt/disk2
├─sdb2 8:18 0 4G 0 part
│ ├─vg0-lv01 253:0 0 6G 0 lvm /mnt/disk1
│ └─vg0-lv02 253:1 0 7G 0 lvm /mnt/disk2 #lv02가 7G로 바뀜
├─sdb3 8:19 0 6G 0 part
│ └─vg0-lv01 253:0 0 6G 0 lvm /mnt/disk1
└─sdb4 8:20 0 6G 0 part
sr0 11:0 1 1024M 0 rom
이 상태에서는 현재 LV 공간만 늘려주고 파일시스템 공간은 늘려주지 않은 상태이다.
따라서 df -Th로 살펴보면 파일 시스템의 용량은 늘어나지 않은 것을 확인 할 수 있다.
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 56G 4.3G 52G 8% /
devtmpfs devtmpfs 985M 0 985M 0% /dev
tmpfs tmpfs 1000M 0 1000M 0% /dev/shm
tmpfs tmpfs 1000M 9.0M 991M 1% /run
tmpfs tmpfs 1000M 0 1000M 0% /sys/fs/cgroup
tmpfs tmpfs 200M 0 200M 0% /run/user/0
/dev/mapper/vg0-lv01 xfs 4.0G 33M 4.0G 1% /mnt/disk1 아직 4G와 3G인 상태가 보인다
/dev/mapper/vg0-lv02 ext4 2.9G 9.0M 2.8G 1% /mnt/disk2
xfs 파일 시스템은 xfs_gorwfs 마운트 포인트 ext4 파일 시스템은 resize2fs 논리 볼륨 경로 방식을 사용해서 파일 시스템을 확장시켜주면 df -Th 명령어로 늘어난 용량을 확인할 수 있다.
[root@localhost ~]# xfs_growfs /mnt/disk1 xfs 확장
meta-data=/dev/mapper/vg0-lv01 isize=512 agcount=4, agsize=262144 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1048576, 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 1048576 to 1572864
[root@localhost ~]# resize2fs /dev/vg0/lv02 ext4 확장
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg0/lv02 is mounted on /mnt/disk2; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg0/lv02 is now 1835008 blocks long.
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 61G 4.7G 56G 8% /
devtmpfs devtmpfs 1.1G 0 1.1G 0% /dev
tmpfs tmpfs 1.1G 0 1.1G 0% /dev/shm
tmpfs tmpfs 1.1G 9.5M 1.1G 1% /run
tmpfs tmpfs 1.1G 0 1.1G 0% /sys/fs/cgroup
tmpfs tmpfs 210M 0 210M 0% /run/user/0
/dev/mapper/vg0-lv01 xfs 6.5G 34M 6.4G 1% /mnt/disk1 늘어난 용량 확인 가능
/dev/mapper/vg0-lv02 ext4 7.4G 15M 7.0G 1% /mnt/disk2
이와 같이 두 번의 과정을 거치지 않기 위해서 LV 방식 확장 과정에서 파일 시스템도 늘려줘야한다.
방법은 lvextend 명령어 마지막에 -r 옵션을 붙여주면 자동으로 확보가 가능하다.
[root@localhost ~]# lvextend -L +0.5G /dev/vg0/lv01 -r -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
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 4G 0 part [SWAP]
└─sda2 8:2 0 56G 0 part /
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 4G 0 part
│ ├─vg0-lv01 253:0 0 6.5G 0 lvm /mnt/disk1 6.5G로 늘어난게 확인된다
│ └─vg0-lv02 253:1 0 7G 0 lvm /mnt/disk2
├─sdb2 8:18 0 4G 0 part
│ ├─vg0-lv01 253:0 0 6.5G 0 lvm /mnt/disk1
│ └─vg0-lv02 253:1 0 7G 0 lvm /mnt/disk2
├─sdb3 8:19 0 6G 0 part
│ └─vg0-lv01 253:0 0 6.5G 0 lvm /mnt/disk1
└─sdb4 8:20 0 6G 0 part
sr0 11:0 1 1024M 0 rom
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 56G 4.3G 52G 8% /
devtmpfs devtmpfs 985M 0 985M 0% /dev
tmpfs tmpfs 1000M 0 1000M 0% /dev/shm
tmpfs tmpfs 1000M 9.0M 991M 1% /run
tmpfs tmpfs 1000M 0 1000M 0% /sys/fs/cgroup
tmpfs tmpfs 200M 0 200M 0% /run/user/0
/dev/mapper/vg0-lv01 xfs 6.5G 33M 6.5G 1% /mnt/disk1 파일 시스템도 자동으로 확장
/dev/mapper/vg0-lv02 ext4 6.9G 14M 6.5G 1% /mnt/disk2
'클라우드 > 리눅스' 카테고리의 다른 글
리눅스 | 부트 프로세스 (0) | 2022.03.03 |
---|---|
리눅스 | 서비스 관리 / systemd , log (0) | 2022.03.02 |
리눅스 | 시스템 디스크 / 파티션, 스왑 메모리 (0) | 2022.02.24 |
작업 예약 - cron (0) | 2022.02.24 |
vi 에디터 명령어 (0) | 2022.02.21 |