12 minute read

LVM

1. LVM 구성 순서

파티션 -> 물리 볼륨 구성 -> 물리 그룹 구성 -> 논리 볼륨 구성 -> 파일 시스템 구성

2. 파티션 정보

2.1. 디스크 리스트 표시

[root@master ~]# lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda           8:0    0  20G  0 disk 
├─sda1        8:1    0   1G  0 part /boot
└─sda2        8:2    0  19G  0 part 
  ├─cl-root 253:0    0  17G  0 lvm  /
  └─cl-swap 253:1    0   2G  0 lvm  [SWAP]
sdb           8:16   0  20G  0 disk 
└─sdb1        8:17   0  20G  0 part /os
sdc           8:32   0  20G  0 disk 
└─sdc1        8:33   0  20G  0 part /os1
sdd           8:48   0  20G  0 disk 
└─sdd1        8:49   0  20G  0 part /NFS
sde           8:64   0   1G  0 disk 

2.2. 파티션 리스트 표시

[root@master ~]# fdisk -l
Disk /dev/sdc: 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: 0x0925d3d6

Device     Boot Start      End  Sectors Size Id Type
/dev/sdc1        2048 41943039 41940992  20G 83 Linux
(...중략)

3. 파티션 구성

3.1. LVM 으로 구성

/dev/sde 를 LVM 저장 공간으로 만들기

[root@master ~]# fdisk /dev/sde
(...중략)

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 <-- primary
Partition number (1-4, default 1): <-- 파티션 번호 확인
First sector (2048-2097151, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151): +500M <-- 500MByte

Created a new partition 1 of type 'Linux' and of size 500 MiB.

Command (m for help): t <-- 디스크 타입 설정
Selected partition 1
Hex code (type L to list all codes): 8e <-- Linux LVM 으로 지정
Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): wq <-- 저장후 나가기
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

3.2. SWAP 으로 구성

/dev/sde 를 SWAP 메모리 저장 공간으로 만들기

[root@master ~]# fdisk /dev/sde

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.


Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (2-4, default 2): <-- 파티션 번호 확인
First sector (1026048-2097151, default 1026048): 
Last sector, +sectors or +size{K,M,G,T,P} (1026048-2097151, default 2097151): +500M

Created a new partition 2 of type 'Linux' and of size 500 MiB.

Command (m for help): t <-- 디스크 타입 설정
Partition number (1,2, default 2): 2 <-- 파티션 번호 /dev/
Hex code (type L to list all codes): 82 <-- 스왑 메모리는 '82'

Changed type of partition 'Linux' to 'Linux swap / Solaris'.

Command (m for help): w <-- 
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

3.3. 파티션 확인

아래와 같이 sde1,2 로 파티션이 분할된 것을 확인 할 수 있다.

[root@master ~]# fdisk -l /dev/sde
Disk /dev/sde: 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: 0xdf4044fe

Device     Boot   Start     End Sectors  Size Id Type
/dev/sde1          2048 1026047 1024000  500M 8e Linux LVM
/dev/sde2       1026048 2050047 1024000  500M 82 Linux swap / Solaris

4. 파티션 타입 코드

fdisk 명령어에서 타입 설정 모드에서 L - List 로 확인 할 수 있다.

Command (m for help): t
Hex code (type L to list all codes): L

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor      
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary  
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE 
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT            
  • 자주쓰는 타입
    82 Linux swap
    8e Linux LVM

5. 볼륨 구성

5.1. PV - 물리 볼륨 구성

pvcreate 로 물리 볼륨 구성
vgcreate 로 물리 볼륨 그룹 구성

/dev/sde1을 물리 볼륨화(pv)
example 이라는 물리 볼륩 그룹(vg)에 물리 볼륨(pv) 할당

[root@master ~]# pvcreate /dev/sde1 
  Physical volume "/dev/sde1" successfully created.
[root@master ~]# 
[root@master ~]# pvs
  PV         VG      Fmt  Attr PSize   PFree  
  /dev/sda2  cl      lvm2 a--  <19.00g      0 
  /dev/sde1  example lvm2 a--  496.00m 496.00m
[root@master ~]# vgcreate example /dev/sde1
[root@master ~]# 
  Volume group "example" successfully created
[root@master ~]# 
[root@master ~]# vgs
  VG      #PV #LV #SN Attr   VSize   VFree  
  cl        1   2   0 wz--n- <19.00g      0 
  example   1   0   0 wz--n- 496.00m 496.00m

5.2. VG - 논리 볼륨 구성

