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. 찾아본 링크
- 호스트: Ubuntu 16.04
- KVM 게스트: Ubuntu 16.04
- 이름: test03
- 디스크: test03.img (30GB)
KVM 가상 머신을 만들었는데, 가상 디스크를 30GB로 잡았다가, 이 디스크의 크기를 60GB로 늘려주고 싶음.
- 디스크 크기를 늘린 후 fdisk 로 파티션을 삭제했다가 다시 생성하면서 파티션의 마지막 섹터(?) 위치를 기존보다 뒤로 잡아주는 식으로 파티션을 늘릴 수는 있었는데, 아무래도 파티션을 지웠다 다시 늘리는 건 불안하다.
- 위의 https://serverfault.com/a/783651/528752 링크의 방법이 매우 깔끔해보였다. 특히 기존 디스크 파일을 건드리지 않고 새 디스크 파일을 생성하므로, 문제가 발견되면 언제든 원래 디스크 파일을 다시 사용하면 되니 안전하다.
- 그러나 막상 시도하니 문제가 생겼음.
- KVM 게스트는 ubuntu16.04 기반인데 LVM을 사용하고 있었고, 게다가 논리 볼륨이 존재하는 파티션이
/dev/vda5
즉 논리파티션이라서 virt-resize로 파티션을 늘릴 때 한꺼번에 늘릴 수가 없음. virt-resize에서 --resize
로 늘릴 수 있는 파티션은 주파티션과 확장파티션 뿐
- 나는 스왑 파일시스템도 1GB에서 4GB로 늘려주고 싶었는데, 스왑과 root 논리 볼륨이 동일한 볼륨 그룹에 있어서 virt-resize로 각각을 따로 늘려줄 수 없었음
- 사실 LVM을 쓰고 있기 때문에, 디스크 파일을 새로 하나 만들고, 가상 머신에 장치를 추가한 다음에 두 개의 디스크의 파티션을 하나의 논리 볼륨으로 만들면 더 쉬울 것 같기는 한데... 이건 이대로 다른 문제(가상 머신을 다른 호스트로 이전할 때 챙겨야 할 파일이 늘어난다거나)가 있어서.
- libguestfs-tools 패키지. apt 로 설치
- parted 프로그램. parted 패키지에 있음
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
여기서 하고 싶은 것은
- 가상 디스크 파일 최대 크기를 60GB로 늘림
- 이 디스크 상의 /dev/sda2 확장 파티션 크기를 최대로 늘림
- 확장 파티션 위의 /dev/sda5 논리 파티션 크기를 최대로 늘림
- /dev/guest-vg/swap_1 논리 볼륨 크기를 4GB로 늘림
- /dev/guest-vg/root 파티션을 최대로 늘림(스왑4GB를 제외하면 약 26GB만큼 늘 것이다)
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.
**********
- --dryrun 옵션을 주면 실제 수행은 하지 않고 어떻게 진행할지 보여준다. 별 문제 없어 보이면 --dryrun을 제외하고 실행
- /dev/sda2 파티션이 30GB만큼 추가될 것이라는 것을 확인 가능
- --LV-expand 옵션을 주어 논리 볼륨 확장을 시도해보았으나 이건 실제로는 논리 파티션 크기가 그대로이므로 달라지는 게 없음
이 시점에서 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
- lvextend 옵션의
-l+6900
이란 숫자는 스왑 확장 이후에 vgdisplay를 다시 실행하여 "Free PE / Size" 항목에 적혀 있는 PE 숫자를 사용하였다. (남는 게 없이 정확히 다 쓰려고...)
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로 줄었다
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
근데 디스크 전체적으로 데이터에 손상이 없음을 확신할 수 있어야 하는데 이게 어떻게 가능할런지는...
컴퓨터분류