가상화와 QEMU/KVM · VM 생성과 부팅 · 실습
QEMU 로 VM 띄우기
목표
준비된 디스크 이미지로 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
참고
qemu-system-x86_64 -accel help로 가속기 목록을 봅니다.- 백그라운드 실행은
nohup bash /root/vmboot/run.sh >/root/vmboot/qemu.out 2>&1 &형태로 합니다. - 모니터 질의는
printf 'info status\n' | nc -U /root/vmboot/mon.sock입니다. 응답이 안 오면-q 1로 종료 시간을 주세요. - 흔한 실수 1:
run.sh안에서 QEMU 를 백그라운드로 보내면 채점 시 인자 파싱이 어려워집니다. 스크립트는 포그라운드로 실행하도록 쓰고, 백그라운드 처리는 실행할 때 하세요. - 흔한 실수 2: 오버레이 없이 원본을 직접 쓰면 다시 실습할 때 상태가 오염됩니다.
단계 8개
- 제공된 이미지 확인
- 오버레이로 원본 보호
- 실행 스크립트 작성
- 가속기 확인
- 실제로 띄우고 콘솔 로그 남기기
- 모니터 소켓에 질의
- 포트 포워딩 확인
- VM 실행 보고서