[첫화면으로]KVM/가상디스크확장

마지막으로 [b]

KVM 가상 디스크 확장

1. 찾아본 링크
2. 상황
3. 준비물
4. 절차
4.1. 기본 구성 확인
4.2. 새 디스크 파일 생성
4.3. 기존 디스크 내용을 복사하면서 크기 확장
4.4. 가상 머신 시작
4.5. parted 로 논리 파티션 크기 확장
4.6. pvdisplay 로 물리 볼륨 크기 확장
4.7. 볼륨 그룹의 남은 용량 확인
4.8. 스왑 논리 볼륨 확장
4.9. root 논리 볼륨 확장
4.10. root 파일시스템 파티션 확장
4.11. 디스크 파일 sparsify
4.12. 확인

1. 찾아본 링크

2. 상황

KVM 가상 머신을 만들었는데, 가상 디스크를 30GB로 잡았다가, 이 디스크의 크기를 60GB로 늘려주고 싶음.

3. 준비물

4. 절차

4.1. 기본 구성 확인

가상 머신 내부에서 fdisk 로 확인:

# fdisk -l /dev/vda
Disk /dev/vda: 30 GiB, 32212254720 bytes, 62914560 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: 0x9df9554b

Device     Boot   Start      End  Sectors  Size Id Type
/dev/vda1  *       2048  1499135  1497088  731M 83 Linux
/dev/vda2       1501182 62912511 61411330 29.3G  5 Extended
/dev/vda5       1501184 62912511 61411328 29.3G 8e Linux LVM

호스트에서 디스크 파일 검사:

# qemu-img info test03.img
image: test03.img
file format: qcow2
virtual size: 30G (32212254720 bytes)
disk size: 2.6G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false

# virt-filesystems --parts --filesystems --logical-volumes --long -a test03.img
Name                 Type       VFS  Label MBR Size        Parent
/dev/sda1            filesystem ext2 -     -   766509056   -
/dev/guest-vg/root   filesystem ext4 -     -   30375149568 -
/dev/guest-vg/root   lv         -    -     -   30375149568 /dev/guest-vg
/dev/guest-vg/swap_1 lv         -    -     -   1023410176  /dev/guest-vg
/dev/sda1            partition  -    -     83  766509056   /dev/sda
/dev/sda2            partition  -    -     05  1024        /dev/sda
/dev/sda5            partition  -    -     8e  31442599936 /dev/sda

여기서 하고 싶은 것은

4.2. 새 디스크 파일 생성

# qemu-img create -f qcow2 test03_60G.img 60G

최대 60GB 크기의 디스크 파일이 생성된다. 아직 데이터가 들어있는 게 아니라서 실제 img 파일의 크기는 작음

4.3. 기존 디스크 내용을 복사하면서 크기 확장

# virt-resize --dryrun --expand /dev/sda2 --LV-expand /dev/guest-vg/root test03.img test03_60G.img
[   0.0] Examining test03.img
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be resized from 29.3G to 59.3G.

/dev/guest-vg/root: This logical volume will be expanded to maximum size.
The filesystem ext4 on /dev/guest-vg/root will be expanded using the
'resize2fs' method.

**********

이 시점에서 test03_60G.img 파일의 크기를 호스트에서 ls -l로 확인하면 30GB가 되어 있다. 원 가상 디스크의 실제 데이터 사용량과 무관하게 가상 디스크의 최대 크기였던 30GB를 그대로 파일 내용으로 만들어버리는 듯 하다. 이건 제일 마지막 절차에서 다시 줄여줄 수 있다.

4.4. 가상 머신 시작

virsh edit 명령으로 가상 머신에서 사용하는 가상 디스크 파일명을 수정해준다.

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      # 파일명 수정
      <source file='/var/lib/libvirt/images/test03_60G.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>

가상 머신을 띄운 후에 fdisk 로 확인하면 확장 파티션의 크기만 늘어난 상태이다.

# fdisk -l /dev/vda
Disk /dev/vda: 60 GiB, 64424509440 bytes, 125829120 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: 0x9df9554b

Device     Boot   Start       End   Sectors  Size Id Type
/dev/vda1  *       2048   1499135   1497088  731M 83 Linux
/dev/vda2       1499136 125826687 124327552 59.3G  5 Extended    <-- 59.3GB로 늘어남
/dev/vda5       1499138  62910465  61411328 29.3G 8e Linux LVM