lvcreate 로 논리 볼륨 구성
-l (length) 에 ‘100%FREE’ 를 지정하면 남은 공간 100%를 지정 할 수 있다.
-n (name) 논리 볼륨 이름 지정

[root@master ~]# lvcreate -l 100%FREE -n vgroup example
  Logical volume "vgroup" created.
[root@master ~]# 
[root@master ~]# lvs
  LV     VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   cl      -wi-ao---- <17.00g                                                    
  swap   cl      -wi-ao----   2.00g                                                    
  vgroup example -wi-a----- 496.00m                                                    

지금까지의 구조
vgroup (lv)
ㄴexample (vg)
ㄴ/dev/sde1 (pv)

5.3. FS - 파일 시스템 구성

mkfs.* 명령어로 각 파일 시스템 종류에 따라 사용 가능 하다.
아래 참조

[root@master ~]# mkfs.
mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs     
mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat   
[root@master ~]# 
[root@master ~]# mkfs.xfs /dev/example/vgroup 
meta-data=/dev/example/vgroup    isize=512    agcount=4, agsize=31744 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=126976, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1368, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

mkfs.xfs /dev/example/vgroup «  대상 볼륨 /dev/example(vg)/vgroup(lv)
논리 볼륨을 대상으로 지정을 하고있음을 알 수 있다.

FS - 마운트 테스트

루트(/) 아래에 test디렉토리 생성후 마운트를 해본다. 아래와 같이 마운트 후 인식이 잘 되는 것을 확인 할 수 있다.

[root@master ~]# mkdir /test
[root@master ~]# mount -t xfs /dev/example/vgroup /test
[root@master ~]# 
[root@master ~]# 
[root@master ~]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
(...중략)
/dev/mapper/example-vgroup  491M   29M  463M   6% /test
[root@master ~]# 
[root@master ~]# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
(...중략)
├─sde1               8:65   0  500M  0 part 
│ └─example-vgroup 253:2    0  496M  0 lvm  /test
└─sde2               8:66   0  500M  0 part 

5.4. FS - 자동 마운트 설정

장치ID 확인

[root@master ~]# blkid
/dev/sda1: UUID="f7e8b2cc-f587-49d9-a280-02483f4f082e" TYPE="ext4" PARTUUID="a7402d34-01"
/dev/sda2: UUID="3QPjO2-q2RV-RgFi-7Nhm-DOGy-ZnOY-fNBULr" TYPE="LVM2_member" PARTUUID="a7402d34-02"
/dev/sdb1: UUID="54bc1f42-ab3d-4048-9c0b-1c5655dc583e" TYPE="ext4" PARTUUID="415fb890-01"
/dev/sdc1: UUID="f4ca6e6a-68ea-4016-bb63-dbd0c308336e" TYPE="ext4" PARTUUID="0925d3d6-01"
/dev/sdd1: UUID="ae4a229c-9ff3-4e22-9633-9faa993bb64f" TYPE="ext4" PARTUUID="2f58189f-01"
/dev/sde1: UUID="wiP3O2-wnOV-TEYU-uqHj-MOfz-HOb0-Wo1L96" TYPE="LVM2_member" PARTUUID="df4044fe-01"
/dev/mapper/cl-root: UUID="03a7cd11-90c9-4bda-bc52-f77b5c2667d2" TYPE="xfs"
/dev/mapper/cl-swap: UUID="194dd349-5a88-4a70-8f70-12d13b0fd415" TYPE="swap"
/dev/mapper/example-vgroup: UUID="b7b0931f-df6a-41ab-a309-6dc34a467982" TYPE="xfs" <-- 대상
/dev/sde2: PARTUUID="df4044fe-02"

/etc/fstab 에 장치 정보 추가
형식은 아래 더블쿼테이션(“”) 부분 정도만 기억해도 충분하다. 아래와 같이 두 가지 방법으로 설정할 수 있다.

  1. UUID=”id” “mount_point” “partition_type” defaults 0 0
  2. “device” “mount_point” “partition_type” defaults 0 0
[root@master ~]# vi /etc/fstab
# /etc/fstab
# Created by anaconda on Fri Feb 19 18:29:02 2021
#
# 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/cl-root     /                       xfs     defaults        0 0
UUID=f7e8b2cc-f587-49d9-a280-02483f4f082e /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
UUID=54bc1f42-ab3d-4048-9c0b-1c5655dc583e /os ext4      defaults        0 0
UUID=f4ca6e6a-68ea-4016-bb63-dbd0c308336e /os1 ext4     defaults        0 0
UUID=ae4a229c-9ff3-4e22-9633-9faa993bb64f /NFS  ext4    defaults        0 0
UUID=b7b0931f-df6a-41ab-a309-6dc34a467982 /test  xfs    defaults        0 0 <-- 대상

