In the world of embedded systems, OS development, and firmware engineering, the ability to test boot processes without physical hardware is not a luxury—it’s a necessity. Enter QEMU Boot Tester 4.0, the latest evolution of the open-source testing framework designed to automate boot testing across multiple architectures using the Quick Emulator (QEMU).
Whether you are validating a custom Linux kernel, a U-Boot firmware, a BIOS update, or a full OS image, version 4.0 introduces powerful features to streamline regression testing, CI/CD integration, and hardware-independent validation.
Define boot tests in human-readable configuration files. No more brittle shell scripts. qemu boot tester 4.0
# test_suite.yaml
name: "Linux Boot Test"
target:
arch: arm64
machine: virt
cpu: cortex-a72
memory: 2G
boot:
kernel: "Image.gz"
initrd: "initramfs.cpio"
cmdline: "console=ttyAMA0 root=/dev/ram0"
expect:
success_string: "Login:"
timeout_seconds: 30
fail_strings:
- "Kernel panic"
- "Oops"
artifacts:
- console.log
- boot_time.json
Automate boot testing across git bisect runs. Find exactly which commit introduced a boot hang.
Boot an ISO, script the installation via serial console, reboot into the installed system, and verify functionality. In the world of embedded systems, OS development,
QBT 4.0 stores results in logs/ organized by date and run ID.
Directory Structure:
logs/
└── 2023-10-27/
└── run-a1b2c3d4/
├── result.json # Pass/Fail status and duration
├── serial_log.txt # Raw serial console output
└── screenshot.ppm # Screenshot (if enabled on fail)
Reading result.json:
"status": "PASS",
"duration_seconds": 42.5,
"exit_code": 0,
"profile": "ubuntu-server",
"target": "ubuntu-24.04.iso",
"matched_line": "[ 42.500000] systemd[1]: Started User Login Management."
CI/CD Integration: You can parse the output directly in a CI pipeline script: Automate boot testing across git bisect runs
# Example GitLab CI snippet
script:
- ./qbt-exec --target image.iso --output json > result.json
- if [ $(jq -r '.status' result.json) == "PASS" ]; then exit 0; else exit 1; fi
name: Virtio-blk regression check
version: "4.0"
targets:
- arch: aarch64
machine: virt
cpu: cortex-a76
memory: 4G
boot_sequence:
- wait_for: "Booting Linux on physical CPU"
timeout: 10
- wait_for: "Virtio block device registered"
timeout: 30
- wait_for: "Starting systemd-udevd"
timeout: 60
failure_patterns:
- "Kernel panic - not syncing"
- "Unable to handle kernel NULL pointer dereference"
- "systemd[1]: Failed to start"
success_pattern: "Login prompt|Welcome to Ubuntu"
| Tool | Scope | Architecture Support | Parallel | Snapshot | Netboot |
|------|-------|----------------------|----------|----------|---------|
| QEMU Boot Tester 4.0 | Boot-focused | 15+ | ✅ | ✅ | ✅ |
| avocado + avocado-vt | Full system test | 8 | ✅ | ❌ | Limited |
| Linaro LAVA | Lab automation | Many | ❌ | ❌ | ✅ |
| Manual QEMU scripts | Ad-hoc | All | ❌ | ❌ | ❌ |
Even with version 4.0, boot testing is complex. Here is expert advice: