Linux启动无串口输出的调试排查记录
1. 问题起因
- 在 VirtualBox 虚拟机中启动 ONIE 镜像,串口终端(如 PuTTY)没有任何输出,而同样设置下 Ubuntu 能正常通过串口输出。
- 期望在串口终端看到 ONIE 的 GRUB 菜单、内核日志或 shell,但实际完全无输出。
2. 初步排查
- 确认 VirtualBox 虚拟串口配置(COM1/0x3F8/115200/主机管道)与 Ubuntu 虚拟机一致。
- 检查 ONIE 镜像的 GRUB 配置,已包含如下内容:
serial --port=0x3f8 --speed=115200 terminal_input serial terminal_output serial CONSOLE_CMDLINE_LINUX="console=tty0 console=ttyS0,115200"
- GRUB 菜单和 echo 信息能在串口终端看到,但内核启动后无输出。
3. 进一步调试
- 尝试修改内核参数为
console=ttyS0,115200
,依然无输出。 - 检查内核编译配置,确认已启用
CONFIG_SERIAL_8250
和CONFIG_SERIAL_8250_CONSOLE
。 - 尝试添加
earlyprintk=serial,ttyS0,115200
和earlycon=uart,io,0x3f8,115200
,依然无 early boot 输出。
4. 决定在汇编入口加串口打印
- 为排查内核是否真正被加载,在
arch/x86/boot/compressed/head_64.S
的 early boot 阶段插入 outb 打印:mov $0x43, %al # 'C' mov $0x3f8, %dx out %al, %dx ... call verify_cpu testl %eax, %eax jnz .Lno_longmode mov $0x44, %al # 'D' mov $0x3f8, %dx out %al, %dx
- 结果:串口能打印 ‘C’,但没有 ‘D’。
5. 定位到 long mode 检查失败
- 结合代码逻辑,
verify_cpu
检查 CPU 是否支持 64 位 long mode。 - 如果不支持,流程会跳转到
.Lno_longmode
死循环,导致后续代码无法执行,也不会有任何输出。 - 由此推断:虚拟机当前未启用 64 位支持或硬件虚拟化,导致 long mode 检查失败,内核无法启动。
6. 虚拟机设置检查
- 检查 VirtualBox 设置,发现操作系统类型未选 64 位。
7. 实际解决办法与经验总结
- 实际原因:VirtualBox 虚拟机未勾选 64 位操作系统类型,导致 ONIE 镜像无法识别为 64 位环境,early boot 阶段卡在 long mode 检查。Ubuntu 这类主流发行版镜像能自动适配为 64 位启动,但 ONIE 这类定制镜像无法自动识别,必须手动设置虚拟机为 64 位。
- 解决办法:
- 关闭虚拟机。
- 打开 VirtualBox 虚拟机设置 → 常规 → 基本,将操作系统类型设置为 64 位(如"Ubuntu (64-bit)“或"Other Linux (64-bit)”)。
- 保存设置并重新启动虚拟机。
- 此时 ONIE 镜像即可正常通过 long mode 检查,串口输出恢复正常。