只读文件系统并在 120 台机器上重复进行 fsck

只读文件系统并在 120 台机器上重复进行 fsck

简单介绍一下背景:我为一家安全公司工作,该公司决定使用 Linux,因为它的稳定性和可定制性。这些机器是我公司用消费级组件制造的 NVR。由于它们用于录制安全录像,因此正常运行时间和可靠性是关键 - 而这正是我的问题所在。

我们部署了约 120 台机器,所有机器均由相同组件统一构建,并且均从源 2 个磁盘(一个 16.04 和一个 18.04)克隆。无论克隆如何,FS 都是 Ext4

在所有这些机器上,无论它们是 18.04 还是 16.04(两者都是从头开始单独构建的,用于克隆目的),我们都遇到了问题,机器遇到了某种 IO 错误,根分区变为只读。重新启动后,机器进入 initramfs 提示符,我必须执行手动 fsck。有一堆孤立的 Inode 需要修复,位图大小也不正确。此后,lost+found 中没有任何内容。机器然后正常运行,直到它再次随机发生。错误之间的时间从一天到 4 个月后不等。驱动器始终通过短、长和 SMART 测试。我在网上找到的所有内容都说“驱动器故障,SATA 电缆损坏”等。我很难相信我拥有的每个金士顿 SSD 都会出问题。尤其是因为所有这些驱动器都是 9 个月或更短时间。

以下是其中一台受影响机器的系统日志摘录。

May 19 03:54:55   kernel: [43799.504870] sd 4:0:0:0: [sdb] tag#23 FAILED Result: hostb
yte=DID_OK driverbyte=DRIVER_TIMEOUT
May 19 03:54:55   kernel: [43799.504877] sd 4:0:0:0: [sdb] tag#23 CDB: Write(10) 2a 00
 0d 05 fa e0 00 00 08 00
May 19 03:54:55   kernel: [43799.504882] blk_update_request: I/O error, dev sdb, secto
r 218495712 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 0
May 19 03:54:55   kernel: [43799.504890] EXT4-fs warning (device sdb1): ext4_end_bio:3
15: I/O error 10 writing to inode 6815752 (offset 0 size 4096 starting block 27311965)
May 19 03:54:55   kernel: [43799.504894] Buffer I/O error on device sdb1, logical bloc
k 27311708
May 19 03:54:55   kernel: [43799.504928] sd 4:0:0:0: [sdb] tag#28 FAILED Result: hostb
yte=DID_OK driverbyte=DRIVER_TIMEOUT
May 19 03:54:55   kernel: [43799.504931] sd 4:0:0:0: [sdb] tag#28 CDB: Write(10) 2a 00
 06 ca 5a c0 00 00 40 00
May 19 03:54:55   kernel: [43799.504935] blk_update_request: I/O error, dev sdb, secto
r 113924800 op 0x1:(WRITE) flags 0x800 phys_seg 8 prio class 0
May 19 03:54:55   kernel: [43799.504954] JBD2: Detected IO errors while flushing file 
data on sdb1-8
May 19 03:54:55   kernel: [43799.505014] Aborting journal on device sdb1-8.
May 19 03:54:55   kernel: [43799.505020] EXT4-fs error (device sdb1) in ext4_reserve_i
node_write:5976: Journal has aborted
May 19 03:54:55   kernel: [43799.506540] EXT4-fs (sdb1): Remounting filesystem read-on
ly
May 19 03:54:55   kernel: [43799.508041] EXT4-fs error (device sdb1): ext4_journal_che
ck_start:61: Detected aborted journal0

我大致知道这里发生了什么,但没有任何东西表明为什么。我明白有些东西导致了 IO 错误,这导致日志中止,从而使 FS 进入 RO。这种情况发生在所有这些不同的机器上根本说不通。更有趣的是,我无法物理访问这些机器,因为它们位于整个区域的客户站点。每次我都必须带人到现场执行 fsck /dev/sdb1 -y。

硬件:

自这件事开始以来,我所做的事情:

  • 在某些机器上将内核更新至 5.3
  • 在某些机器上禁用 fstrim
  • 在某些机器上添加了 noatime 来挂载选项

经过这些改变的机器仍然出现该问题。

相关内容