5.5. !! 주의 사항

마운트 테스트는 꼭 해보고 지나가자.
/etc/fstab 설정 정보에 에러가 있을 경우, 당장은 문제가 없겠지만
재부팅시 무한이 되지않을 수 있다.

정상 출력

[root@master ~]# mount -a
[root@master ~]# 

에러 출력

[root@master ~]# mount -a
mount: /test: can't find UUID=ab7b0931f-df6a-41ab-a309-6dc34a467982.

무한 부팅시 리커버리모드에서 해결 가능하다.
당황해서 포멧하는 일은 없도록 하자.

5.6. LVM - 마운트 확인

[root@master ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             3.1G     0  3.1G   0% /dev
tmpfs                3.1G     0  3.1G   0% /dev/shm
tmpfs                3.1G   10M  3.1G   1% /run
tmpfs                3.1G     0  3.1G   0% /sys/fs/cgroup
/dev/mapper/cl-root   17G   16G  2.0G  89% /
/dev/sda1            976M  194M  715M  22% /boot
/dev/sdd1             20G   45M   19G   1% /NFS
/dev/sdc1             20G   45M   19G   1% /os1
tmpfs                628M  1.2M  627M   1% /run/user/42
tmpfs                628M  4.6M  623M   1% /run/user/0
/dev/mapper/example-vgroup  491M   29M  463M   6% /test <-- 인식된 내용

5.7. SWAP - 스왑 설정

사전에 파티션을 만든 /dev/sde2 를 스왑 메모리로 사용하도록 아래와 같이 진행
swapon 전/후의 Swap 메모리 total이 증가된 것을 확인가능하다.

[root@master ~]# mkswap /dev/sde2
Setting up swapspace version 1, size = 500 MiB (524283904 bytes)
no label, UUID=8bdc6289-6b5e-4941-8d3b-007523ed1464
[root@master ~]# 
[root@master ~]# 
[root@master ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           6272        4410         487          12        1374        1596
Swap:          2047          17        2030 <-- 적용 전
[root@master ~]# 
[root@master ~]# 
[root@master ~]# swapon /dev/sde2
[root@master ~]# 
[root@master ~]# 
[root@master ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           6272        4410         486          12        1374        1595
Swap:          2547          17        2530 <-- 적용 후 

5.8. SWAP - 자동 마운트 설정

이전 LVM 스텝에서 진행한 것과 동일하다.

[root@master ~]# vi /etc/fstab
# /etc/fstab
# Created by anaconda on Fri Feb 19 18:29:02 2021
#
# 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/cl-root     /                       xfs     defaults        0 0
UUID=f7e8b2cc-f587-49d9-a280-02483f4f082e /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
UUID=54bc1f42-ab3d-4048-9c0b-1c5655dc583e /os ext4      defaults        0 0
UUID=f4ca6e6a-68ea-4016-bb63-dbd0c308336e /os1 ext4     defaults        0 0
UUID=ae4a229c-9ff3-4e22-9633-9faa993bb64f /NFS  ext4    defaults        0 0
UUID=b7b0931f-df6a-41ab-a309-6dc34a467982 /test  xfs    defaults        0 0
UUID=8bdc6289-6b5e-4941-8d3b-007523ed1464       swap    swap    defaults        0 0 <-- 추가된 내용

5.9. SWAP - 마운트 확인

mount -a 로 /etc/fstab을 읽어들여보자.
설정내용에 문제가 없다면 에러없이 진행될 것이다.

[root@master ~]# mount -a
[root@master ~]# 
[root@master ~]# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   20G  0 disk 
├─sda1               8:1    0    1G  0 part /boot
└─sda2               8:2    0   19G  0 part 
  ├─cl-root        253:0    0   17G  0 lvm  /
  └─cl-swap        253:1    0    2G  0 lvm  [SWAP]
sdb                  8:16   0   20G  0 disk 
└─sdb1               8:17   0   20G  0 part /os
sdc                  8:32   0   20G  0 disk 
└─sdc1               8:33   0   20G  0 part /os1
sdd                  8:48   0   20G  0 disk 
└─sdd1               8:49   0   20G  0 part /NFS
sde                  8:64   0    1G  0 disk 
├─sde1               8:65   0  500M  0 part 
│ └─example-vgroup 253:2    0  496M  0 lvm  /test
└─sde2               8:66   0  500M  0 part [SWAP]

6. 용량 확장

6.1. 시나리오

시스템운용을 하던중 디스크 용량이 부족해졌다는 시나리오로
새로운 하드디스크를 추가하여 확장하려고 한다.

기존 그룹에 새로운 하드디스크 /dev/sdf1 을 추가해 보자.

6.2. 볼륨 확장

[root@master ~]# pvcreate /dev/sdf1 
  Physical volume "/dev/sdf1" successfully created.
[root@master ~]# vgextend example /dev/sdf1
  Volume group "example" successfully extended
[root@master ~]# lvextend /dev/
/dev/cl/root         /dev/cl/swap         /dev/example/vgroup
[root@master ~]# lvextend /dev/example/vgroup -l +100%FREE
  Size of logical volume example/vgroup changed from 496.00 MiB (124 extents) to 1.48 GiB (379 extents).
  Logical volume example/vgroup successfully resized.
[root@master ~]# 
[root@master ~]# 
[root@master ~]# lvs
  LV     VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   cl      -wi-ao---- <17.00g                                                    
  swap   cl      -wi-ao----   2.00g                                                    
  vgroup example -wi-ao----   1.48g                                                    
[root@master ~]# 

이전과 다른 점이 있다면, vgextend lvextend 명령어를 사용한다는 점이다.
새로운 그룹을 만드는 것이 아닌, 기존 그룹에 추가한다는 점을 고려하자.

[root@master ~]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    3.1G     0  3.1G   0% /dev
tmpfs                       3.1G     0  3.1G   0% /dev/shm
tmpfs                       3.1G   11M  3.1G   1% /run
tmpfs                       3.1G     0  3.1G   0% /sys/fs/cgroup
/dev/mapper/cl-root          17G   16G  2.0G  89% /
/dev/mapper/example-vgroup  491M   29M  463M   6% /test
/dev/sdc1                    20G  5.5G   14G  30% /os1
/dev/sdb1                    20G  5.6G   13G  30% /os
/dev/sdd1                    20G  5.8G   13G  31% /NFS
/dev/sda1                   976M  194M  715M  22% /boot
tmpfs                       628M  1.2M  627M   1% /run/user/42
tmpfs                       628M  4.6M  623M   1% /run/user/0
[root@master ~]# 
[root@master ~]# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
(...중략)
sde                  8:64   0    1G  0 disk 
├─sde1               8:65   0  500M  0 part 
│ └─example-vgroup 253:2    0  1.5G  0 lvm  /test
└─sde2               8:66   0  500M  0 part [SWAP]
sdf                  8:80   0    1G  0 disk 
└─sdf1               8:81   0 1023M  0 part 
  └─example-vgroup 253:2    0  1.5G  0 lvm  /test

df -h 명령어에 /dev/sdf1 이 보이지 않지만
lsblk에는 인식하고 있다.
df 명령어는 마운트된 장치에 대해서만 정보를 출력하기 때문이다.

6.3. 파일시스템 확장

[root@master ~]# xfs_growfs /dev/example/vgroup 
meta-data=/dev/mapper/example-vgroup isize=512    agcount=4, agsize=31744 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=126976, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1368, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 126976 to 388096
[root@master ~]# 
[root@master ~]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    3.1G     0  3.1G   0% /dev
tmpfs                       3.1G     0  3.1G   0% /dev/shm
tmpfs                       3.1G   11M  3.1G   1% /run
tmpfs                       3.1G     0  3.1G   0% /sys/fs/cgroup
/dev/mapper/cl-root          17G   16G  2.0G  89% /
/dev/mapper/example-vgroup  1.5G   37M  1.5G   3% /test
/dev/sdc1                    20G  5.5G   14G  30% /os1
/dev/sdb1                    20G  5.6G   13G  30% /os
/dev/sdd1                    20G  5.8G   13G  31% /NFS
/dev/sda1                   976M  194M  715M  22% /boot
tmpfs                       628M  1.2M  627M   1% /run/user/42
tmpfs                       628M  4.6M  623M   1% /run/user/0

파일 시스템을 새로 만들때는 mkfs.* 명령어를 사용했는데
확장할때는 약간 다르다.
xfs 파일시스템의 경우는 xfs_growfs 명령어로 확장을 시도하고,
ext 시리즈의 경우는 resize2fs 명령어로 확장을 시도하면 된다.

6.4. 볼륨 구조 확인

작업 전
vgroup (lv)
ㄴexample (vg)
ㄴ/dev/sde1 (pv)

작업 후
vgroup (lv)
ㄴexample (vg)
ㄴ/dev/sde1 (pv)
ㄴ/dev/sdf1 (pv)

Leave a comment