KVM/가상디스크확장 페이지의 소스 보기
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: KVM/가상디스크확장 는 읽기 전용 페이지입니다.
= KVM 가상 디스크 확장 =
== # 찾아본 링크 == * https://serverfault.com/questions/324281/how-do-you-increase-a-kvm-guests-disk-space ** https://serverfault.com/a/783651/528752 - 이 답글에서 시작 == # 상황 == * 호스트: 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 패키지에 있음 == # 절차 == === # 기본 구성 확인 === 가상 머신 내부에서 fdisk 로 확인: {{{#!vim # 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 }}} 호스트에서 디스크 파일 검사: {{{#!vim # 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만큼 늘 것이다) === # 새 디스크 파일 생성 === {{{#!vim # qemu-img create -f qcow2 test03_60G.img 60G }}} 최대 60GB 크기의 디스크 파일이 생성된다. 아직 데이터가 들어있는 게 아니라서 실제 img 파일의 크기는 작음 === # 기존 디스크 내용을 복사하면서 크기 확장 === {{{#!vim # 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를 그대로 파일 내용으로 만들어버리는 듯 하다. 이건 제일 마지막 절차에서 다시 줄여줄 수 있다. === # 가상 머신 시작 === virsh edit 명령으로 가상 머신에서 사용하는 가상 디스크 파일명을 수정해준다. {{{#!vim
# 파일명 수정
}}} 가상 머신을 띄운 후에 fdisk 로 확인하면 확장 파티션의 크기만 늘어난 상태이다. {{{#!vim # 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 로 논리 파티션 크기 확장 === {{{#!vim # 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 }}} 논리 파티션의 크기가 늘어나 있다. === # pvdisplay 로 물리 볼륨 크기 확장 === 저 논리 파티션에 대응되는 physical volume의 크기는 여전히 30GB인 상태인데 이걸 확장해 준다. {{{#!vim # 확장 전 # 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 }}} === # 볼륨 그룹의 남은 용량 확인 === {{{#!vim # 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 공간이 생겨나 있다. === # 스왑 논리 볼륨 확장 === 먼저 스왑 기능을 끈 후, 논리 볼륨 크기를 확장하고, 다시 스왑을 켠다. {{{#!vim # 확장 전 스왑 공간은 약 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 논리 볼륨 확장 === 스왑과 동일하게 root 논리 볼륨도 확장해 줌. {{{#!vim # 확장 전 # 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 숫자를 사용하였다. (남는 게 없이 정확히 다 쓰려고...) === # root 파일시스템 파티션 확장 === 논리 볼륨은 커졌지만 여전히 파일 시스템은 원래 크기이다. 이것을 볼륨 크기에 맞춰 확장해준다. {{{#!vim # 확장 전 # 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% / }}} === # 디스크 파일 sparsify === 앞서 말했듯이, 새로 만들어진 가상 디스크 파일의 크기가 기존 가상 디스크의 최대 크기인 30GB로 생성되어 있다. {{{#!vim # 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 하고 진행할 것''' 이 때도 기존 디스크 파일과 별개로 새로운 파일이 생성되게 된다.(기존 파일을 바로 조작하는 옵션도 있긴 함) {{{#!vim # # 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 로 가상 디스크 파일명 변경 후 시작 게스트 안에서 확인: {{{#!vim # 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% / }}} 호스트 쪽에서 확인: {{{#!vim # 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도 엄청나게 써댄다. 실서비스를 제공하는 서버에서 수행하기에는 부담스러움
---- [[컴퓨터분류]]
KVM/가상디스크확장
페이지로 돌아가기 |
다른 수정본 보기