컬쥐네 다락방

리눅스 | PV, VG, LV 본문

클라우드/리눅스

리눅스 | PV, VG, LV

코딩하는 갱얼쥐 2022. 2. 25. 17:06

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

 

Comments