![为什么 USB 端口故障会导致 Ubuntu 20.20 启动缓慢?](https://linux22.com/image/1625316/%E4%B8%BA%E4%BB%80%E4%B9%88%20USB%20%E7%AB%AF%E5%8F%A3%E6%95%85%E9%9A%9C%E4%BC%9A%E5%AF%BC%E8%87%B4%20Ubuntu%2020.20%20%E5%90%AF%E5%8A%A8%E7%BC%93%E6%85%A2%EF%BC%9F.png)
此系统上的 USB 端口有故障;我可以判断,因为插入它的设备无法工作,并且我收到类似以下的 dmesg 报告
[ 11.673418] usb 2-1: device not accepting address 2, error -110
[ 22.425445] usb usb2-port1: attempt power cycle
在同一台机器上安装的 Win10 给出了与同一端口相关的通用 USB 故障消息。没什么大不了的,还有很多其他的,用胶带封住端口,继续生活。但是,Ubuntu 在启动时暂停了大约一分钟,从启动systemd-udev
(使用内核参数启动时可通过其日志消息识别debug
)到挂载根文件系统(dmesg
第 行EXT4-fs (sdb3): mounted filesystem with ordered data mode. Opts: (null)
)
那么,为什么会出现延迟?我该如何克服它,以便系统能够再次及时启动?
答案1
经过一番思考,我找到了这个解决方案:
脚本/usr/share/initramfs-tools/scripts/init-top/udev
在 initramfs 启动阶段早期运行,在挂载根文件系统并正确启动 systemd 之前。它调用udevadm settle
,等待所有硬件更改事件完成(不确定什么才算完成,但显然我的 USB 端口卡在这种半设置状态不算在内)。 的settle
默认超时时间为 2 分钟,但我猜内核放弃 USB 初始化的超时时间为 1 分钟。
解决方案:编辑该脚本以添加--timeout=10
,然后使用它sudo update-initramfs -u -k all
来更新 initrd。从技术上讲,如果我的 SATA 控制器需要很长时间才能启动,这可能会造成麻烦,因为它可能无法安装根 FS,但实际上这种情况似乎不会发生,而且所有其他硬件应该像热插拔一样工作。