반응형
작성일: 2026년 5월 22일

 

VM 생성시 500GB 용량의 VM image file(예: abc.qcow2)을 생성했다고 하더라도

실제로 VM instance가 500GB 중에서 100GB만 파일을 사용하고 있다면

아래와 같이 qemu-img 명령을 통해서 Host OS에서는  100GB 용량의 qcow2 파일로 줄일 수 있다.

 

qemu-img convert -O qcow2 abc.qcow2 abc-shrunk.qcow2

 

그런데 위와 같이 qemu-img 명령을 사용한다고 해서 500GB Volume이 항상 100GB짜리로qcow2 파일로 줄어드는 것은 아니다.

일반적으로 VM instance 내부에서는 파일을 만들고, 삭제하는 과정을 반복할 것이다.

VM instance의 운영 시간이 길어지고 많은 일을 하면서 이런 file 생성과 삭제는 더 많이 발생할 것이다.

대부분의 OS에서는 File을 삭제한다고 해도 삭제된 파일이 진짜로 Storage volume에서 '0' 또는 'NULL'로 Clear되는게 아니고

File 내용은 온전하게 남아 있고, File system 관리 테이블에 File name과 Meta data 정도만 삭제하는 것이다.

(디지털 포렌식할 때, 기존 삭제된 데이터가 모두 복구되는 이유도 Filesystem의 이런 동작 방식 때문이다)

 

그렇기 때문에 현재 `df -h` 명령으로 File system의 용량을 조회했을 때, 100GB로 보이더라도 

Storage volume에는 기존에 삭제했던 File contents들이 그대로 남아 있어서 0x0 값이 아닌 뭔가 값이 채워진 Storage volume의 공간이 100GB보다는 훨씬 크다.

이것 때문에 `qemu-img convert` 명령으로 Volume의 빈공간을 줄이려고 해도 줄여지지 않는 것이다.

(실제로 Volume에는 빈 공간이 있는게 아니고, 기존에 지워진 File contents는 남아 있으니까)

 

그래서 아래와 같이 강제로 Storage volume에서 File system이 관리하는 영역이 아닌 모든 공간을 '0x00' 값으로 채우고

`qemu-img conver` 명령을 실행하면 아주 깔끔하게 qcow2 image file의 크기가 줄어든다.

 

## VM instance 내부에서 아래의 명령을 실행한다.

sudo dd if=/dev/zero of=/zero.fill bs=1M status=progress
sudo sync
sudo rm /zero.fill

 

(i) 주의할 점: 위 명령은 Storage volume의 bit 단위로 모두 0x0 값으로 바꾸는 작업을 하기 때문에 오랜 시간이 걸린다.

 

위 작업이 끝나고, Host OS에서 아래와 같이 qcow2 image file의 빈공간을 제거하는 작업을 한다.

qemu-img convert -O qcow2 abc.qcow2 abc-shrunk.qcow2

 

이렇게 하면, 500GB 짜리 QCOW2 파일의 크기가 많이 줄어들것이다.

(운이 좋으면, 7~8GB로 대폭 줄어들수도 있음~~ ^^)

 
반응형
작성일: 2026년 3월 31일

 

나는 회사 업무 때문에 Oracle Cloud와 Amazon Cloud를 동시에 사용하고 있다.

동일한 Resource 사용을 하는 경우, Oracle Cloud가 Amazon Cloud보다 3배 가량 저렴해서 지난 3년 동안 만족하면서 사용했었다.

그런데 올해부터 가상 Resource 자체의 장애와 OCI Web Console의 먹통 현상이 있어서 짜증이 좀 났다.

특히, 오늘 Resource deletion에 대한 처리를 하려다가 OCI Web Console에서 계속 'Error' 메시지가 출력되면서 업무가 안 되고 있다.

그리고 나는 Oracle Support 사이트에 가서 "SR(Service Request)"를 하라고 안내를 받았다.

Oracle Support 사이트에 로그인하고, "Service Request" 버튼을 누르는 순간... 나의 화는 절정에 도달했다.

