Linux启动因HBA设备超时卡住90秒,本质是systemd等待离线SAN存储设备就绪;应先用dmesg确认FC链路状态,再通过rd.timeout内核参数或device覆盖配置缩短等待,同时排查光纤、SFP模块及HBA驱动等物理层问题。

systemd 等待 HBA 设备超时卡住 90 秒
Linux 启动或运行中因 HBA 卡物理掉线(如光纤松动、SFP 模块异常、存储链路中断)导致系统 hang 住约 60–90 秒,本质是 systemd 在等待某个依赖的 dev-sdX.device(比如挂载点指向 SAN 存储的 LUN)就绪,而该设备已离线但未被及时标记为“失败”。默认超时值为 90 秒,期间控制台卡在 A start job is running for dev/sdc.device 类提示上。
这不是“系统崩溃”,而是 systemd 主动阻塞——它在等一个永远不会回来的设备。重启能恢复,是因为重新协商了 FC 链路、清空了内核 SCSI 层的 pending I/O 状态,掩盖了底层物理不稳的问题。
- 先确认是否真由 HBA 引起:启动卡住时,切到 tty2(Ctrl+Alt+F2),执行
dmesg -T | grep -i "scsi\|fc\|hba",看是否有FC link down、device not ready、timed out或反复重试的 SCSI 错误 - 检查 HBA 当前状态:
cat /sys/class/fc_host/host*/port_state应为Online;若为Linkdown或Unknown,说明物理链路已断 - 不要直接禁用设备单元:盲目执行
systemctl disable dev-sdc.device会破坏挂载依赖,可能导致根文件系统无法挂载
缩短或跳过 HBA 设备等待时间
核心不是让 systemd “更快失败”,而是让它“不等”——前提是该设备非系统必需(如仅用于备份卷、数据盘)。关键修改点在内核启动参数和 systemd unit 覆盖配置。
- 临时绕过(单次生效):GRUB 启动时按
e编辑,找到linux行末尾,追加rd.timeout=30(适用于 dracut)或systemd.unit=multi-user.target systemd.default_timeout_start_sec=30,然后 Ctrl+X 启动 - 永久生效(推荐):编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX中加入rd.timeout=15(RHEL/CentOS/Fedora)或rootdelay=15(Debian/Ubuntu),再运行update-grub或grub2-mkconfig -o /boot/grub2/grub.cfg - 对特定设备跳过等待:创建覆盖文件
/etc/systemd/system/dev-sdc.device.d/timeout.conf,内容为:[Unit]\nStartLimitIntervalSec=0\n[Service]\nType=oneshot\nExecStart=/bin/sh -c 'exit 0'
—— 这会让 systemd 认为此设备“立即就绪”,绕过实际探测
HBA 卡物理层必须排查的三件事
缩短超时只是应急,真正要解决的是“为什么掉线”。HBA 物理掉线极少是软件问题,90% 以上源于以下环节:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 光纤连接:拔插一次 SFP 模块,检查 LC 接口是否有灰尘(用专用清洁笔)、光纤弯曲半径是否
- HBA 固件与驱动版本:执行
systool -c fc_host -v | grep firmware查固件版本,对比厂商官网是否为最新;老固件在链路抖动时易进入 recovery loop - 存储侧端口状态:登录光纤交换机,查对应 port 的
errshow(Brocade)或porterrshow(Cisco MDS),重点关注link_fails、loss_of_sync、prim_seq_err计数是否持续增长
注意:lspci -vv -s $(lspci | grep -i "fibre\|hba" | head -n1 | awk '{print $1}') 可看到 HBA 的 Link Status 和 Speed,如果显示 LinkDown 或 2.5Gb/s(而预期是 8/16/32G),基本可锁定物理层问题。
避免应用层被 HBA 掉线拖垮
即使你调低了 systemd 超时,若业务进程(如数据库、备份脚本)直接读写该 HBA 挂载的路径,仍可能因 I/O hang 住整个进程。必须做隔离:
- 挂载选项加固:在
/etc/fstab中对该设备使用noauto,x-systemd.device-timeout=10,_netdev,soft,intr,rsize=65536,wsize=65536(NFS)或_netdev,x-systemd.device-timeout=10,defaults(本地 SCSI),其中_netdev告诉 systemd 这是网络/外部设备,x-systemd.device-timeout控制挂载超时 - 禁止关键服务强依赖:不要把
/var/lib/mysql或/opt/app/data直接建在 HBA 映射盘上;应通过 LVM 逻辑卷 +lvchange -an实现快速脱钩,或改用集群文件系统(如 GFS2)支持故障自动剔除 - 监控链路存活:写个简单脚本每 5 分钟执行
cat /sys/class/fc_host/host*/port_state | grep -q "Online",失败则发告警,比等系统卡住再处理更主动
最常被忽略的一点:HBA 掉线后,内核 SCSI 层可能残留大量 blocked 状态的请求,echo 1 > /sys/block/sdc/device/delete 手动删除设备节点虽能释放,但会丢失未完成 I/O——务必确保上层应用已停止访问,否则可能引发数据损坏。

















