我有一台从 USB 存储上的根文件系统运行 Ubuntu 14.04 的笔记本电脑。这不是很好,因为从挂起唤醒后,ext4 会在 USB 准备好之前频繁尝试写入根文件系统。
这是发生这种情况时我在内核日志中看到的内容,请注意我是如何在 上出现一堆 I/O 错误sda1
,然后一秒钟后内核终于检测到 USB 存储驱动器。
[ 2826.517419] wlan0: associated
[ 2826.517452] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[ 2827.575371] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 1733735 (offset 0 size 0 starting block 12629950)
[ 2827.575380] Buffer I/O error on device sda1, logical block 12629694
[ 2827.575400] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 3148603 (offset 0 size 8192 starting block 12844470)
[ 2827.575404] Buffer I/O error on device sda1, logical block 12844212
[ 2827.575411] Buffer I/O error on device sda1, logical block 12844213
[ 2827.575448] EXT4-fs warning (device sda1): ext4_end_bio:317: I/O error -5 writing to inode 3015015 (offset 0 size 90112 starting block 6588832)
[ 2827.575453] Buffer I/O error on device sda1, logical block 6588576
[ 2827.575461] Buffer I/O error on device sda1, logical block 6588577
[ 2827.575465] Buffer I/O error on device sda1, logical block 6588578
[ 2827.575469] Buffer I/O error on device sda1, logical block 6588579
[ 2827.575473] Buffer I/O error on device sda1, logical block 6588580
[ 2827.575477] Buffer I/O error on device sda1, logical block 6588581
[ 2827.575481] Buffer I/O error on device sda1, logical block 6588582
[ 2828.857284] sd 0:0:0:0: [sda] No Caching mode page found
[ 2828.857293] sd 0:0:0:0: [sda] Assuming drive cache: write through
起初在内核日志之外没有可见的迹象表明问题已经触发,但如果我让 Ubuntu 在这一点之后继续运行,那么文件系统将出现错误并最终切换到只读模式。那时我必须重新启动进入恢复模式并fsck.ext4
从 root shell 手动运行以修复文件系统。
是否有一些我可以更改的设置,以便可以延迟从挂起唤醒后对根设备的访问,直到 USB 驱动器准备就绪?
此问题仅出现在 USB 设备上而不出现在其他设备上的原因是两个因素的结合:
结果是,在恢复过程中,一方面 USB 系统试图检测媒体,另一方面系统日志试图将日志消息从挂起和恢复写入磁盘。
如果 syslog 碰巧在检测到 USB 设备之前尝试写入,ext4 会收到一个错误,出于某种原因,该错误没有得到妥善处理,最终文件系统将需要手动运行 fsck。
我找到的解决方案是在其他线程被唤醒之前为内核线程提供 12 秒的领先优势。这些是我必须对内核进行的更改才能使其工作: