引言
在服务器运维中,当系统宕机、无法启动或网络中断时,串口控制台往往是诊断和恢复的核心途径。传统方式依赖专用客户端软件,部署复杂、跨平台不便,尤其在紧急场景下效率低下。 为此,南京百敖团队基于 openUBMC架构,实现了 Serial Over LAN(SOL)功能的 Web 化迁移:用户无需安装任何软件,直接在浏览器中访问服务器串口控制台。 如下图,在浏览器访问BMC串行接口及系统串行接口:


本文分享这一功能的完整技术实践,包括架构设计、关键挑战及解决方案,以及在百敖 openUBMC 商业版中的集成经验。
架构设计:分层构建可靠的 Web SOL 系统
在实现浏览器化串口管理的过程中,我们面临多项嵌入式 Web 系统常见的难题。这些挑战直接指导了架构选型,最终形成清晰的三层设计:前端界面层、网关层与后端服务层。这种分层不仅实现了功能,还确保了兼容性、安全性和性能。

1. 前端界面层:利用Vue框架集成xterm.js
初期尝试直接将串口原始数据输出到 HTML 时,遇到了严重渲染异常——字符错乱、ANSI/VT 控制序列(如光标定位、清屏)无法解析,导致显示与物理终端完全不一致。这直接暴露了普通 Web 元素处理复杂终端序列的局限性。
因此,我们选用 Vue.js 构建单页应用,并集成 xterm.js 作为终端仿真核心。xterm.js 能准确解析并渲染控制序列,支持色彩、滚动等完整特性。同时,通过 WebSocket 实现实时双向通信,并添加自动重连机制,确保连接稳定性。
2. 网关层:安全与协议兼容的必然选择
Web SOL 需要在浏览器与后端间建立持久双向通道,同时必须应对嵌入式环境的资源限制和安全需求。我们早期在 WebSocket 处理上遇到兼容性问题,因此需要更好的解决方案。
openUBMC中集成了Nginx,因此它成为理想选择:它高效处理 TLS 1.2/1.3 加密传输、WebSocket 协议升级与代理转发。同时,集成 JWT 身份验证、IP 访问控制及严格 CSP 策略,提供统一的安全入口和流量分发能力,避免直接暴露后端服务。
3. 后端服务层:高并发与底层操作的权衡
后端的核心难点在于高效管理多个 WebSocket 会话,同时精准操作底层 TTY 设备。 Lua WebSocket库在Skynet协程环境下会出现阻塞异常,而串口配置中还遇到回声干扰(如“阶梯式换行”)和硬件端口识别问题。
为此,我们优化了WebSocket的实现,并兼容了Skynet的协程框架,重构事件处理逻辑,最大化地复用了Skynet高并发能力来管理多个WebSocket对话。
串口通信模块则通过 C 扩展实现:使用 cfmakeraw() 将 TTY 设为 raw 模式,禁用内核级处理(如回车转换),采用读写分离架构避免数据回显干扰。同时通过对接openUBMC的SerialManagement 服务,支持了BMC与服务器OS的串口切换能力,让Web SOL的能力进一步增强。
通过层层攻克上述挑战,这套三层架构最终在 openUBMC 上完美落地了 Web SOL 系统,实现了高效、可靠且安全的浏览器化串口管理。
产品化集成:落地百敖 openUBMC 商业版
功能开发完成后,我们将其模块化封装:前端资源、Nginx 配置、后端服务通过openUBMC的Conan体系构建和管理。最终结合百敖自研的其他能力(实时监控界面、灵活的传感器告警策略等),基于openUBMC 25.06 社区发行版推出了百敖的openUBMC商业发行版。


总结与展望
本次 Web SOL 的成功实践,充分验证了 openUBMC 架构的灵活性和扩展性:其基于 Skynet、D-Bus、Lua/C 混合开发以及模块化构建体系,能够高效支持各类新型运维特性的快速集成与落地,为服务器远程管理提供了广阔的创新空间。
同时,这次从底层 TTY 操作到 Web 前端的完整开发过程,也标志着百敖团队已具备深厚的 openUBMC 技术积累,能够为客户提供从功能定制、性能优化到安全加固的全栈开发服务,满足多样化的国产化服务器管理需求。
未来,我们将继续基于 openUBMC 平台迭代更多实用特性。我们相信,通过持续的技术迭代与生态建设,百敖openUBMC将为服务器远程管理提供更加强大、便捷且安全的解决方案,助力企业数据中心实现更高水平的运维自动化与智能化。
【版权声明】Copyright © 2026 openUBMC Community。本文由openUBMC社区首发,欢迎遵照CC-BY-SA 4.0协议规定转载。转载时敬请在正文注明并保留原文链接和作者信息。
【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。