출근해서 오전 내내 Oracle Cloud Web Console의 Error 메시지만 봐서 화만 많이 난 상태인데,

Oracle Support 사이트에서는 AI가 응대하고 있는 것이다.

혹시나 AI가 Errror 이슈에 대해서 해결해주나 약간의 희망을 가지고 AI와 대화를 도전했으나

역시나 예상한대로 AI는 저장된 뻔한 답변만 되풀이 할 뿐이다.

이미 알고 있는 뻔한 대답을 듣자고 Oracle Support 사이트에 로그인한 것이 아니다.

 

그냥 이슈 해결을 위한 SR(Service Request) 입력 폼이나 보여 달라구... Oracle 이 개X의 자X들아!

 

 

1시간 동안 Oracle Cloud Web Console에서 시달리고, Oracle Support AI한테 30분 동안 시달렸더니 오늘은 일할 에너지가 남질 않는다. ㅠㅠ

 

진짜 이렇게 Cloud Infra를 관리할거면, Oracle은 왜 Cloud Infra와 Platform 사업을 하는거야?

 

 올해까지만 쓰고, Oracle Cloud를 해지할 결심 !
반응형
작성일: 2026년 3월 5일

 

KVM 가상화 환경에서 VM을 생성하면, VM 내부의 NIC Queue 개수는 기본적으로 1개로 설정된다.

높은 Network bandwidth가 필요한 경우라면, NIC Queue를 늘려서 Network bandwidth를 늘려야 한다.

부수적으로 CPU core의 부하를 분산시키는 효과도 얻을 수 있다.

 

방법 A: VM 생성할 때 NIC Queue 개수를 지정하는 방법

virt-install \
  --name myvm \
  --memory 2048 \
  --vcpus 4 \
  --disk path=/var/lib/libvirt/images/myvm.qcow2,size=20 \
  --network network=default,model=virtio,driver.name=vhost,driver.queues=8 \
  --cdrom /path/to/installer.iso

 

driver.queues=8 파라미터를 추가하여 virt-install 명령을 수행한다.

그리고 NIC multi queue를 사용하려면, model=virtio도 추가해야 한다.

 

VM(즉, Guest OS) 내부에서도 NIC Queue 설정 작업을 해야 한다.

# 현재 채널 확인
ethtool -l eth0

# combined 채널 8개로 설정
ethtool -L eth0 combined 8

 

그리고 위와 같이 NIC queue 개수가 늘어났으면, ksoftirqd 데몬 프로세스의 CPU 사용률을 확인해야 한다.

실제로 NIC multi queue에 저장된 network packet을 여러 CPU core가 고르게 처리하는지 확인한다.

 

#!/bin/bash

# ksoftirqd PID만 추출하여 top으로 모니터링
pids=$(pgrep ksoftirqd)
if [ -z "$pids" ]; then
    echo "ksoftirqd 프로세스를 찾을 수 없습니다."
    exit 1
fi

# 여러 CPU용 ksoftirqd가 있으면 쉼표로 이어서 top -p에 전달
pid_list=$(echo "$pids" | tr '\n' ',' | sed 's/,$//')
exec top -p "$pid_list"

 

방법 B: 이미 운영 중인 VM instance에 대한 NIC Queue 개수를 지정하는 방법

아래와 같이 `virsh edit` 명령으로 VM instance의 NIC queue 개수를 지정할 수 있다.

$ virsh edit myvm


<interface type='network'>
  <source network='default'/>         ## 실제로 사용하는 network 이름을 찾아야 함.
  <model type='virtio'/>              ## 이 라인을 추가.
  <driver name='vhost' queues='8'/>   ## 이 라인을 추가. queue 개수는 내가 원하는 만큼.
  <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</address>
</interface>

 

그리고 한번 VM instance를 재시작해야 위 설정값이 VM instance에 적용된다.

$ virsh shutdown myvm

$ virsh start    myvm

 

VM(즉, Guest OS) 내부에서도 NIC Queue 설정 작업을 해야 한다.

