Linux

VM 웨어 우분투에서 LVM 디스크 용량 증설하기

시작 하기 전..

VM웨어의 우분투 서버 용량이 꽉차서 더이상 작업이 불가능한 상황이 왔다.

디스크 용량 확장하려면 스냅샷을 지워야하므로, 원본을 백업하고 복사한다음 스냅샷 삭제 이후 디스크 크기 확장 진행한다.

vm머신 우클릭 - 설정 - harddisk - expand 선택, 기존 50 -> 64로 키웠다.

VM웨어에서 LVM 파티션 크기를 키워주려면 물리 파티션에 크기를 바로 추가해주는 방식이 아니라,

  1. 다른 물리 파티션 생성 ->
  2. 파티션 종류 LVM으로 전환 ->
  3. 물리 볼륨 생성 ->
  4. 기존 VLM과 새로 만든 LVM 병합

순으로 진행해야한다.

이후 설정 진행하기 전에 스냅샷 떠두고 부팅한다.


디스크 구조 확인

df -h로 전체 볼륨 용량 확인 -> 볼륨 추가 안된것 확인됨

└────╼ df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         468M     0  468M   0% /dev
tmpfs                         98M  4.6M   93M   5% /run
/dev/mapper/catpwn--vg-root   19G   18G     0 100% /
tmpfs                        488M     0  488M   0% /dev/shm
tmpfs                        5.0M     0  5.0M   0% /run/lock
tmpfs                        488M     0  488M   0% /sys/fs/cgroup
/dev/sda1                    472M  462M     0 100% /boot
tmpfs                         98M     0   98M   0% /run/user/0
tmpfs                         98M     0   98M   0% /run/user/1058

lsblk로 파티션/논리볼륨/lvm 구조 확인

└────╼ lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                     8:0    0   64G  0 disk 
├─sda1                  8:1    0  487M  0 part /boot
├─sda2                  8:2    0    1K  0 part 
└─sda5                  8:5    0 19.5G  0 part 
  ├─catpwn--vg-root   252:0    0 18.5G  0 lvm  /
  └─catpwn--vg-swap_1 252:1    0    1G  0 lvm  [SWAP]
sr0                    11:0    1 1024M  0 rom

용량을 확장해주려는 --vg-root 볼륨은 lvm으로, sda5 논리 파티션 하위에 존재한다.
sda5 논리 파티션은 sda2 물리 파티션에서 만들어진 상황.

fdisk 로 전체용량 / 현재 파티션에 할당된 용량 확인

└────╼ fdisk /dev/sda

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sda: 64 GiB, 68719476736 bytes, 134217728 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: 0x5ada5a32

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sda1  *       2048   999423   997376  487M 83 Linux
/dev/sda2       1001470 41940991 40939522 19.5G  5 Extended
/dev/sda5       1001472 41940991 40939520 19.5G 8e Linux LVM

전체용량 64GB 주에 LVM을 통해 19.5GB 만 할당되어있는 상황임.

vgs 명령어로 볼륨 그룹 목록을 볼 수있고,
vgdisplay 명령어로 볼륨 그룹의 특정 볼륨 정보를 볼 수 있음.

└────╼ vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  catpwn-vg   1   2   0 wz--n- 19.52g    0 
┌─╼[~] 
└────╼ vgdisplay
  --- Volume group ---
  VG Name               catpwn-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.52 GiB
  PE Size               4.00 MiB
  Total PE              4997
  Alloc PE / Size       4997 / 19.52 GiB
  Free  PE / Size       0 / 0   
  VG UUID               etRRwR-c7JD-a0qS-z56f-p4Ij-mNNP-ESqBs7

pvs 명령어로 물리 볼륨 목록 조회 / pvdisplay로 특정 볼륨의 정보 조회

└────╼ pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda5  catpwn-vg lvm2 a--  19.52g    0 
┌─╼[~] 
└────╼ pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               catpwn-vg
  PV Size               19.52 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4997
  Free PE               0
  Allocated PE          4997
  PV UUID               cUiXEB-CkVi-3lE3-eI4s-1bKT-nETk-fqKywY

