LabHub
学习 学习路径 课程

虚拟化与 QEMU/KVM

用 QEMU 把虚拟机跑起来

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

목표

준비된 디스크 이미지로 QEMU VM 을 실제로 띄우고, 시리얼 로그 · 모니터 소켓 · hostfwd 리슨 소켓 세 가지로 살아 있음을 증명합니다.

왜 중요한가

실무에서는 libvirt 나 클라우드 콘솔을 쓰지만, 문제가 생기면 결국 그 아래의 QEMU 커맨드라인을 읽어야 합니다. -netdev(호스트 쪽 백엔드)와 -device(게스트가 보는 NIC)가 왜 분리돼 있는지, format= 을 왜 명시해야 하는지, hostfwd 리슨 소켓이 게스트 부팅과 무관하게 즉시 열리는 이유가 무엇인지 — 이런 것들은 커맨드라인을 직접 써 봐야 몸에 붙습니다.

이 실습은 가상머신 안에서 돌고, 그 안에서 또 가상머신을 띄웁니다. 중첩 가상화가 켜져 있어서 /dev/kvm 이 있고, QEMU 가 하드웨어 가속을 그대로 씁니다.\n\n예전에는 파드에서 돌아 /dev/kvm 이 없었고, QEMU 가 명령어를 하나씩 번역하는 TCG 소프트웨어 에뮬레이션으로만 돌았습니다. 게스트가 로그인 프롬프트까지 오는 데 몇 분이 걸려서, 실습이 "펌웨어가 떴는가" 까지만 볼 수밖에 없었습니다.\n\n가속기는 있는 것을 골라 쓰세요. -accel kvm-accel tcg 는 수십 배 차이가 납니다. 실무에서도 순서가 같습니다 — 먼저 /dev/kvm 이 있는지 보고, 있으면 그것을 씁니다. 채점기도 이 상자에 무엇이 있는지 보고 그에 맞게 판정합니다.

단계

  1. /root/vmboot 디렉터리를 만들고, /opt/vm/ 아래에 제공된 디스크 이미지의 qemu-img info 출력을 /root/vmboot/base-info.txt 로 저장하세요.
  2. 그 이미지를 백킹으로 하는 오버레이 /root/vmboot/vm.qcow2 를 만드세요. 원본은 변하면 안 됩니다.
  3. /root/vmboot/run.sh 를 작성하세요. 다음 요소가 모두 들어가야 합니다.
    • qemu-system-x86_64
    • -accel tcg
    • -m 512
    • -smp 1
    • -drive file=/root/vmboot/vm.qcow2,if=virtio,format=qcow2
    • -netdev user,id=n0,hostfwd=tcp::12222-:22
    • -device virtio-net-pci,netdev=n0
    • -nographic
    • -serial file:/root/vmboot/console.log
    • -monitor unix:/root/vmboot/mon.sock,server,nowait
  4. 사용 가능한 가속기 목록과 /dev/kvm 존재 여부를 /root/vmboot/accel.txt 에 다음 두 줄로 적으세요. ACCELS=<쉼표로 구분한 가속기 목록> / DEVKVM=<yes|no>
  5. run.sh 를 백그라운드로 실행하고 20초 이상 기다린 뒤, /root/vmboot/console.log 에 펌웨어 메시지가 남았는지 확인하세요. 로그에 SeaBIOS 또는 Booting 문자열이 있어야 합니다.
  6. 모니터 소켓에 info status 를 보내 응답을 /root/vmboot/monitor.txt 로 저장하세요. 응답에 running 또는 paused 가 보여야 합니다.
  7. 12222 포트가 리슨 중인지 확인해 /root/vmboot/hostfwd.txt 로 저장하세요. 프로세스가 qemu 로 보여야 합니다.
  8. /root/vmboot/report.txt 를 다음 5줄로 만드세요. ACCEL=tcg / MEM=512 / VCPU=1 / FWD_PORT=12222 / DISK_IF=virtio

참고

제공된 이미지 확인

/root/vmboot 디렉터리를 만들고, /opt/vm/ 아래에 제공된 디스크 이미지의 qemu-img info 출력을 /root/vmboot/base-info.txt 로 저장하세요.

/opt/vm 아래에 준비된 이미지가 있습니다. 포맷과 가상 크기를 먼저 확인하세요.

오버레이로 원본 보호

그 이미지를 백킹으로 하는 오버레이 /root/vmboot/vm.qcow2 를 만드세요. 원본은 변하면 안 됩니다.

원본을 백킹으로 삼는 오버레이를 만들면 원본이 변하지 않습니다. 백킹 포맷 명시를 잊지 마세요.

실행 스크립트 작성

/root/vmboot/run.sh 를 작성하세요. 다음 요소가 모두 들어가야 합니다.

필요한 플래그가 정해져 있습니다. 하나라도 빠지면 채점에서 걸립니다. 백그라운드 실행은 스크립트 밖에서 하세요.

가속기 확인

사용 가능한 가속기 목록과 /dev/kvm 존재 여부를 /root/vmboot/accel.txt 에 다음 두 줄로 적으세요. ACCELS=<쉼표로 구분한 가속기 목록> / DEVKVM=<yes|no>

qemu-system-x86_64 에는 쓸 수 있는 가속기를 나열하는 도움말이 있습니다. /dev/kvm 존재 여부도 함께 기록하세요.

실제로 띄우고 콘솔 로그 남기기

run.sh 를 백그라운드로 실행하고 20초 이상 기다린 뒤, /root/vmboot/console.log 에 펌웨어 메시지가 남았는지 확인하세요. 로그에 SeaBIOS 또는 Booting 문자열이 있어야 합니다.

시리얼 출력을 파일로 보내는 옵션이 있습니다. 펌웨어 메시지는 시작 직후에 나오므로 오래 기다릴 필요는 없습니다.

모니터 소켓에 질의

모니터 소켓에 info status 를 보내 응답을 /root/vmboot/monitor.txt 로 저장하세요. 응답에 running 또는 paused 가 보여야 합니다.

모니터를 유닉스 소켓으로 열고 nc 의 -U 로 붙습니다. 명령을 표준 입력으로 흘려 넣으면 됩니다.

포트 포워딩 확인

12222 포트가 리슨 중인지 확인해 /root/vmboot/hostfwd.txt 로 저장하세요. 프로세스가 qemu 로 보여야 합니다.

hostfwd 의 리슨 소켓은 QEMU 가 시작하는 즉시 열립니다. 게스트 부팅과 무관합니다.

VM 실행 보고서

/root/vmboot/report.txt 를 다음 5줄로 만드세요. ACCEL=tcg / MEM=512 / VCPU=1 / FWD_PORT=12222 / DISK_IF=virtio

앞 단계에서 확인한 값들을 모으세요. 가속기와 포워딩 포트는 실제 값이어야 합니다.