KVM 가상 머신을 만들었는데, 가상 디스크를 30GB로 잡았다가, 이 디스크의 크기를 60GB로 늘려주고 싶음.
/dev/vda5
즉 논리파티션이라서 virt-resize로 파티션을 늘릴 때 한꺼번에 늘릴 수가 없음. virt-resize에서 --resize
로 늘릴 수 있는 파티션은 주파티션과 확장파티션 뿐
가상 머신 내부에서 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
여기서 하고 싶은 것은
# qemu-img create -f qcow2 test03_60G.img 60G
최대 60GB 크기의 디스크 파일이 생성된다. 아직 데이터가 들어있는 게 아니라서 실제 img 파일의 크기는 작음
# 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를 그대로 파일 내용으로 만들어버리는 듯 하다. 이건 제일 마지막 절차에서 다시 줄여줄 수 있다.
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
# 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
논리 파티션의 크기가 늘어나 있다.
저 논리 파티션에 대응되는 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
# 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 공간이 생겨나 있다.
먼저 스왑 기능을 끈 후, 논리 볼륨 크기를 확장하고, 다시 스왑을 켠다.
# 확장 전 스왑 공간은 약 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
스왑과 동일하게 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
-l+6900
이란 숫자는 스왑 확장 이후에 vgdisplay를 다시 실행하여 "Free PE / Size" 항목에 적혀 있는 PE 숫자를 사용하였다. (남는 게 없이 정확히 다 쓰려고...)
논리 볼륨은 커졌지만 여전히 파일 시스템은 원래 크기이다. 이것을 볼륨 크기에 맞춰 확장해준다.
# 확장 전 # 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% /
앞서 말했듯이, 새로 만들어진 가상 디스크 파일의 크기가 기존 가상 디스크의 최대 크기인 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로 줄었다
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도 엄청나게 써댄다. 실서비스를 제공하는 서버에서 수행하기에는 부담스러움