4.5. parted 로 논리 파티션 크기 확장

# parted /dev/vda

(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 64.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  768MB   767MB   primary   ext2         boot
 2      768MB   64.4GB  63.7GB  extended
 5      768MB   32.2GB  31.4GB  logical                lvm

(parted) resizepart 5 <-- 파티션 번호
End?  [32.2GB]? 100%

(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 64.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  768MB   767MB   primary   ext2         boot
 2      768MB   64.4GB  63.7GB  extended
 5      768MB   64.4GB  63.7GB  logical                lvm

논리 파티션의 크기가 늘어나 있다.

4.6. pvdisplay 로 물리 볼륨 크기 확장

저 논리 파티션에 대응되는 physical volume의 크기는 여전히 30GB인 상태인데 이걸 확장해 준다.

# 확장 전
# pvdisplay
  --- Physical volume ---
  PV Name               /dev/vda5
  VG Name               guest-vg
  PV Size               29.28 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              7496
  Free PE               0
  Allocated PE          7496
  PV UUID               pLsepW-t2dC-Y5ve-r430-c62n-P2hP-QcxQIC

# 확장
# pvresize /dev/vda5
  Physical volume "/dev/vda5" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

# 확장 후
# pvdisplay
  --- Physical volume ---
  PV Name               /dev/vda5
  VG Name               guest-vg
  PV Size               59.28 GiB / not usable 1.81 MiB  <-- 크기가 늘어남
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              15176
  Free PE               7680
  Allocated PE          7496
  PV UUID               pLsepW-t2dC-Y5ve-r430-c62n-P2hP-QcxQIC

4.7. 볼륨 그룹의 남은 용량 확인

# vgdisplay
  --- Volume group ---
  VG Name               guest-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  5
  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               59.28 GiB
  PE Size               4.00 MiB
  Total PE              15176
  Alloc PE / Size       7496 / 29.28 GiB
  Free  PE / Size       7680 / 30.00 GiB   <-- 30GB 용량 여유가 생겨남
  VG UUID               Uxx1fM-eb4M-edR7-A7Tw-Ntm5-q6Pc-9GPFG9

30GB의 Free 공간이 생겨나 있다.

4.8. 스왑 논리 볼륨 확장

먼저 스왑 기능을 끈 후, 논리 볼륨 크기를 확장하고, 다시 스왑을 켠다.

# 확장 전 스왑 공간은 약 1GB
# free -m
              total        used        free      shared  buff/cache   available
Mem:            992          47         799           3         145         794
Swap:           975           0         975

# 스왑을 일단 끄고
# swapoff /dev/guest-vg/swap_1

# 논리 볼륨 확장
# lvextend -L4G /dev/guest-vg/swap_1
  Size of logical volume guest-vg/swap_1 changed from 976.00 MiB (244 extents) to 4.00 GiB (1024 extents).
  Logical volume swap_1 successfully resized.

# 스왑 생성
# mkswap /dev/guest-vg/swap_1
mkswap: /dev/guest-vg/swap_1: warning: wiping old swap signature.
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=f1521e3b-15eb-420f-bb91-71932e066a22

# 스왑 켜고
# swapon /dev/guest-vg/swap_1

# 확인하면 4GB
# free -m
              total        used        free      shared  buff/cache   available
Mem:            992          48         797           3         145         793
Swap:          4095           0        4095

4.9. root 논리 볼륨 확장

스왑과 동일하게 root 논리 볼륨도 확장해 줌.

# 확장 전
# lvs
  LV     VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   guest-vg -wi-ao---- 28.33g
  swap_1 guest-vg -wi-ao----  4.00g

# 확장
# lvextend -l+6900 /dev/guest-vg/root
  Size of logical volume guest-vg/root changed from 28.33 GiB (7252 extents) to 55.28 GiB (14152 extents).
  Logical volume root successfully resized.

# 확인
# lvs
  LV     VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   guest-vg -wi-ao---- 55.28g
  swap_1 guest-vg -wi-ao----  4.00g

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/guest-vg/root
  LV Name                root
  VG Name                guest-vg
  LV UUID                BCjsfO-w9Pb-A4oe-dzoD-fv25-E97i-AauQIU
  LV Write Access        read/write
  LV Creation host, time guest, 2018-10-23 15:27:42 +0900
  LV Status              available
  # open                 1
  LV Size                55.28 GiB
  Current LE             14152
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

4.10. root 파일시스템 파티션 확장

논리 볼륨은 커졌지만 여전히 파일 시스템은 원래 크기이다. 이것을 볼륨 크기에 맞춰 확장해준다.

# 확장 전
# df -h /
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/guest--vg-root   28G  1.9G   25G   7% /

# 확장
# resize2fs /dev/mapper/guest--vg-root
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/mapper/guest--vg-root is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/mapper/guest--vg-root is now 14491648 (4k) blocks long.

# 확장 후
root@test03:~# df -h
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/guest--vg-root   55G  1.9G   50G   4% /

4.11. 디스크 파일 sparsify

앞서 말했듯이, 새로 만들어진 가상 디스크 파일의 크기가 기존 가상 디스크의 최대 크기인 30GB로 생성되어 있다.

# ls -lh test03*
-rw------- 1 root root 2.7G  8월 26 08:40 test03.img      <-- 원 디스크는 사실 현재 2.7GB 정도밖에 쓰이고 있지 않음에도
-rw-r--r-- 1 root root  30G  8월 26 08:58 test03_60G.img

이대로 두어도 상관은 없겠으나, 이 가상 머신을 다른 호스트로 이전시키려면 디스크를 복사해야 하는데 양이 많아 불편하기도 하고, 기분이 나쁘다(...)

이렇게 실제 사용량이 많지 않은 디스크를, 다시 "sparse"한 상태로 만들어 크기를 줄일 수 있다.

man virt-sparsify 하면 설명도 꽤나(man page치고는) 친절한 편이다.

반드시 가상 머신을 shutdown 하고 진행할 것

이 때도 기존 디스크 파일과 별개로 새로운 파일이 생성되게 된다.(기존 파일을 바로 조작하는 옵션도 있긴 함)

#
# virt-sparsify test03_60G.img test03_60G_sparsify.img

# ls -l test03*
-rw------- 1 root root  2808217600  8월 26 08:40 test03.img
-rw-r--r-- 1 root root 31676628992  8월 26 08:58 test03_60G.img
-rw-r--r-- 1 root root  2197225472  8월 26 09:17 test03_60G_sparsify.img  <-- 크기가 2.1GB로 줄었다

4.12. 확인

virsh edit 로 가상 디스크 파일명 변경 후 시작

게스트 안에서 확인:

# fdisk -l /dev/vda
Disk /dev/vda: 60 GiB, 64424509440 bytes, 125829120 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: 0x9df9554b

Device     Boot   Start       End   Sectors  Size Id Type
/dev/vda1  *       2048   1499135   1497088  731M 83 Linux
/dev/vda2       1499136 125826687 124327552 59.3G  5 Extended
/dev/vda5       1499138 125826687 124327550 59.3G 8e Linux LVM

# df -h /
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/guest--vg-root   55G  1.9G   50G   4% /

호스트 쪽에서 확인:

# virt-filesystems --parts --filesystems --logical-volumes --long -a test03_60G_sparsify.img
Name                 Type       VFS  Label MBR Size        Parent
/dev/sda1            filesystem ext2 -     -   766509056   -
/dev/guest-vg/root   filesystem ext4 -     -   59357790208 -
/dev/guest-vg/root   lv         -    -     -   59357790208 /dev/guest-vg
/dev/guest-vg/swap_1 lv         -    -     -   4294967296  /dev/guest-vg
/dev/sda1            partition  -    -     83  766509056   /dev/sda
/dev/sda2            partition  -    -     05  1024        /dev/sda
/dev/sda5            partition  -    -     8e  63655705600 /dev/sda

근데 디스크 전체적으로 데이터에 손상이 없음을 확신할 수 있어야 하는데 이게 어떻게 가능할런지는...

virt-resize 와 virt-sparsify 할 때는 새 가상디스크를 만드니까 호스트 입장에서 디스크 출력이 급격히 늘어나는 것은 당연한데, 그 뿐 아니라 CPU도 엄청나게 써댄다. 실서비스를 제공하는 서버에서 수행하기에는 부담스러움
-- Raymundo 2019-11-1 8:18 am
이름:  
Homepage:
내용:
 

컴퓨터분류

마지막 편집일: 2024-8-5 10:22 pm (변경사항 [d])
3167 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기