lvs로 논리 볼륨 목록 조회 / lvdisplayh로 논리 볼륨 정보 보회

└╼  lvs
  LV     VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   catpwn-vg -wi-ao---- 18.52g                                                    
  swap_1 catpwn-vg -wi-ao----  1.00g                                                    
┌─╼[~] 
└────╼ lvdisplay
  --- Logical volume ---
  LV Path                /dev/catpwn-vg/root
  LV Name                root
  VG Name                catpwn-vg
  LV UUID                lo2HEt-avPl-bgXP-Yb9I-UKxS-tGMv-SgaEiG
  LV Write Access        read/write
  LV Creation host, time catpwn, 2017-01-24 19:57:46 +0900
  LV Status              available

  # open                 1

  LV Size                18.52 GiB
  Current LE             4741
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto

  - currently set to     256
    Block device           252:0

  --- Logical volume ---
  LV Path                /dev/catpwn-vg/swap_1
  LV Name                swap_1
  VG Name                catpwn-vg
  LV UUID                Lz6JKz-GnrT-BNuB-m9YI-9OSi-trFX-XqhIV3
  LV Write Access        read/write
  LV Creation host, time catpwn, 2017-01-24 19:57:46 +0900
  LV Status              available

  # open                 2

  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto

  - currently set to     256
    Block device           252:1

볼륨 그룹 - 물리볼륨 - 논리 볼륨 순으로 정렬된다고 생각하자.


파티션 및 볼륨 생성 , LVM 전환

일단 볼륨을 만들기 위해 물리 파티션을 생성한다.
fdisk /dev/sda -> n (신규 파티션) -> p(물리 파티션)
-> 파티션 번호 지정 -> 섹터지정 순으로 진행한다.

└╼  fdisk /dev/sda


Command (m for help): p
Disk /dev/sda: 64 GiB, 68719476736 bytes, 134217728 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: 0x5ada5a32

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sda1  *       2048   999423   997376  487M 83 Linux
/dev/sda2       1001470 41940991 40939522 19.5G  5 Extended
/dev/sda5       1001472 41940991 40939520 19.5G 8e Linux LVM

Command (m for help): n
Partition type
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): p
Partition number (3,4, default 3): 3

First sector (41940992-134217727, default 41940992): 41940992
Last sector, +sectors or +size{K,M,G,T,P} (41940992-134217727, default 134217727): 

Created a new partition 3 of type 'Linux' and of size 44 GiB.

신규 파티션의 시작 섹터는 현재 만들어진 파티션의 섹터 바로 다음 섹터부터 시작한다.
종료 섹터는 용량을 지정하거나, 섹터 번호를 지정하면 된다.

기본값으로 두고 엔터를 입력하면 최대 범위까지 지정된다. 이후 p로 할당된 파티션 정보를 확인하자.

Command (m for help): p
Disk /dev/sda: 64 GiB, 68719476736 bytes, 134217728 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: 0x5ada5a32

Device     Boot    Start       End  Sectors  Size Id Type
/dev/sda1  *        2048    999423   997376  487M 83 Linux
/dev/sda2        1001470  41940991 40939522 19.5G  5 Extended
/dev/sda3       41940992 134217727 92276736   44G 83 Linux
/dev/sda5        1001472  41940991 40939520 19.5G 8e Linux LVM

Partition table entries are not in disk order.

그 다음, 생성된 물리 파티션을 LVM으로 전환한다.

t(파티션 관리) -> 3(파티션 선택) -> L (전환 타입 설정) -> 8e(LVM 형식 선택) -> w(변경사항 저장

Command (m for help): t
Partition number (1-3,5, default 5): 3
Partition type (type L to list all types): 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            
Partition type (type L to list all types): 8e

Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): p
Disk /dev/sda: 64 GiB, 68719476736 bytes, 134217728 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: 0x5ada5a32

Device     Boot    Start       End  Sectors  Size Id Type
/dev/sda1  *        2048    999423   997376  487M 83 Linux
/dev/sda2        1001470  41940991 40939522 19.5G  5 Extended
/dev/sda3       41940992 134217727 92276736   44G 8e Linux LVM
/dev/sda5        1001472  41940991 40939520 19.5G 8e Linux LVM