# 현재 채널 확인
ethtool -l eth0

# combined 채널 8개로 설정
ethtool -L eth0 combined 8

 

 

 

 

 

 

반응형
작성일: 2025년 11월 28일

 

KVM으로 Guest OS(VM instance)를 생성하고, Guest OS 내부의 리소스 정보를 보거나 상태를 확인할 때는

QEMU Guest Agent가 필요하다.

 

아래와 같이 Guest OS(VM instance)에 "qemu-guest-agent"를 설치한다.

$  sudo apt update
$  sudo apt install -y qemu-guest-agent
$  sudo systemctl enable --now qemu-guest-agent
$  sudo systemctl status qemu-guest-agent --no-pager

 

 

그리고 QEMU Guest Agent가 잘 설치되었는지 확인하기 위해 KVM이 설치된 Host OS에서 아래와 같이 virsh 명령을 통해 확인해본다.

 

$ virsh domifaddr --source agent my-example-vm

 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 lo         00:00:00:00:00:00    ipv4         127.0.0.1/8
 -          -                    ipv6         ::1/128
 enp1s0     52:54:00:15:c3:ba    ipv4         10.1.4.40/24
 -          -                    ipv6         fe80::5054:ff:fe12:c3bb/64
 enp2s0     52:54:00:1b:37:03    ipv4         192.168.0.40/24
 -          -                    ipv6         fe80::5054:ff:fe1a:3705/64
 enp3s0     52:54:00:3c:7b:11    N/A          N/A

 

 

 

반응형
작성일: 2026년 4월 20일

 

 

KVM에서 Windows 11 VM instance를 구동하면, 화면 해상도가 1280x720과 같이 저해상도로 고정되어 있고 해상도 변경하는 설정 메뉴가 비활성화된다.

Windows 11 VM의 화면 해상도를 고해상도로 변경하고 싶다면, 그리고 Host machine와 Guest machine간 clipboard를 공유하고 싶다면,

아래 Fedora 패키지 저장소에서 virtio-win-gt, virtio-win-guest-tools 설치 프로그램을 내려받아서 설치해야 한다.

 

https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.285-1/

 

virtio-win-gt 다운로드 사이트

 

 

만약 더 많은 종류의 Windows VirtIO 관련 Driver를 설치하고 싶다면, 아래 Web Site 설명을 참고할 것!

 

https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers

 

반응형

 

작성일: 2025년 11월 24일

 

 

KVM을 사용하다보면, Virt-Manager라는 GUI 툴이 조작하기 편해서 계속 Virt-Manager만 사용하게 된다.

그런데 가끔 SSH 터미널만 사용할 수 있는 환경이거나 CLI Command만 이용해서 Script를 작성할 때는 virsh를 꼭 사용해야 한다.

 

Virtual Machine 생성하기 (그리고 VM에 OS 설치하기)

##
## 참고: 아래 명령을 수행하고 대략 55초 정도 지나야 Console에 text message가 출력된다.
##      따라서 느긋하게 기다려야 제대로 설치가 가능하다.
##
## 참고: size 단위는 GB.
##

##
## Case: OS 설치하면서 VM instance 시작하기
##       (주의: OS 설치하면서 VM start 할 때는 --osinfo 옵션을 빼야 한다.)
##

$ virt-install \
  --name my-vm \
  --ram 4096 \
  --vcpus 2 \
  --disk /mnt/sda1/virtual_storage/waas.qcow2,size=100 \
  --disk /mnt/hdd0/virtual_machine/harbor-2nd-storage.qcow2,size=500 \
  --graphics none \
  --network network=br-ex \
  --console pty,target.type=virtio \
  --autoconsole text \
  --location /home/iso/ubuntu-24.04.1-live-server-amd64.iso
 


## Case: 기존 사용했던 VM 이미지를 이용하여 VM instance 기동하기.

