半夜两点被电话叫醒,机房一台服务器死活起不来,现场又没有接显示器,远程IDRAC/ILO能通,但操作系统已经崩到连SSH都进不去,网络栈完全没起来,你连个串口控制台都够不着——这种时候,IPMI的SOL就是最后一根救命稻草。
SOL,全称Serial Over LAN,直译过来就是“局域网上的串口”。它把传统意义上只能本地连的串口终端,通过BMC重定向到网络里,运维拿SSH客户端就能进BIOS、看POST、操作GRUB,甚至在内核panic之后照样敲命令。这篇文章就把SOL的完整链路拆开讲清楚,从UART硬件协议到BMC的SOL引擎,再到ipmitool和SSH客户端的实操配置,看完你能独立搭一套可用的远程串口环境,也知道出了问题该从哪里查起。
1. 内容整体设计与思路拆解
1.1 SOL在IPMI体系里的位置
IPMI(Intelligent Platform Management Interface)是一套独立于操作系统、独立于CPU甚至独立于整机电源状态的硬件管理接口规范。它的核心是BMC(Baseboard Management Controller),一颗常年带电的小型ARM芯片,挂在主板的低功耗待机电路上,只要服务器插着电源线,BMC就在工作。
BMC能做的事情很多:传感器监控(温度、电压、风扇转速)、日志记录(System Event Log)、远程电源控制(开机、关机、重启)、用户认证与权限管理。而SOL是IPMI 2.0规范里定义的一个关键通道能力,它把主板上那个传统串口控制器输出的字节流截获下来,经过BMC封装成IPMI SOL消息包,再从BMC的网口发送到管理网络上去。
理解这个架构,最关键的一点是:SOL不是把串口线接到了网上,而是把串口数据“包了一层IP的壳”。对远端运维来说,你感觉自己在连一条串口线,实际上你的键盘输入是SSH报文,被BMC拆开后转成UART字节送到主板的串口控制器,再把串口控制器输出的字节原路打包送回来。
1.2 为什么需要SOL:一次真实故障的复盘
我之前维护一批双路至强服务器,有次机房制冷故障,温度过高导致系统自动关机。重启之后,系统起来一半就卡住了——GRUB能出,但内核在挂载根文件系统时因为磁盘阵列卡固件异常而反复失败。
这种情况很尴尬:SSH不可用(内核没完全启动),IDRAC网页端能打开(BMC独立供电),但网页端的虚拟控制台需要装Java Web Start插件,浏览器版本一换就各种报错。最后是靠SOL进到GRUB界面,手动改了内核启动参数,绕过坏掉的RAID卷才把系统拉起来。
SOL的价值就在这里:它不依赖操作系统的网络栈,不依赖显卡和显示输出,只要BMC活着、管理口能通,你就能拿到一个最原始的字符交互通道。这对于Linux运维、嵌入式开发、网络设备调试这些场景都是刚需。
1.3 SOL的典型适用人群
- 服务器运维工程师:需要远程处理系统无法启动、内核崩溃、BIOS设置修改等场景
- 硬件测试人员:调试U-Boot、UEFI固件,需要查看串口打印信息
- 网络设备管理员:交换机、防火墙的串口管理口集中管理
- 嵌入式开发者:目标板没有显示输出,只能通过串口交互
如果你只是需要一个“能远程看到桌面”的方案,SOL不适合你,那是虚拟控制台(Virtual Console)的范畴。SOL是纯字符界面的通道,它做的是最底层、最可靠的那一档事情。
2. 核心细节解析与实操要点
2.1 UART协议基础回顾
既然SOL的名字里带UART,那就必须先把UART这层搞清楚。UART(Universal Asynchronous Receiver/Transmitter)是一种异步串行通信协议,它不像I2C或SPI那样有独立的时钟线,收发双方各自用自己的时钟,靠约定好的波特率来对齐采样点。
常见的串口参数组合是“波特率-数据位-校验位-停止位”,比如115200 8N1,含义是波特率115200bps、8个数据位、无校验、1个停止位。除此之外还有7E1、9600 8N1等组合,老一些的网络设备和单片机系统里常能见到。
波特率是SOL配置里最需要上心的一个参数。主板的串口控制器输出数据的波特率必须和BMC侧SOL引擎配置的波特率一致,否则远端收到全乱码。很多第一次配置SOL的人都会踩这个坑:BIOS里串口重定向设置的是115200,BMC里SOL的波特率默认却是57600,结果一片花屏。
2.2 完整SOL链路的四个环节
把SOL整条链路拆开看,是这样一个数据流:
- 第一环:主板上的串口控制器(通常集成在Super I/O芯片里,比如Nuvoton NCT6776系列)
- 第二环:BMC的UART接口,与主板串口控制器的TXD/RXD引脚相连
- 第三环:BMC内部的SOL引擎,把UART字节流封装成RMCP+协议消息
- 第四环:管理网口发出IPMI SOL数据包,远端的ipmitool或SSH客户端接收解析
这四环里任何一环断掉,SOL就不可用。最常见的故障点在第二环和第三环的配置上:主板串口重定向没有开启、SOL波特率不匹配、BMC用户权限不足、管理口VLAN隔离等。
2.3 USB转UART芯片的选型参考
在配置SOL和调试串口的过程中,免不了要用到USB转UART工具,尤其在没有服务器本地串口线或者需要直接抓BMC串口日志的时候。市面上的方案五花八门,核心芯片直接决定了稳定性和兼容性。
| 芯片型号 | 接口类型 | 常见电压 | 特点与适用场景 |
|---|---|---|---|
| FT232R | USB转UART | 3.3V/5V | 老牌经典,驱动成熟,兼容性最好,价格稍贵 |
| FT231X | USB转UART | 3.3V | FTDI新一代,体积小,适合嵌入式调试 |
| CP2102N | USB转UART | 3.3V/5V | Silicon Labs方案,驱动免安装,性价比高 |
| CP2104 | USB转UART | 3.3V/5V | 与CP2102N类似,板载晶振,稳定性好 |
| CH340 | USB转UART | 5V/3.3V | 国产方案,成本极低,但部分老旧驱动在Win10下有兼容性问题 |
驱动安装这块多说一句:FTDI系芯片在Windows下装驱动时,官网和系统更新推送的版本都行,但要注意别装到山寨芯片的冒用驱动上,否则FTDI官方驱动会直接把非正版芯片软屏蔽。CP2102N这类芯片一般系统能自动识别,Linux内核里已经集成了cp210x驱动模块。
2.4 串口接线注意事项
调试服务器主板上的串口排针时,线序一定要确认好。常见的是2x5的10Pin插针,包含TXD、RXD、GND,有些还带RTS/CTS流控。接线原则是交叉连接:主板TXD接USB转UART工具的RXD,主板RXD接工具的TXD,GND共地。
我见过不止一次有人把TXD和RXD接反,结果屏幕上一行字都没有。这时候不要急着怀疑设备坏了,先拿万用表量一下TXD引脚在空闲状态下的电平,正常应该在负电压(RS232电平)或高电平(TTL电平)附近。如果工具支持自发自收测试,把TXD和RXD短接后输入字符,能回显就说明工具本身没问题。
2.5 电平标准问题:RS232与TTL的差异
另一个高频坑是电平不匹配。服务器主板上的串口排针通常是TTL电平(0~3.3V或0~5V),而传统的DB9串口是RS232电平(正负12V左右)。USB转UART工具有的直接输出TTL,需要你选择3.3V还是5V模式,有的则内置了电平转换芯片。
如果BMC的调试串口是TTL 3.3V,你拿一个RS232电平的线直接怼上去,轻则收不到数据,重则烧坏BMC的串口引脚。实际操作中,我一般先查主板手册确认串口电压,不确定的话就用3.3V的TTL线,大部分现代主板和BMC调试口都是3.3V逻辑。
3. 实操过程与核心环节实现
3.1 BIOS/UEFI侧开启串口重定向
SOL工作的前提是主板串口控制器需要有数据输出,而这个前提又取决于BIOS里是否开启了串口重定向(Serial Redirection)。各厂商的叫法略有差异:戴尔叫Serial Communication,惠普叫Serial Port Options,超微叫Serial Port Console Redirection,但核心选项大同小异。
以常见的AMI Aptio UEFI为例,路径一般是Advanced → Serial Port Console Redirection,关键的几个设置项:
- COM1:Enabled,开启串口1
- Console Redirection:Enabled,开启控制台重定向
- Terminal Type:VT100+或ANSI,一般选VT100+兼容性最好
- Bits Per Second:115200,波特率要和BMC侧保持一致
- Data Bits/Parity/Stop Bits:8/None/1,这是标准配置,SOL场景不要改
这几个参数设置完成后保存重启,系统在POST阶段就会把字符输出到串口控制器上,BMC侧才能抓到引导信息。
3.2 BMC侧开启SOL功能
BMC侧的配置有几种途径:网页管理界面、ipmitool命令行、厂商专用工具(如Supermicro的IPMICFG)。以ipmitool为例,常用命令如下:
# 查看SOL当前配置 ipmitool sol info # 启用SOL并设置波特率 ipmitool sol set enabled true ipmitool sol set baudrate 115200 # 设置SOL为非易失性保存 ipmitool sol set non_volatile true需要注意,不同厂商BMC的SOL参数名称和set语法略有差异。有些需要先执行ipmitool sol set privilege-level admin来限定最小权限等级,否则普通用户登录后无法激活SOL会话。
3.3 通过ipmitool连接SOL会话
配置完成后,建立SOL连接的操作很简单:
# 连接SOL会话(需要指定BMC管理地址和用户名) ipmitool -I lanplus -H 192.168.1.10 -U admin -P password sol activate连接成功后,屏幕上会出现一串提示符,之后你在终端里的输入会被直接转发给服务器的串口控制器。此时如果对方机器正在启动,你能看到完整的BIOS POST信息、GRUB菜单、内核启动日志。
退出SOL会话的方式是四个波浪号加句号,~~.。这个快捷键要特别注意:必须在一行的开头输入,而且中间不能有停顿,否则BMC会把它当成普通字符吃掉。
还有一个实用快捷键~~B,作用是给SOL连接发一个break信号。在某些环境下,比如想强制中断正在运行的应用程序回到bootloader,break信号比Ctrl+C更底层、更可靠。
3.4 通过SSH连接SOL的完整流程
大多数服务器厂商的BMC都支持SSH登录,并且把SOL功能暴露在SSH会话里。以超微服务器为例,流程是:
# SSH登录BMC管理地址 ssh admin@192.168.1.10 # 进入BMC命令行后,执行SOL激活命令 sol activate这种方式的好处是显而易见的:SSH本身自带加密和认证,链路安全性比裸的ipmitool RMCP+要高出一个档次。ipmitool虽然也支持加密(RMCP+协议支持AES),但默认配置下很多人图省事用的是明文,这在跨公网管理时风险极大。
用SSH连SOL还有一个好处:可以配合跳板机做审计和录像。我在生产环境里会把SSH会话通过script命令记录下来,出问题之后复盘操作历史,这个习惯救过我好几次。
3.5 U-Boot和Linux内核场景下的SOL实操
SOL最典型的应用场景之一,是给开发板或服务器调试U-Boot启动流程。U-Boot默认通过UART输出日志,只要BMC侧SOL配置正确,远端就能看到从U-Boot SPL到内核解压的完整过程。
Linux内核在启动阶段也会向串口打印内核日志,但默认情况下需要在内核命令行里加上console=ttyS0,115200n8参数,否则串口上只能看到U-Boot和GRUB的信息,内核启动日志不会输出。如果想让SOL在系统完全启动后还能当登录终端用,还需要让getty监听串口:
# systemd系统下启用串口登录 systemctl enable serial-getty@ttyS0.service systemctl start serial-getty@ttyS0.service这样配置之后,即使网络完全不可用,你也可以通过SOL登录到一个完整的Linux shell,算是真正的最后一道保命通道。
3.6 在标准串口与SOL之间切换
有些BMC支持“SOL独占串口”和“串口复用”两种模式。独占模式下,主板串口的所有数据都走SOL,本地物理串口不再输出;复用模式下,本地串口和SOL可以同时看到数据流。
生产服务器一般建议用独占模式,避免本地串口接入时和SOL抢数据。开发调试场景则相反,可能需要本地串口和SOL同时观察。在AMI BMC的配置界面里,这个选项通常叫Serial Port Sharing或SOL/Serial Port Mode,具体名称需要看对应厂商的手册。
4. 常见问题与排查技巧实录
4.1 SOL常见故障速查表
| 故障现象 | 可能原因 | 排查与解决方法 |
|---|---|---|
| SOL连接后屏幕空白 | SOL未激活、BIOS串口重定向未开启 | 确认BIOS里Console Redirection为Enabled;用ipmitool sol info检查BMC侧SOL状态 |
| 屏幕显示乱码 | 波特率不匹配 | 逐级核对BIOS、BMC、客户端三方的波特率设置,统一为115200 8N1 |
| SSH登录BMC后执行sol activate报权限错误 | 用户权限不足 | 给用户分配管理员或操作员权限;检查BMC的SOL最小权限等级设置 |
| 可以激活SOL但输入无响应 | 终端类型不支持 | 把终端类型切换为VT100+或ANSI;检查SSH客户端是否把特殊按键拦截了 |
| 退出SOL后服务器串口无输出 | 会话未正常释放 | 等待BMC会话超时自动回收;用ipmitool sol deactivate强制释放 |
| SOL频繁断连 | 网络不稳定或BMC固件缺陷 | 检查管理口网络质量;升级BMC固件到最新版本;适当调大IPMI会话超时时间 |
4.2 排查过程实录:一次诡异的SOL乱码问题
去年帮客户排查一台超微服务器,SOL能激活,但输出全是一堆不可读字符。我一开始怀疑是波特率不匹配,但把BIOS和BMC两边的波特率都核对过,都是115200,问题依旧。
后来查了主板手册,发现这台板子有第二个串口(COM2),而BIOS的串口重定向默认指向的是COM1。BMC的SOL引擎接的主板串口却是COM2,两边压根没对上。BIOS里把Console Redirection的端口从COM1改成COM2之后,乱码立刻消失。这个案例说明排查SOL问题时,不要只盯波特率,还要确认BMC的物理串口接的是主板上哪个COM口。
4.3 被动模式的另一种用法:抓取串口日志
SOL还有一种被动监听模式,在ipmitool里可以通过sol deactivate退出主动会话后,用sol loop命令循环监听。这在调试过程中特别有用,比如你想同时观察多台服务器的串口输出,或者想持续录制某台机器重启时的完整引导日志。
抓日志的Linux命令可以这样写:
# 循环监听SOL输出并带时间戳写入文件 while true; do date >> /var/log/sol_$(hostname).log ipmitool -I lanplus -H 192.168.1.10 -U admin -P password sol loop >> /var/log/sol_$(hostname).log 2>&1 sleep 5 done4.4 多用户并发会话的处理策略
SOL本质上是一个单会话通道,同一时刻只能有一个客户端激活SOL,后来的连接会被拒绝或排队。多运维人员同时值班时,这经常引发冲突。
解决思路分两种:一种是在BMC层面设置SOL会话的等待策略,有些BMC支持设定会话超时时间,超时后自动回收会话;另一种是运维流程层面的约定,大家在公共运维平台里登记SOL占用状态,用完立即deactivate。我自己倾向于后者,流程约定比硬件策略更灵活。
部分厂商的BMC还支持多用户同时“观看”SOL会话,即一个用户拥有控制权,其他用户只读。超微和戴尔的新一代BMC固件里都有类似功能,生产环境建议优先选支持这个特性的设备。
4.5 加密与安全实践
SOL传输的原始数据是明文,如果你用ipmitool通过RMCP+协议连接且没有开启加密,串口上的所有内容,包括登录密码、命令输入、文件内容,在网络上都是裸奔的。跨不可信网络管理服务器,这是绝对的禁忌。
更安全的做法是前面提到的SSH通道:先SSH登录BMC,再在SSH会话里激活SOL,这样全程加密,认证也复用BMC的SSH用户体系。如果BMC不支持SSH,那就选择支持RMCP+加密的ipmitool版本,并通过-C 3参数指定使用AES加密:
ipmitool -I lanplus -C 3 -H 192.168.1.10 -U admin -P password sol activate4.6 实操心得:SOL使用的几个习惯
把这些年用SOL的经验浓缩成几条习惯,供参考:
- 所有服务器的BIOS串口重定向、BMC SOL参数,一次性统一成同一个标准(115200 8N1),避免逐台核对
- 配置完SOL后,一定要在BIOS自检阶段就验证一次,确认能抓到POST信息,别等系统崩了才想起测试
- BMC固件升级后,立刻复查SOL配置是否被重置为默认值,部分固件升级会清掉自定义设置
- SOL会话结束务必执行deactivate,否则连接挂在那占着资源,别人的会话进不来
- 在自动化脚本里调用SOL命令时,加上超时机制,防止进程卡死在等待输入的状态
5. UART层进阶:从SOL的波形看通信质量
5.1 用示波器观察UART波形
如果连SOL之后发现偶发字符丢失或者间歇性乱码,而波特率配置又是正确的,问题很可能出在信号质量上。这时候示波器就是最好的排查工具。
把示波器探头接到主板的TXD引脚上,抓一段空闲和高低电平变化的波形。一个健康的UART波形,低电平(起始位)和高电平(停止位)的宽度应该稳定,边沿应该陡峭,不应该有过大的过冲或振铃。如果波形边沿很缓,可能是上拉电阻过大或者线缆电容太强,这种情况在高波特率下更容易出错。
我自己在调试一块ARM开发板的串口时,出现过115200波特率下偶尔丢字节的现象,示波器一看,TXD引脚边沿上升时间接近1微秒,明显是板载的上拉电阻阻值偏大加上走线过长导致的。把波特率降到57600后问题消失,后来通过在板端加了一个小电容滤除高频噪声,才在115200下稳定工作。
5.2 串口线缆长度与质量的把握
UART的传输距离受限于电平标准和线缆质量,TTL电平的串口可靠传输距离一般只有一米左右,RS232电平可以到十几米,而SOL的意义恰恰在于彻底摆脱了物理距离的限制。
如果你确实需要在本地方便地接串口调试,尽量使用屏蔽双绞线,并且减小线缆长度。我见过有人在机房把串口线从机柜顶部甩到地板下面,走了七八米,结果连串口打印都时断时续。这种情况下用SOL反而更省心。
5.3 流控的使用细节
UART的流控分为硬件流控(RTS/CTS)和软件流控(XON/XOFF)。SOL场景下,大部分BMC实现默认不支持硬件流控,因为SOL引擎的缓冲机制已经承担了速率匹配的功能。如果你在BIOS里开启了硬件流控,但BMC的串口引脚没有接RTS/CTS线路,可能会出现“能发不能收”或者“输入延迟极大”的问题。
配置建议是:BIOS串口重定向里把流控设为None,SOL链路不需要流控。如果是连接物理串口设备调试,再根据设备手册决定是否需要启用硬件流控。
6. 实用工具组合与自动化扩展
6.1 基于SOL的批量服务器管理
手里管着几十上百台服务器的话,一台台SSH进BMC再sol activate的效率太低。可以写一个简单的脚本,批量执行SOL命令。思路是封装expect或sshpass,自动完成登录和激活:
#!/bin/bash # 批量执行SOL命令的函数示例 sol_exec() { local BMC_IP=$1 local USER=$2 local PASS=$3 local CMD=$4 sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$BMC_IP" \ "sol activate; sleep 2; echo '$CMD'; sleep 5; ~~." }当然生产环境不建议把密码直接放脚本里,更替的方案是用密钥认证和BMC的SSH key管理功能。超微、戴尔、惠普的新一代BMC都支持SSH公钥认证,配好之后安全性高很多,也方便自动化。
6.2 SOL输出日志的转储与告警
把SOL当串口控制台用只是最基础的功能,更进一步的做法是把SOL的输出转储下来做分析。前面提过一个简单的循环抓取脚本,配合正则匹配可以做简单的告警,比如在输出里检测到Kernel panic、Oops、Out of memory之类的关键词时,触发邮件或钉钉通知。
实测下来这个方案在测试环境跑得很稳,但在大批量生产服务器上不建议在主BMC管理链路里跑常驻循环监听,它会增加BMC的负载,还可能影响其他管理操作的响应。更稳妥的做法是只在故障排查时临时启动,平时保持SOL空闲。
6.3 新式BMC对SOL的增强特性
这一代主流的BMC实现(比如AMI的MegaRAC SP-X、海力士之类),对SOL的增强主要体现在两个方向:
一是HTML5虚拟控制台里整合了SOL窗口,网页上就能直接操作,不需要再单独开SSH。对于不熟悉命令行的同事来说,图形界面里多一个串口窗口,接受度高不少。
二是SOL会话的审计与回放。部分企业级BMC可以把SOL会话完整录制下来,存储在BMC的存储分区或远程日志服务器上,事后可以回放完整的操作过程。这在合规审计要求高的行业里很实用,比如金融、政务类的机房环境。
我在实际项目中,帮客户规划过一套“带外管理基线”,里面明确要求:所有物理服务器的BIOS开启串口重定向、BMC开启SOL、SOL必须走SSH加密通道、SOL操作日志留存180天。这套基线落地之后,再遇到系统级故障,运维团队不需要进机房就能完成大部分诊断和恢复操作,平均故障恢复时间缩短了将近四成。
串口重定向+SOC引擎+BMC管理口,这条链路平时看起来默默无闻,但它就是服务器管理体系的“诺亚方舟”。每次配置新服务器,我第一件事就是打开BIOS把串口重定向设好,BMC里把SOL打开,等整套系统跑起来再干别的。等到哪天真出了大事,你会感谢当初多花的那几分钟。