개요

Qemu는 오픈소스기반의 Hardware Virtualization 가상머신이다. Qemu는 가상머신을 구현하기 위해서 많이 사용되며, 대표적인 ARM, X86과 같은 시스템을 포함하여 대다수의 머신을 가상화 할 수 있다.

  • Multiple host, Multiple target을 지원한다.
  • Full Virtualization, Process Virtualization을 지원한다.
  • KVM과 함꼐 사용하여 최대한의 성능을 끌어 낼 수 있다.
  • Just in time code compilation기법을 사용하여 Bochs와 비교하여 불 안정하지만 더욱 빠르다.
  • GDB기능을 제공한다.

사용법

qemu-system-i386                                 \
  -accel tcg,thread=single                       \
  -cpu core2duo                                  \
  -m 128                                         \
  -no-reboot                                     \
  -drive format=raw,media=cdrom,file=myos.iso    \
  -serial stdio                                  \
  -smp 1                                         \
  -usb                                           \
  -vga std

  • Accel: 가속화 기법
  • cpu: CPU모델명
  • M: 메모리 크기
  • drive: 어떤 드라이브를 사용할지 (device 로 디바이스를 정할 수도 있음)
  • smp: CPU코어 개수

우분투 실행 bash script

#/bin/bash

INSTALL_PATH=$PWD/"ubuntu-kvm"
UBUNTU_IMG_URL="https://releases.ubuntu.com/20.04.2/ubuntu-20.04.2-live-server-amd64.iso?_ga=2.267594445.2145028703.1615186104-1743255792.1615186104"
QEMU_ARGS="-enable-kvm -vnc localhost:1 -m 64G -smp 16 -drive format=raw,file=$INSTALL_PATH/disk.img,if=virtio,cache=none -drive format=raw,file=./disk.img,if=virtio,cache=none -net nic -net user,hostfwd=tcp::2222-:22"


mkdir -p $INSTALL_PATH

if ! test -f $INSTALL_PATH/"ubuntu.img"; then
    wget -O $INSTALL_PATH/ubuntu.img $UBUNTU_IMG_URL -P $INSTALL_PATH
fi;

if ! test -f $INSTALL_PATH/"disk.img"; then
    sudo apt install qemu-utils
    qemu-img create -f raw -o size=30G $INSTALL_PATH/disk.img
    QEMU_ARGS+=" -cdrom $INSTALL_PATH/ubuntu.img"
fi;

echo $QEMU_ARGS

qemu-system-x86_64 $QEMU_ARGS

캐쉬 모드

시스템 분석을 위해서 qemu가상머신을 돌리는 경우, cache모드에 의하여 가상머신의 I/O속도가 달라질 수 있다. 다음의 캐쉬 모드는 QEMU가 어떻게 physical disk와 연동되는지를 결정한다. Default는 writethrough를 사용하게 된다. RamDisk는 O_DIRECT모드를 허용하지 않음으로, 다음 중 O_DIRECT가 있는 경우는 사용할 수 없다.

  • cache=writethrough: O_DYNSC
  • cache=writeback: nor O_DYNSC nor O_DIRECT
  • cache=none: O_DIRECT
  • cache=unsafe: nor O_DYNSC nor O_DIRECT ignore flush
  • cache=directsync: both O_DYNSC, O_DIRECT

디버깅

  • -s -S: -s는 GDB에 Attach 함을 의미하고, -S는 GDB시작을 우선 halt함을 의미한다. 즉 -s -S는 GDB가 target remote localhost:1234와 같이 Attach되기 전까지 기다리라는 것을 의미한다.
  • -d: d option은 원래 GDB 디버깅 모드이지만, 이 모드에서 cpu_reset혹은 interrupt정보와 같은 커널의 활동내역을 얻을 수 있다.

보다 자세한 내용은 https://wiki.osdev.org/Qemu 참고.

Disk img 크기 조절

qemu-img 로 만든 디스크 이미지의 크기는 qemu-img resize로 재설정 가능하다.

qemu-img resize disk.img +20G (20G 사이즈 크기를 늘림)

이렇게 할경우 VM의 Raw parition size는 증가하지만, logical size는 그대로이다. 이를 해결하기 위해서 fdisk나 resize2fs를 통해서 파티션의 크기를 조절해야 한다. 우선 fdisk를 통해서 파티션 크기를 조절한다.

fdisk /dev/vda

fdisk에서 d로 조절할 파티션 삭제후 a로 다시 만들고 w로 저장하고 나오면 전체 파티션의 크기가 증가했음을 볼 수 있다.

sudo resize2fs /dev/vda2 (파티션 이름)

그후 resize2fs를 통해서 마지막으로 파일시스템의 파티션 크기를 조절하면 된다.

참고

  1. https://documentation.suse.com/sles/11-SP4/html/SLES-kvm4zseries/cha-qemu-cachemodes.html
  2. https://wiki.osdev.org/Qemu