리눅스(Linux)/기본 지식

QEMU(Quick Emulator)

engineer4ever 2025. 4. 18. 20:29

 

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 보드 구현을 수정하거나 RenodeSystemC 사용 고려

 

  • 디바이스 모델은 보드에 따라 제한됨

- 예: 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