Partition table entries are not in disk order.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: 장치나 자원이 동작 중

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

정보 변경까지 확인했으면 w로 저장하고 리부트를 진행한다.

lsblk로 변경사항 적용되었는지 확인

└╼  lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                     8:0    0   64G  0 disk 
├─sda1                  8:1    0  487M  0 part /boot
├─sda2                  8:2    0    1K  0 part 
├─sda3                  8:3    0   44G  0 part 
└─sda5                  8:5    0 19.5G  0 part 
  ├─catpwn--vg-root   252:0    0 18.5G  0 lvm  /
  └─catpwn--vg-swap_1 252:1    0    1G  0 lvm  [SWAP]
sr0                    11:0    1 1024M  0 rom 

pvcreate로 해당 파티션에 물리 볼륨을 생성하고, 정보를 확인해보자.

└────╼ pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created
┌─╼[/home/synod2] 
└────╼ pvs
  PV         VG        Fmt  Attr PSize  PFree 
  /dev/sda3            lvm2 ---  44.00g 44.00g
  /dev/sda5  catpwn-vg lvm2 a--  19.52g     0 

└────╼ pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               catpwn-vg
  PV Size               19.52 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4997
  Free PE               0
  Allocated PE          4997
  PV UUID               cUiXEB-CkVi-3lE3-eI4s-1bKT-nETk-fqKywY

  "/dev/sda3" is a new physical volume of "44.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda3
  VG Name               
  PV Size               44.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               JG6bWo-h4r1-HjUN-Pqdj-vwrd-m3Js-NjAACh

볼륨 병합

이제 기존 LVM 볼륨 그룹에 새로 만들어진 물리 볼륨을 포함시킬거다.

이 작업을 하기 위해 아까전에 물리 파티션을 LVM 파티션으로 전환시켰다.

gextend "볼륨 그룹 이름" "포함시킬 볼륨이름"

으로 진행한다. 볼륨 그룹 이름은 위에서 VG Name이라고 되어있는 항목을 참조하자.

└────╼ vgextend catpwn-vg /dev/sda3
  Volume group "catpwn-vg" successfully extended

└╼  pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               catpwn-vg
  PV Size               19.52 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4997
  Free PE               0
  Allocated PE          4997
  PV UUID               cUiXEB-CkVi-3lE3-eI4s-1bKT-nETk-fqKywY

  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               catpwn-vg
  PV Size               44.00 GiB / not usable 0   
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              11264
  Free PE               11264
  Allocated PE          0
  PV UUID               JG6bWo-h4r1-HjUN-Pqdj-vwrd-m3Js-NjAACh

볼륨 그룹에 포함된것 확인된다.

└────╼ vgdisplay
  --- Volume group ---
  VG Name               catpwn-vg
  System ID             
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               63.52 GiB
  PE Size               4.00 MiB
  Total PE              16261
  Alloc PE / Size       4997 / 19.52 GiB
  Free  PE / Size       11264 / 44.00 GiB
  VG UUID               etRRwR-c7JD-a0qS-z56f-p4Ij-mNNP-ESqBs7

볼륨 그룹에 포함되면서 해당 볼륨의 크기도 늘어난게 확인된다.
이제 같은 볼륨 그룹에 포함시켰으니, 기존 LVM 볼륨의 크기를 확장시켜주면 된다.
같은 볼륨그룹 내에 있는 볼륨들만 병합을 시켜줄 수 있기 때문에 이전 작업을 진행했다.

lvextend -L+"확장용량" "기존 논리 볼륨 이름" "병합할 볼륨 이름"

같은 볼륨 그룹 내에서 44GB 만큼 용량 여유가 생겼기에, 해당 볼륨 내의 다른 볼륨을 기존 논리 볼륨에 병합시켜주는 작업이다.
Free PE/Size 라고 되어있는게 해당 볼륨 내의 여유 용량이다. 해당 용량만큼 확장 용량을 지정해주고,
lvdisplay로 기존 논리 볼륨의 이름을 찾아오면 된다.

