
前阵子公司一台跑着核心业务的服务器网络配置被我改坏了。远程SSH一断整个人直接凉了一半机房又不在同城跑一趟机票加折腾少说半天。好在机器是支持IPMI的机房服务器带外管理口还通着我直接打开SOL拿到一串串口控制台把网卡配置改回来前后不到十分钟。那次之后我把IPMI的SOLSerial Over LAN和它底层的UART串口通信彻底研究了一遍。实话讲SOL这个功能在服务器运维里属于那种平时想不起来、关键时刻救命的家伙。很多人知道IPMI能远程开关机、看传感器温度但真正遇到系统网络层完全挂掉的情况SOL才是唯一能把你拉回现场的通道。这篇文章我把自己在实际环境中配置和使用SOL的经验完整捋一遍从UART的底层原理讲起到BIOS/BMC设置、Linux串口控制台配置、ipmitool实操、常见故障排查一路写到USB转UART调试工具的驱动选择。不管是机房运维、IDC管理员还是搞嵌入式的朋友应该都能从中找到有用的东西。1. 什么是SOL服务器运维的隐形救援通道1.1 SOL解决了什么痛苦一次真实事故的复盘先还原一下我那次事故的具体场景。服务器的操作系统是Linux我在调优网络参数的时候把某个网卡配置文件里的MAC地址和接口名改错了重启网络服务之后SSH连接直接断掉。正常情况下你要么去机房接显示器和键盘要么用IPMI的KVM远程图形界面进去改。但KVM走的是BMC的视频重定向带宽消耗大、加载慢而且有时候只支持到GRUB引导阶段之前进了系统反而卡。SOL的做法完全不同。它把服务器的串口COM口重定向到BMC再通过BMC的网口封装成IP网络里的数据流。客户端只需要一台能跑命令行的电脑用ipmitool sol activate这类工具连上BMC就能拿到一个虚拟的串口终端。这个终端直接对接操作系统内核的console输出意味着从BIOS自检、GRUB引导、内核启动日志到登录Shell整个过程全都看得见、能操作。那次我打开SOL之后看到的就是完整的登录提示符。直接root登录把网卡配置文件改回正常状态重启网络SSH恢复。全程没有碰物理机器没有KVM那套笨重的Java控制台纯文字界面稳得像在本地敲命令。1.2 SOL的应用边界和核心价值不少人会问既然有IPMI KVM为什么还要SOL我的理解是SOL适合的是网络可达、图形不可达的场景。KVM要传视频流带宽要求高很多远程运维环境根本达不到SOL传输的是纯字符数据一个终端窗口就能跑几百Kbps的带宽都绰绰有余。SOL的另一个价值在于它和操作系统的串口console机制深度绑定。你在Linux内核启动参数里加上consolettyS0,115200内核日志就会同时输出到物理串口。这时候SOL捕获到的就不只是登录Shell还包括内核引导过程中的所有打印信息排错能力比KVM强太多。比如系统在内核阶段panicKVM看到的通常是黑屏或者卡死的画面SOL却能完整保留最后一段内核输出。所以SOL的核心应用场景可以概括为三件事系统网络层彻底挂掉时的应急通道、内核启动阶段的排错工具、以及远程环境下的串口调试入口。它不能替代IPMI的传感器监控和电源管理但在操作系统不可达这个维度它是无可替代的兜底方案。2. 从UART到SOL搞懂串口重定向的底层原理2.1 UART是什么一根TX、一根RX的硬核通信先说UARTUniversal Asynchronous Receiver/Transmitter通用异步收发器。UART是一种很老但极其稳定的串行通信协议核心就是两根信号线TX发送、RX接收外加一个共地参考。它和I2C、SPI这类同步通信协议最大的区别在于UART没有时钟线收发双方各自用自己的时钟去采样对方发来的数据所以双方必须提前约定好波特率baud rate也就是每秒传输多少个码元。波特率是UART里最关键的参数。常用的有9600、19200、38400、57600、115200这些档位。嵌入式领域默认9600比较常见服务器串口console一般用115200因为服务器要输出大量内核日志波特率太低会明显卡顿。我记得有一次把BMC的SOL波特率设成9600而Linux内核consolettyS0,115200结果打开SOL就满屏乱码改过来才恢复正常。UART每个数据帧的结构也很有意思起始位1位低电平、数据位通常8位、可选的校验位、停止位1位或2位。因为UART没有时钟收发双方就靠起始位的下降沿来同步之后按照约定的波特率逐位采样。FPGA开发板上写UART收发模块就是热词里提到的uart verilog时最核心的就是把波特率换算成时钟分频计数。比如50MHz系统时钟跑115200波特率一个bit的时长就是50_000_000 / 115200约434个时钟周期发送端每434个周期翻转一次电平接收端在起始沿之后偏移半个bit周期去采中间点提高采样可靠性。2.2 BMC如何把串口变成网络数据流搞懂UART的基础之后再看SOL就简单了——SOL就是把服务器主板上的那个物理串口或者BMC虚拟出来的串口和网络做了一个桥接。服务器的BMCBaseboard Management Controller基板管理控制器本身就独立于主CPU运行自带网口和固件。当你在BIOS里开启SOL重定向之后BMC就会监听CPU侧UART接口上流动的数据把这些字节原样封装进IPMI协议包再通过BMC的以太网口发送到管理网络。反向也是同理你在客户端敲的每个字符通过IPMI协议封装发送到BMCBMC再把字符写到UART的TX引脚上操作系统从串口收到字符就好像有人在物理串口终端上打字一样。整个过程对操作系统和应用程序完全透明它们看到的只是一个标准的串口设备。SOL之所以能做到带外救援核心就在于BMC和主系统之间的独立性——主系统的网络、CPU、内存全部沦陷BMC依然能工作。2.3 别再混淆UART、USART、I2C、SPI了热词里有一个搜索词是usart、uart、i2c、spi区别确实很多人在这些总线协议之间犯迷糊。UART前面说了是异步串行通信全双工两根线适合点对点。USART在UART基础上多了一个SSynchronous它额外提供一根时钟线可以做同步模式单片机里最常见的USART既能当UART用也能配合时钟做同步通信。I2C是同步半双工协议两根线分别是SCL时钟和SDA数据通过设备地址寻址支持一主多从、多主多从适合板内短距离连接多个低速外设比如EEPROM、温度传感器。SPI则是同步全双工四根线SCLK、MOSI、MISO、CS速度可以做到很高常用于Flash、SD卡、显示屏这类需要大量数据传输的设备。SOL只依赖UART这一种工作方式BMC和主CPU之间走的正是UART链路。理解这个区别对排查问题很有帮助有人把服务器console线接到一个I2C转接板上折腾半天没信号其实接口协议根本不匹配。服务器带外管理的串口标准非常明确就是高速UART默认115200/8/N/1115200波特率、8位数据、无校验、1位停止位。3. SOL配置实录从华硕主板BIOS到Linux系统3.1 BIOS层开启串口重定向的两处关键选项以我比较熟悉的华硕服务器主板为例华硕的IPMI方案很多基于ASPEED BMC芯片要在BIOS里开启SOL通常需要设置两个地方一个是串口本身一个是console重定向。第一个是Serial Port串口配置找到Server Management或Advanced - Serial Port Console Redirection菜单确认板载串口1通常是COM1对应I/O端口0x3F8、IRQ4处于Enabled状态。这个串口的I/O地址和IRQ别乱改Linux内核默认ttyS0对应的就是0x3F8。第二个是Console Redirection控制台重定向设置把COM1的Console Redirection选为Enabled终端类型选VT100或ANSI波特率设为115200。华硕和大多数服务器BIOS里还有一项Flow ControlSOL场景下建议选None因为BMC模拟的串口没有硬件流控线RTS/CTS硬开流控反而可能造成字符丢失。BIOS设置完成之后保存重启。需要特别提醒的是BIOS里的SOL和操作系统的console是两条线BIOS阶段的输出由固件自己管理进入Linux之后由内核的console参数接管。想在全阶段都看到输出两边都得配好。3.2 华硕IPMI网页管理界面里的SOL设置华硕服务器主板默认会有一个IPMI管理地址浏览器登录之后可以看到完整的BMC管理界面。不同版本的界面布局略有差异但SOL相关的入口基本都在Remote Control或Serial Over LAN菜单下面。关键设置项一般包括SOL Enable/Disable总开关务必设为Enabled。SOL Baud Rate必须和BIOS里设置的串口波特率保持一致推荐115200。SOL User指定哪些IPMI用户可以访问SOL会话。建议单独为SOL操作建一个账号避免共享管理员密码。Encryption/SSL部分新版BMC支持给SOL加上TLS加密。我建议在满足兼容性的前提下开启因为SOL传输的是明文终端数据里面会出现root密码之类的敏感信息。另外华硕的BMC界面里通常还提供一个Remote Console远程控制台工具这就是KVM功能。从网页里启动它需要安装Java或一个本地客户端比较繁琐。真正CI运维场景下我更推荐跳过网页直接用ipmitool命令行这个后面详述。3.3 Linux下串口控制台与登录Shell配置BIOS和BMC配好只是第一步Linux侧不配置的话SOL只能看到GRUB或内核早期输出登录Shell是没有的。系统起来之后内核会尝试打开consolettyS0指定的串口作为控制台但要注意两点第一必须确保系统里有一个getty进程监听这个串口否则你会看到一个登录提示都没有的死终端第二内核启动参数里console可以同时指定多个目前实际环境中最常用的是consoletty0 consolettyS0,115200n8。配置getty有两种方式。老一点的系统改/etc/inittab加一行S0:12345:respawn:/sbin/agetty -L 115200 ttyS0 vt100。新系统用systemd的话最好启用系统自带的serial-getty服务systemctl enable serial-gettyttyS0.service systemctl start serial-gettyttyS0.servicegrub.cfg里的内核命令行也需要确认。在/etc/default/grub里设置GRUB_CMDLINE_LINUXconsoletty0 consolettyS0,115200n8然后重新生成grub配置grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS系 update-grub # Debian/Ubuntu系这里有个容易踩的坑consolettyS0和consoletty0的顺序会影响日志输出到哪个终端。Linux内核的做法是最后一个console参数作为/dev/console的默认设备所以你希望内核日志默认走串口、提高排错效率的话就把ttyS0放在最后。3.4 Windows下的SOL玩法Windows Server同样支持通过串口查看内核调试信息但配置方式比Linux麻烦一些。如果你只是想在Windows下用SOL连接Linux服务器那不需要在Windows侧做任何额外配置直接用PuTTY的Serial模式接到本地COM口或者用ipmitool的SOL功能连接到远程BMC即可。反过来如果你想在Windows服务器上开放串口console让SOL能登录需要通过BCDEdit设置调试或紧急管理服务EMSbcdedit /ems on bcdedit /emssettings EMSPORT:1 EMSBAUDRATE:115200设置完重启之后Windows的紧急管理服务就会监听COM1SOL连接上去可以看到蓝屏转储和部分引导信息。但Windows的EMS能力相比Linux的完整console还是弱不少日常服务器运维场景里Windows机器主要靠IPMI的KVM或远程桌面兜底SOL在Windows侧用得不多。4. 三种常用SOL连接方式IPMI页面、ipmitool、第三方工具4.1 网页远程控制台最直观的SOL入口华硕IPMI界面自带的那种网页远程控制台其实就是一个Java Web Start客户端或者本地应用。它把电源控制、KVM、SOL集成在一个窗口里对于不熟悉命令行的运维新手来说很友好。登录BMC之后找到远程控制台入口启动之后选择Serial Console标签页就能看到SOL连接界面。使用体验上网页版SOL胜在开箱即用、图形化操作但缺点也很明显Java插件经常因为浏览器兼容性问题启动失败HTML5版又依赖BMC固件版本和硬件性能。我有一次在客户现场浏览器Java安全设置卡了半天最后还是掏出笔记本用ipmitool解决的。所以我的建议是网页版SOL可以作为备用方案日常还是要掌握命令行方式。BMC的网页管理界面更适合用来查看传感器、设置用户权限、升级固件这类配置操作真正的应急连接一律走ipmitool。4.2 ipmitool sol activate命令行运维者的最爱ipmitool是Linux下最常用的IPMI管理工具SOL子命令是它的一大亮点。基本用法分三步加载内核模块、配置BMC网络、激活SOL会话。如果是本机BMC已经被系统识别为IPMI设备通过IPMI Over LAN或者内核的ipmi_si驱动直接ipmitool -I lanplus -H 192.168.1.10 -U admin -P password sol activate参数含义很简单-I lanplus用加密的RMCP协议-H指定BMC的IP地址-U和-P是BMC用户和密码sol activate打开SOL会话。退出会话的快捷键是~.波浪号加句号这个一定得记住因为SOL会话是独占的不用快捷键断开的话BMC端会话会挂在那里后面别人想连都连不上。另外sol deactivate命令可以强制清掉一个挂死的SOL会话这在排查别人占用了SOL的问题时非常有用。ipmitool还支持sol info查看当前SOL配置以及sol payload这些更底层的高级选项不过日常用到的不多。4.3 USB转UART调试工具的驱动选择与安装聊到SOL就绕不开USB转UART的调试工具特别是当你要直接接服务器的物理串口排错或者BMC网络不可达时一根USB转串口线是必备道具。热词里的FT231X、FT232R、CP2102N、CP2104这些都是常见的USB转UART桥接芯片。FTDI家的FT232R是最经典的方案兼容性极好Linux内核自带ftdi_sio驱动插上就能识别成/dev/ttyUSB0。FT231X是它的升级版体积更小、工作电压更低驱动同样用FTDI的VCP虚拟串口驱动。Windows下建议去FTDI官网下载最新驱动因为旧版本在某些Win10/11更新后会出现无法识别的问题。Silicon Labs的CP2102N和CP2104也很常用它们的优势是价格低、外围电路简单很多开发板上都直接焊了CP2102。Windows下需要装Silicon Labs的CP210x VCP驱动Linux内核已经内置cp210x驱动。实测下来CP2102N在Linux下的稳定性也不错但某些老内核版本需要手动加modprobe cp210x新内核基本都自动加载。驱动装好后用minicom、PuTTY或者screen连上去screen /dev/ttyUSB0 115200这一步操作虽然简单但有一个很多人忽略的坑USB转串口线通电之后TX/RX引脚的电平状态是固定的如果你的服务器串口还接着别的设备直接热插拔可能引起电平冲突。我在机房现场就见过有人因为带电插拔USB转串口线把服务器主板上串口芯片烧掉的情况。稳妥的做法是先确认服务器已关机或串口空闲再接调试线如果是调试已经跑着的服务器至少要把地线先接好再接触信号线。5. 常见问题排查与避坑指南5.1 SOL连上但黑屏、无输出这是问得最多的问题。SOL会话能激活说明BMC到客户端这条链路是通的黑屏说明主CPU侧根本没有数据送到串口。第一步先确认BIOS里Console Redirection是不是开在COM1上以及Linux内核参数里有没有consolettyS0,115200。很多时候BIOS没开重定向或者grub配置没有真正生效就会出现SOL连接成功但什么都看不到的情况。第二步检查串口配置是否被别的服务占用。Linux下用dmesg | grep ttyS确认串口设备是否被识别再用lsof /dev/ttyS0看有没有进程占着这个设备。systemd环境下偶尔会遇到getty启动失败的问题排查时可以手动执行systemctl status serial-gettyttyS0.service如果服务是active但你还是看不到登录提示检查一下agetty命令行里的终端类型和波特率是否和BMC设置一致。5.2 乱码或花屏多半是波特率没配对SOL输出满屏乱码原因90%以上是波特率不匹配。BIOS/BMC设置的SOL波特率、Linux内核console参数里的波特率、客户端终端工具PuTTY、screen、ipmitool设置的波特率这三个必须完全一致。任何一处是9600、其他是115200就会出现典型的能通但读不懂现象。还有一种隐蔽情况BIOS里Serial Port的波特率设置项和Console Redirection的波特率设置项是分开的只改其中一个另一个没跟着变也会乱码。华硕主板上这两个选项通常在不同菜单层级里我建议把Serial Port Configuration里的Base I/O Address和Interrupt保持默认0x3F8/IRQ4只改Console Redirection的波特率可变量越少越不容易出错。5.3 连接被占用或无法激活SOL会话的独占性BMC的SOL功能通常只支持一个会话独占使用。有人连到一半断线了但BMC认为会话还活着你再执行sol activate就会提示unable to activate SOL payload或者直接无响应。这时候用ipmitool sol deactivate强制清掉残留会话等两三秒再激活就行。如果deactivate之后还是连不上尝试重启BMC。华硕IPMI界面里一般有Reset BMC按钮命令行可以执行ipmitool mc reset cold。注意重启BMC的过程会短暂断开所有IPMI连接操作要安排在业务低峰期。5.4 嵌入式调试视角UART协议层的其他坑最后从嵌入式角度再补充几个和UART相关的常见问题毕竟SOL的根子在UART上很多协议层的东西想明白了SOL的问题也就迎刃而解。热词里有人搜uart verilog单片机uart模拟linhall uart接收函数说明不少人正在做FPGA或单片机上的UART开发。FPGA上写UART模块最容易踩的坑是波特率分频计数的边界条件。比如50MHz时钟、115200波特率理想分频值约434.03实际取434误差只有0.008%完全能容忍。但如果你用25MHz时钟跑230400波特率分频值是108.5无论取108还是109都有超过0.4%的误差长帧传输时就可能采样错误。解决办法是改用误差更小的波特率或者提高系统时钟频率。单片机上用UART模拟LIN总线核心在于LIN的帧结构基于UART的8N1格式发送唤醒脉冲和同步场时需要对UART的波特率做临时调整。有些MCU的UART外设在运行中更改波特率需要先禁用再使能这个切换窗口如果处理不好会多发出一个杂散字符。至于霍尔传感器通过UART输出数据hall uart接收函数最常见的是数据帧解析的粘包和拆包问题。设备以固定周期发送一帧多字节数据接收函数如果按单字节中断处理必须在状态机里做好帧头帧尾判定不然一次串口中断丢失后面整帧数据全错位。我的习惯是在接收函数里维护一个环形缓冲区中断只负责把字节压入缓冲区主循环再按帧格式取数解析这样能最大限度降低丢数据的概率。我把SOL和UART从应用层一路扒到协议层最深的感受是SOL之所以是救命的通道恰恰因为它的底层是极简且极稳的UART。没有复杂的协议握手没有视频编解码就是字节流的透明搬运这种简单带来的可靠性在故障场景里就是最大的优势。日常运维中建议把SOL纳入你的应急手册每一台支持IPMI的服务器都提前配好SOL并定期测试一次连接。真到网络配置挂掉、SSH连不上的那天你会发现一个能用的SOL比一整套KVM加带外管理工具都好使。