1. 정의
- QEMU는 다양한 CPU 구조와 시스템을 소프트웨어로 흉내 내는 오픈소스 가상화 도구
- 원래는 다른 종류의 CPU에서 만든 실행 파일을 실행하기 위해 개발
- 지금은 운영체제 부팅, 드라이버 개발, 보안 분석, 자동화 테스트 등에 널리 사용
- CLI 기반으로 동작하며, 스크립트 자동화에 적합
- 리눅스 환경에서 가장 강력하게 작동하며, 리눅스 개발자들이 많이 사용
- KVM, VirtIO, 가상 네트워크 등 고급 기능도 리눅스에서 잘 지원됨
- Windows나 macOS에서도 실행 가능하지만 일부 기능은 제한될 수 있음
- 커널, 부트로더, 루트 파일시스템을 가상으로 테스트하기에 유용
2. 동작 방식과 기술 기반
2-1. 운영 모드
모드
|
설명
|
예시
|
Full System Emulation
|
전체 가상 보드/시스템 에뮬레이션
|
ARM 리눅스 실행
|
User-mode Emulation
|
특정 유저모드 바이너리만 실행
|
ARM ELF 바이너리 실행
|
KVM 가상화 지원
|
x86 등의 경우 KVM 통해 하드웨어 가상화 사용 가능
|
빠른 리눅스 VM 실행
|
2-2. 핵심 기술
- TCG (Tiny Code Generator) : CPU 명령어 실시간 변환 (JIT 기반)
- Device Model : 가상 디스크, 네트워크, USB 등 구현
- KVM 연동 : 하드웨어 지원 시 성능 ↑
- GDB stub : 원격 디버깅 가능
3. 구성 구조 (개념도)
+--------------------------------+
| Host Linux/Windows |
| |
| +--------------------------+ |
| | QEMU Core | |
| |---------------------------| |
| | CPU Emulator (TCG)| |
| | Memory Emulator | |
| | Device Model | |
| +--------------------------+ |
| | |
| (옵션) KVM |
+--------------------------------+
4. 실제 사용 목적
목적
|
설명
|
OS 포팅 및 디버깅
|
라즈베리파이 없이도 커널 부팅 테스트
|
CI 자동화 테스트
|
QEMU로 리눅스 부팅/실행 확인
|
악성코드 분석
|
가상 환경에서 의심 바이너리 실행
|
보드 시뮬레이션
|
실제 보드가 없는 초기 개발 단계
|
고전 시스템 복원
|
레거시 OS (예: Win98, DOS 등) 실행
|
5. 사용하는 방식 (예시 포함)
# 예시: ARM 보드 시뮬레이션
qemu-system-arm -M virt -cpu cortex-a15 \
-kernel zImage \
-append "console=ttyAMA0 root=/dev/vda" \
-drive file=rootfs.ext4,format=raw,if=virtio \
-nographic
- -M: 머신 타입 (virt, raspi2, vexpress-a9 등 다양)
- -cpu: CPU 모델
- -kernel: 커널 이미지 직접 지정
- -drive: 디스크 이미지 연결
- -nographic: 그래픽 창 없이 콘솔만 사용
6. 사용되는 프로젝트 규모
규모
|
예시
|
개인 개발
|
커널 포팅, 임베디드 테스트
|
중소기업
|
IoT 디바이스 펌웨어 테스트
|
대기업/클라우드
|
OpenStack, Android Emulator, CI/CD 환경
|
리눅스 배포판
|
Debian, Ubuntu, Fedora의 테스트 환경에서 사용
|
7. 사용 시나리오
7-1. 커널 및 OS 부팅 테스트
- 목적: 임베디드 리눅스, Android, RTOS 등 운영체제 부팅 확인
- 예시:
- ARM64 커널 + rootfs 부팅 (-M virt)
- U-Boot → 커널 → 루트FS 전체 부팅 순서 확인
- 활용:
- 보드 없이도 OS 포팅 가능
- Init 과정/부팅 속도/로그 분석
7-2. 디바이스 드라이버 및 시스템콜 테스트
- 목적: 커널 드라이버 또는 HAL 계층 개발 전 테스트
- 예시:
- VirtIO 기반 블럭/네트워크 디바이스 확인
- 시리얼 포트, RTC, USB 에뮬레이션 테스트
- 한계:
- GPIO, SPI, I2C 등 실제 하드웨어 연결은 불가
7-3. 펌웨어 / 부트로더 개발 & 검증
- 목적: U-Boot, UEFI 등 부트코드 실험
- 예시:
- qemu-system-aarch64 -bios QEMU_EFI.fd → EFI 테스트
- U-Boot 명령어, 환경 변수, 로딩 동작 확인
7-4. 커널 디버깅 / 크래시 분석
- 목적: GDB 연동으로 실시간 문제 파악
- 예시:
qemu-system-aarch64 ... -S -gdb tcp::1234
→ GDB 접속 후 커널 panic, early boot crash 원인 추적
- 활용:
- 초기에 죽는 커널 디버깅
- Task 전환, 인터럽트 흐름 확인
7-5. 사용자 공간 프로그램 실행 (User-mode Emulation)
- 목적: ARM, MIPS 등 외부 아키텍처용 바이너리 실행
- 예시:
qemu-aarch64 ./my_program
- 활용:
- 교차 컴파일된 앱 테스트
- 간단한 유틸리티 디버깅
7-6. 루트파일시스템/디스크 이미지 테스트
- 목적: ext4, squashfs 등 이미지 부트 검증
- 예시:
-drive file=rootfs.ext4,if=virtio
- 활용:
- Buildroot, Yocto 루트FS 구조 점검
- 자동 마운트, init 실행 체크
7-7. 보안 분석 / 악성코드 실행
- 목적: 격리된 환경에서 코드 실행 확인
- 예시:
- 의심 ELF 바이너리 실행
- GDB, strace와 연동한 syscall 추적
- 활용:
- 샌드박스 역할
- 리버스 엔지니어링 기초 환경
7-8. CI/CD 테스트 자동화
- 목적: 빌드 후 자동화된 부팅 테스트
- 예시:
- GitHub Actions에서 QEMU로 커널 부팅 성공 여부 체크
- 활용:
- 커널/루트FS 변경 후 안정성 검증
- 로그 비교로 리그레션 테스트 수행
7-9. 가상 네트워크 및 다중 VM 시뮬레이션
- 목적: 내부 통신, NAT, DHCP 등 테스트
- 예시:
QEMU VM 여러 개 실행 + 가상 네트워크 브리지 연결
- 활용:
IoT 게이트웨이 시뮬레이션
통신 모듈 테스트
8. 실무자라면 꼭 알아야 할 포인트
- QEMU는 정확한 하드웨어 시뮬레이션은 아님
- register-level 정확도 필요하면 QEMU 보드 구현을 수정하거나 Renode나 SystemC 사용 고려
- 디바이스 모델은 보드에 따라 제한됨
- 예: raspi3는 USB 모델이 미완성일 수 있음
- QEMU + GDB 디버깅 가능
qemu-system-arm ... -S -gdb tcp::1234
# 다른 터미널에서
arm-none-eabi-gdb vmlinux
(gdb) target remote :1234
- 에뮬레이션 속도는 느릴 수 있음
- 단순 테스트/디버깅용으로 적합, 퍼포먼스 테스트는 실제 보드 필요
'리눅스(Linux) > 기본 지식' 카테고리의 다른 글
MachineWare (0) | 2025.04.18 |
---|---|
리눅스(Linux) 기본 명령어(2) - cd (0) | 2025.03.18 |
리눅스(Linux) 기본 명령어(1) (0) | 2025.03.18 |
리눅스(Linux) 시스템 기본 구조 (0) | 2025.03.18 |