$ virt-install \
  --import \               ## 기존 VM image 파일을 이용하겠다는 옵션
  --osinfo ubuntu24.04 \   ## 이 osinfo 옵션을 꼭 추가해야 한다.
  --name my-vm \
  --ram 4096 \
  --vcpus 2 \
  --disk /mnt/sda1/virtual_storage/waas.qcow2,size=100 \
  --graphics none \
  --network network=br-ex \
  --console pty,target.type=virtio \
  --autoconsole text

  
  
##
## CPU Pinning, Hugepages 설정이 필요해서 사용했던 명령.
##

$ virt-install --import \
  --name my-machine \
  --vcpus 4 \
## CPU Pinning  
  --cpuset=2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32 \
  --memory=4096 \
## Hugepages  
  --memorybacking hugepages=on \
  --numatune 0 \
  --disk /mydir/my-machine.qcow2 \
  --network bridge=my-br \
  --network bridge=ems-br \
  --os-variant rhel7.9 \
  --noautoconsole
  
  
  ##
  ## 주의:
  ##  VM instance 내부에서 OS 설치가 끝나고, 자동 reboot되어야 하는게 정상이지만
  ##  가끔 OS termination 단계에서 실패하고 멈춘 경우가 있다.
  ##  reboot 시도 후 30초 후에도 console 화면의 변화가 없다면
  ##  과감하게 VM instance destroy를 시도한다.  (아래 명령을 사용)
  ##  
  $ virsh list --all
    Id   Name          State
   ----------------------------
    1    my-vm         running

  $ virsh destroy 1
   Domain '1' destroyed

 

위 `virt-install` 명령을 실행하면, 바로 아래 화면이 출력되고

이 화면에서 대략 55~60초 정도 기다려야 다음 설치 화면으로 넘어간다.

 

 

위 화면에서 대략 55~60초 정도 기다리면, 드디어 아래와 같이 OS 설치 시작 화면이 나온다.

 

 

비록 Text Terminal 이지만, 조금이라도 예쁜 설치 화면을 원하면 "rich mode"를 선택한다.

이후부터는 일반적인 Ubuntu OS 설치 절차와 같다.

 

 

 

 

 

 

Virtual Machine 목록 보기

$  virsh list --all
 Id   Name     State
-------------------------
 1    x-node   running
 -    am0      shut off
 -    aw0      shut off
 -    aw1      shut off
 $

 

 

Virtual Machine 기동하기

##
## am0 가상 머신을 기동하기
##

$  virsh start am0
Domain am0 started


##
## am0 가상 머신이 기동되었는지 확인하기
##

$  virsh list --all
 Id   Name     State
-------------------------
 1    x-node   running
 2    am0      running
 -    aw0      shut off
 -    aw1      shut off
$

 

 

Virtual Machine 종료하기

##
## Graceful Termination of VM instance
## (참고로, 아래 숫자 2는 VM의 ID이다)
##

$  virsh shutdown 2
Domain 2 is being shutdown

$


##
## VM instance 강제 종료
## (참고로, 아래 숫자 2는 VM의 ID이다)
##

$ virsh destroy 2


##
## VM instance 삭제하기
##
$ virsh undefine vm-name

 

 

Virtual Machine의  Console에 접속하기

$  virsh console x-node
Connected to domain x-node
Escape character is ^]

CentOS Linux 8
x-node login: root
Password: ......

[root@x-node ~]# _

 

 

qcow2 image file size 조정 (resize)

##
## 원하는 size로 vm image를 재조정할 수 있다.
## 최초에 작게 만들어진 volume image 용량을 더 크게 늘리기 위해서 사용한다.
##

$ qemu-img  resize  myvm.qcow2  100G


##
##  아래 명령과 같이 수행하여 기존 VM image에서 빈 공간을 제거하고 size를 줄일 수 있다.
##  보통 qcow2 파일을 다른 장비로 옮길 때, vm image size를 줄이기 위한 용도로 사용된다.
##  참고: 원본 qcow2 이미지 파일은 유지되므로 별도로 백업하지 않아도 된다.
 