└────╼ lvextend -L+44GB /dev/catpwn-vg/root /dev/sda3
  Size of logical volume catpwn-vg/root changed from 18.52 GiB (4741 extents) to 62.52 GiB (16005 extents).
  Logical volume root successfully resized.

이후 해당 내용이 반영되었는지 확인해보자.

└────╼ lvs
  LV     VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   catpwn-vg -wi-ao---- 62.52g                                                    
  swap_1 catpwn-vg -wi-ao----  1.00g                                                    

└────╼ lvdisplay
  --- Logical volume ---
  LV Path                /dev/catpwn-vg/root
  LV Name                root
  VG Name                catpwn-vg
  LV UUID                lo2HEt-avPl-bgXP-Yb9I-UKxS-tGMv-SgaEiG
  LV Write Access        read/write
  LV Creation host, time catpwn, 2017-01-24 19:57:46 +0900
  LV Status              available

  # open                 1

  LV Size                62.52 GiB
  Current LE             16005
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto

  - currently set to     256
    Block device           252:0

└────╼ df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         468M     0  468M   0% /dev
tmpfs                         98M  4.5M   93M   5% /run
/dev/mapper/catpwn--vg-root   19G   18G     0 100% /
tmpfs                        488M     0  488M   0% /dev/shm
tmpfs                        5.0M     0  5.0M   0% /run/lock
tmpfs                        488M     0  488M   0% /sys/fs/cgroup
/dev/sda1                    472M  462M     0 100% /boot
tmpfs                         98M     0   98M   0% /run/user/1058

병합한 볼륨 마운트

디스크상 논리 볼륨은 병합되었으나, 아직 마운트랑 리사이징은 이뤄지지 않아 실제 용량에는 반영되지 않았다.

resize2fs "볼륨명"

으로 변경사항을 반영해준다.

└────╼ resize2fs /dev/mapper/catpwn--vg-root 
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/mapper/catpwn--vg-root is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/mapper/catpwn--vg-root is now 16389120 (4k) blocks long.

다시 디스크 정보를 확인하면 볼륨이 제대로 마운트되는것을 확인할 수 있다.

└────╼ df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         468M     0  468M   0% /dev
tmpfs                         98M  4.5M   93M   5% /run
/dev/mapper/catpwn--vg-root   62G   18G   42G  30% /
tmpfs                        488M     0  488M   0% /dev/shm
tmpfs                        5.0M     0  5.0M   0% /run/lock
tmpfs                        488M     0  488M   0% /sys/fs/cgroup
/dev/sda1                    472M  462M     0 100% /boot
tmpfs                         98M     0   98M   0% /run/user/1058

└╼  lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                     8:0    0   64G  0 disk 
├─sda1                  8:1    0  487M  0 part /boot
├─sda2                  8:2    0    1K  0 part 
├─sda3                  8:3    0   44G  0 part 
│ └─catpwn--vg-root   252:0    0 62.5G  0 lvm  /
└─sda5                  8:5    0 19.5G  0 part 
  ├─catpwn--vg-root   252:0    0 62.5G  0 lvm  /
  └─catpwn--vg-swap_1 252:1    0    1G  0 lvm  [SWAP]
sr0                    11:0    1 1024M  0 rom  

즉,

  1. 추가한 용량만큼 새로운 물리 파티션을 추가하고 (PC에서 하드디스크 추가하듯이)
  2. 논리 디스크로 사용하기 위해 LVM 형식으로 전환 후,
  3. 해당 파티션의 하위 볼륨을 만들어 준 다음,
  4. 기존 볼륨 그룹에 신규 볼륨을 추가해주고
  5. 논리적으로 두 볼륨을 묶어서 사용하게 되는거다.

이러면 물리구조 상으로는 (어차피 가상환경이라 전부 논리구조지만) 두 하드가 따로 있어 데이터들이 별도로 위치하지만 논리적으로는 같은 디스크를 쓰는것 처럼 활용이 가능해진다.