KVM Image 용량 증설하기
KVM 가상화를 운영하고 있는데, 운영중인 VM 하나가 용량이 부족해지는 상황이 발생했다. KVM 가상화 VM 의 용량은 결국 이미지 파일 한개임으로 이 이미지 파일의 용량을 늘려주면 VM 의 용량이 사실상 늘어나는 것으로 생각했다.
하지만 현시점(2023) 에서 검색을 해보니 다양한 방법들이 존재했다. 그 중에는 VM 이미지를 로컬에 마운트해서 늘려주는 방법도 존재했지만 너무나 복잡해 보였다. 좀 더 쉬운 방법이 없을까 해서 검색한 결과 가장 쉬워보이는 것을 발견했고 이 방법으로 손쉽게 VM 용량을 늘리는데 성공했다.
VM 상태
용량을 늘리려는 VM 의 상태는 다음과 같다.
1 2 3 4 5 6 7 8 |
# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 393M 8.0M 385M 3% /run /dev/vda1 48G 44G 794M 99% / tmpfs 2.0G 52K 2.0G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /run/qemu tmpfs 393M 0 393M 0% /run/user/1000 |
/dev/vda1 으로 파티션 하나로 보이지만 사실 SWAP 파티션도 존재한다. 이 SWAP 파티션의 /dev/vda2 디바이스이며 약 2G 용량을 차지한다.
VM 이미지 경로
VM 을 운영하는 Host 서버에서 VM 의 이미지가 어디에 있는지를 다음과 같이 살펴볼 수 있다.
1 2 3 4 5 |
]# virsh domblklist --domain Ubuntu20.04 대상 소스 ---------------------------------- vda /opt/kvm/ubuntu20.04.img sda - |
VM 이미지 정보
VM 이미지의 정보를 아는 것은 매우 중요하다. VM 이미지의 타입이 존재하는데 raw, qemu 타입이다. 어떤 타입인지에 따라서 VM 이미지 용량을 늘리는 방법이 달라진다.
1 2 3 4 5 |
]# qemu-img info /opt/kvm/ubuntu20.04.img image: /opt/kvm/ubuntu20.04.img file format: raw virtual size: 50 GiB (53687091200 bytes) disk size: 50 GiB |
또, 가상 크기와 디스크 크기 정보 표시되는데 간혹 이 크기가 서로 다를 수가 있다.
기존 이미지 백업
혹시 모를 불상사를 방지하기 위해서 기존 이미지를 백업해 두자.
1 2 |
cp -av /opt/kvm/ubuntu20.04.img /mnt7/ '/opt/kvm/ubuntu20.04.img' -> '/mnt7/ubuntu20.04.img' |
패키지 설치
VM 이미지를 늘리기 위한 작업을 위해서 필요한 패키지를 설치 해준다. 설치는 환경이 RedHat 기반이기 때문에 dnf 명령어로 설치를 하였다. 설치하는 패키지 이름은 배포판마다 다를 수 있다.
1 |
]# dnf install guestfs-tools |
이 패키지를 설치하게 되면 virt-resize 명령어를 사용할 수 있다.
VM 이미지 디스크 정보
앞에서 VM 이미지 정보를 표시했다면 이제는 이미지 안에 디스크 정보를 봐야 한다. 각각 설치한 방법이 다르고 파티션 정보도 다르기 표시 되기 때문에 이를 잘 파악해야 한다.
VM 이미지 내의 디스크 정보는 다음과 같이 알 수 있다.
1 2 3 |
]# virt-df Gitlab Filesystem 1K-blocks Used Available Use% Gitlab:/dev/sda1 49379416 46001304 837364 94% |
단일 파티션 /dev/sda1 만 보이지만 virt-df 명령어의 한계로 보인다. 왜냐하면 SWP 파티션도 존재하기 때문인데, 이 SWAP 파티션은 표시되지 않았다.
virt-filesystems 명령어를 통해서 이를 정확하게 알 수 있다.
1 2 3 4 5 6 7 |
]# virt-filesystems --long -h --all -a /opt/kvm/ubuntu20.04.img Name Type VFS Label MBR Size Parent /dev/sda1 filesystem ext4 - - 47G - /dev/sda2 filesystem swap - - 1.8G - /dev/sda1 partition - - 83 48G /dev/sda /dev/sda2 partition - - 82 1.8G /dev/sda /dev/sda device - - - 50G - |
위 정보를 보면 전체 50G 에 /dev/sda1 과 /dev/sda2 로 나뉘어 있다. /dev/sda2 는 swap 파티션으로 virt-df 일때는 나오지 않았다.
용량 증설을 위한 이미지 생성
다음과 같이 백업한 이미지를 가지고 작업을 진행한다.
1 2 |
]# truncate -r /mnt7/ubuntu20.04.img /mnt7/ubuntu20.04-new.img ]# truncate -s +10G /mn7/ubuntu20.04-new.img |
이 작업은 매우 중요하다. truncate 명령어를 이용하는 것인데, -r 옵션으로 용량 증설을 위한 이미지를 만들었다. 그리고 그 이미지에 용량 증설을 설정한다. 여기서는 10G 용량을 늘린다
루트(/) 피티션 /dev/sda1 크기 변경
VM 이미지 내의 파티션 정보는 /dev/sda1 으로 보인다. 여기서 주의해야 할 것은 VM 이 가동된 후에 이미지 정보의 디바이스 이름은 /dev/vda1 으로 다르다. virt-df 혹은 virt-filesystems 나온 내용을 기반으로 디바스 이름을 정해야 한다.
용량 증설은 루트 파티션만 하면 됨으로 /dev/sda1 의 크기를 변경할 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
]# virt-resize --expand /dev/sda1 /mnt7/ubuntu20.04.img /mnt7/ubuntu20.04-new.img [ 0.0] Examining /mnt7/ubuntu20.04.img ********** Summary of changes: virt-resize: /dev/sda1: This partition will be resized from 48.1G to 58.1G. The filesystem ext4 on /dev/sda1 will be expanded using the ‘resize2fs’ method. virt-resize: /dev/sda2: This partition will be left alone. ********** [ 1.5] Setting up initial partition table on /mnt7/ubuntu20.04-new.img [ 2.4] Copying /dev/sda1 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 [ 907.7] Copying /dev/sda2 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 [ 941.1] Expanding /dev/sda1 using the ‘resize2fs’ method virt-resize: Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly. |
변경 요약을 보면 /dev/sda1 의 용량이 증설될 것인데, 이 파티션의 파일시스템이 ext4 임으로 resize2fs 방법을 이용해서 크기가 확장될 것임을 알려주고 있다.
진행 상태를 보면 Copying /dev/sda1 으로 나오고 실행 명령어에서 변경전 이미지와 truncate 명령어로 새롭게 생성한 이미지를 인자로 줬는데, 아마도 변경전 이미지를 truncate 명령어로 새롭게 생성한 이미지에 순차적인 복사를 하는 것으로 보인다.
이미지 용량에 따라서 작업 시간는 차이를 보일 것이다.
새로운 이미지로 VM 시작한 후 파티션 확인
/mnt7/ubuntu20.04-new.img 이미지로 VM 을 부팅한다. 그리고 난 후 다음과 같이 파티션 용량이 늘었는지 체크한다.
1 2 3 4 5 6 |
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sr0 11:0 1 1024M 0 rom vda 252:0 0 60G 0 disk ├─vda1 252:1 0 58.1G 0 part / └─vda2 252:2 0 1.8G 0 part [SWAP] |
용량이 10G 늘었다.
파일시스템 용량을 봐 본다.
1 2 3 4 5 6 7 8 |
# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 393M 6.8M 386M 2% /run /dev/vda1 57G 44G 11G 82% / tmpfs 2.0G 52K 2.0G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /run/qemu tmpfs 393M 0 393M 0% /run/user/1000 |
앞에서 변경 요약을 보면 파일시스템이 뭔지를 파악하고 거기에 맞게 파티션 Resize 작업도 해주는 것으로 보인다. ext4 의 경우 resize2fs, XFS 의 경우에는 xfs_growfs 을 사용하는데 이런 작업은 파티션의 크기를 변경하는 것으로 VM 이미지 용량 증설과 함께 해준다.
따라서 별도의 파티션 용량 증설작업은 필요하지 않다.