$  qemu-img convert -O qcow2 source_image.qcow2 shrunk_image.qcow2


##
## volume image 정보를 열람한다.
##

$ qemu-img  info    myvm.qcow2

 

 

qcow2 image 파일 생성하기

##
## 만약 qcow2 type의 virtual volume을 만들고 싶다면 아래와 같이 명령을 수행.
## Volume size는 250GB로 지정했지만, 실제로는 qcow2 파일에 meta data만 생성하기 때문에
## 실제 사이즈는 1MB 밖에 안 되고, 시간도 3초 정도 밖에 안 걸린다.
##

$  qemu-img  create  -f qcow2  my-virtual-volume.qcow2  250G

 

 

물리 Disk를 가상 Disk로 Import하기 (또는 백업하기)

##
## 아래 명령은 물리 저장 장치(HDD)를 외장 USB에 연결한 것을 가정하고 실행한 예시이다. 
##

$ qemu-img convert -f raw -O qcow2 /dev/sdb /opt/vm/my_hdd.qcow2

 

 

 

 

 

 

VM의 OS Type 전체 목록 열람하기

$  virt-install --osinfo list
...
ubuntu-lts-latest, ubuntu-stable-latest, ubuntu22.04, ubuntujammy
ubuntu21.10, ubuntuimpish
ubuntu21.04, ubuntuhirsute
ubuntu20.10, ubuntugroovy
ubuntu20.04, ubuntufocal
...
$

 

 

기존 VM instance에 disk 추가하기

$ virsh edit my-vm

... 중간 생략 ...

  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' discard='unmap'/>
      <source file='/var/lib/libvirt/images/my-vm-a.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </disk>
    ##
    ## FIXME: 이 부분을 추가한다.
    ##
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/opt/virtual_storage/vol_01.qcow2'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x09' slot='0x00' function='0x0'/>
    </disk>
    
... 중간 생략 ...

$ virsh reboot my-vm

## 또는 아래와 같이 hypervisor를 restart한다.

$ systemctl restart libvirt-bin

 

위 방식과 다르게 virt-install 명령으로 disk를 추가하여 VM instance를 재시작한다.

virt-install \
  --import \
  --name my-vm \
  --osinfo ubuntu22.04 \
  --ram 2048 \
  --vcpus 2 \
  --disk  /opt/virtual_machine/my-vm.qcow2 \
  --disk  /opt/virtual_machine/my-new-disk.qcow2 \
  --graphics none \
  --network network=br-ex \
  --console pty,target.type=virtio \
  --autoconsole text

 

 

VM의 CPU에 Host의 CPU를 Pinning

## CPU pinning 설정하는 명령어
virsh vcpupin <vm-name> <vcpu-number> <host-core-number>
## CPU pinning 설정하기
##  - "VM CPU core id 0"은 "Host CPU core id 12"를 사용하도록 고정
##  - "VM CPU core id 1"은 "Host CPU core id 13"를 사용하도록 고정
## 위 내용을 실제로 설정하려면, 아래와 같이 명령을 실행하면 된다.
$ virsh vcpupin myvm 0 12
$ virsh vcpupin myvm 1 13


## CPU pinning 상태 확인하기
$ virsh vcpupin myvm
 VCPU   CPU Affinity
----------------------
 0      12
 1      13

 

 

반응형

 

작성일: 2024년 4월 9일

 

Amazon AWS, Microsoft Azure, Google GCP, Oracle Cloud Infra 등 CSP에서 Compute resource를 생성하려고 보면,

이 Compute instance(또는 VM instance)를 생성한 것 때문에 비용이 얼마나 되는지 감을 잡기가 어렵다.

 

마침, Oracle Cloud의 연간 Credit 구입한 것이 많이 남아 있고, 5일 후에 Expire되기 때문에 남는 Credit을 소진해볼겸

VM instnace를 Scale-up, Scale-down하면서 비용 증가/감소 정도를 체크해봤다.

 

1개 VM instance를 대상으로 CPU/Memory Scale-up 수행 후 비용 증감을 체크

