如何在Github Actions中正确向QEMU CLI传入参数?
问题分析与解决方案
核心问题
你拆分的三个GitHub Actions步骤是完全独立的shell会话:
- 第一个步骤启动QEMU后,进程会阻塞在QEMU的交互式终端,直到QEMU退出;
- 第二个步骤的
sleep 10是在主机的shell里执行,和QEMU进程无关; - 第三个步骤的
root、1234等命令,也是直接在主机shell里运行,根本没有发送到QEMU的控制台输入,自然无法完成登录。
解决方案
要向QEMU的交互式终端传入命令,必须在同一个进程会话里完成QEMU启动和命令输入,推荐用以下两种方式:
方式一:用expect脚本实现自动化交互(最可靠)
expect可以模拟交互式终端的输入输出,精准匹配登录提示符并发送命令。
修改后的GitHub Actions步骤:
- name: 启动QEMU并自动完成登录测试 run: | sudo --user user1 --shell << EOF # 先加载Yocto的bitbake环境(替换为你实际的环境脚本路径) source /path/to/oe-init-build-env your-build-dir # 编写expect自动化脚本 cat > qemu_auto_test.exp << 'END_SCRIPT' spawn runqemu nographic slirp qemuarm64 # 等待登录提示符出现 expect "login:" # 输入用户名root send "root\r" # 等待密码提示符 expect "Password:" # 输入密码1234 send "1234\r" # 等待命令行提示符(#) expect "#" # 执行测试命令 send "echo \"已进入QEMU系统\"\r" # 关闭QEMU send "poweroff\r" # 等待进程结束 expect eof END_SCRIPT # 执行expect脚本 expect qemu_auto_test.exp EOF
方式二:用管道+延迟传递命令(简单但不稳定)
如果你的环境没有expect,可以通过管道把命令序列传给QEMU,靠sleep等待提示符出现(但依赖启动速度,可能需要调整延迟时间):
- name: 启动QEMU并通过管道传入命令 run: | sudo --user user1 --shell << EOF source /path/to/oe-init-build-env your-build-dir # 按顺序发送命令,每个命令前加延迟确保QEMU已准备好 ( sleep 15; # 等待QEMU启动到登录界面 echo "root"; sleep 3; # 等待密码提示符 echo "1234"; sleep 2; echo "echo \"In qemu\""; sleep 2; echo "poweroff" ) | runqemu nographic slirp qemuarm64 EOF
额外注意事项
- 必须确保在启动
runqemu前加载了Yocto的环境变量(source oe-init-build-env),否则runqemu无法找到镜像文件; - GitHub Actions虚拟机资源有限,QEMU启动可能比本地慢,需要适当延长sleep的等待时间;
- 确认Yocto镜像的实际配置:有些镜像可能默认禁用root登录、不需要密码,或者用户名不是root,提前检查镜像的
/etc/passwd和/etc/shadow配置。
内容的提问来源于stack exchange,提问作者Matthew Putra
相关产品推荐
相关产品推荐