초기 VM instance의 Spec Scale-up 이후의 Spec 비용 증가분(Delta)
CPU: 1 core (2 thread)
MEM: 2GB
Storage: 50 GB (Boot volume)
CPU: 8 core (16 thread)
MEM: 128 GB
Storage: 50 GB (Boot volume)
11,479 원   (Daily Cost)

 

참고:
  CPU 종류: AMD EPYC 7J13
  CPU Caches: 
      L1d:  512 KiB (8 instances)
      L1i:   512 KiB (8 instances)
      L2:   4 MiB (8 instances)
      L3:   32 MiB (2 instances)

 

 

 

위에 내가 실제로 VM instance를 Scale-up한 이후의 비용 증가분을 계산한 것은
클라우드 테넌트 계약 조건과 현재 원/달러 환율 따라 30% 정도 차이가 날 것이다.
특히 클라우드 테넌트 계약시, 3년 이상 장기 계약한 경우 많은 할인율이 적용되서  Scale-up에 대한 증가분이 크지 않을 수 있다.
1년 단위로 단기 계약한 테넌트라면, CPU/Memory를 Scale-up할 때 비용 증가분이 위의 계산 결과보다 클 수 있다.

 

 

반응형
작성일: 2024년 4월 9일

 

Microsoft Azure, AWS(Amazon), GCP(Google Cloud Platform), Oracle Cloud Infra 등 Cloud Infra 서비스를 사용하다보면

예상한 것보다 비용이 더 지출되는 경우가 있다.

내 경우, Cloud Infra를 1년간 사용하는 중에 Storage(Block Volume)과 VCN(Virtual Cloud Network) 리소스 사용 비용이 계속 증가만 하길래 이 비용 증가 원인을 찾는 작업을 했다.

 


 

나는 회사 업무 때문에 CSP(Cloud Service Provider)가 제공하는 Managed Kubernetes를 종종 이용하는데, 

이 Managed Kubernetes의 cluster를 생성하고 삭제하는 과정에서 찌꺼기 리소스가 계속 발생하고 있었다.

찌꺼기 리소스가 발생하게 된 이유에 대해 좀더 자세히 설명하면 아래와 같다.

 

  1. Managed Kubernetes 서비스를 이용하여 Cluster-A를 생성한다.
  2. Cluster-A에 Pod, LoadBalancer Type의 Service 리소스 등을 생성한다.
  3. 몇달 동안 사용 후 Cluster-A를 삭제한다.    <-- 이 순간부터 찌꺼기 리소스에 대한 과금이 시작된다 (일명, 숨겨진 비용 발생)

 

위와 같은 순서로 Managed Kubernetes Cluster를 사용하면,

Pod가 사용했던 Storage(즉, PV)와 Public IP Address를 사용했던 LoadBalancer 리소스가 찌꺼기로 남게 된다.

즉, 실제로는 K8s Cluster가 없지만 Storage와 Public IP address는 내 테넌트 내의 자원으로 할당된 상태로 남게 된다.

이 찌꺼기 자원이 계속 비용을 유발하므로, 발견한 즉시 삭제해야 한다.

내 경우, 1년 동안 사용하면서 Pod, PVC, PV, Service Resoruce(LB Type) 등을 먼저 삭제하지 않은 상태에서

K8s cluster를 삭제한 경우가 2번 있었는데... 이것들을 정리하고 나니까 Cloud 사용 요금이 50% 수준으로 떨어졌다. ㅠㅠ

그 동안 쓰지 않아도 될 돈을 지출하고 있었던 것이다.

 

Cloud 서비스를 사용할 때는 Kubernetes cluster를 삭제하는 순서에 대해서 꼭 주의하자!

 

  1. Kubernetes cluster 내부에서 사용했던 Pod, PVC, PV, Service Resoruce를 모두 삭제한다.
  2. PV, Service Resource가 삭제되었는지 여부를 반드시 확인한 후,
  3. Kubernetes cluster를 삭제한다.

 


 

+ Recent posts