在使用 3IE3 3IE4 3ME3 固态硬盘的硬件上出现文件系统超时和只读文件系统

网络交换机中常用的一些 SSD(固态硬盘或闪存)驱动器型号需要使用 TRIM 命令才能正常运行。默认情况下,与大多数其他 Linux 发行版一样,Cumulus Linux 不启用 TRIM。此命令使操作系统能够及时更新驱动器空闲区域上的固件,以确保写入正常工作。随着时间的推移,如果没有此通知,当您对 SSD 启用大量日志记录或调试时,固件可能需要更长的时间来执行写入操作,这反过来可能会导致驱动程序超时。这些磁盘错误最终可能导致文件系统以只读方式挂载。

对于运行 3.0.0 到 3.7.3 版本的客户,NVIDIA 正在分发一个软件包来解决此问题。由于这些 SSD 驱动器在网络硬件中广泛使用,因此所有使用 3IE3、3IE4 或 3ME3 SSD 的客户都应安装此软件包。没有受影响 SSD 的客户应该看不到任何行为变化。安装该软件包不应产生任何不利影响。Cumulus Linux 3.7.4 及更高版本会自动处理此功能。

问题描述

最近,SSD 制造商 Innodisk 将两种 SSD 型号(3IE 和 3ME)停产/停止销售,这些型号制造商通常用于网络交换机等嵌入式设备中。3IE3、3IE4 和 3ME3 SSD 取代了这些型号。尽管 Innodisk 认为 3IE3、3IE4 和 3ME3 驱动器是先前 3IE 和 3ME 驱动器的“直接替代品”,但这些驱动器需要 ATA TRIM 命令才能正常运行,而 3IE 和 3ME 驱动器则不需要。

与大多数其他 Linux 发行版一样,Cumulus Linux 默认情况下不启用 TRIM。

使用 TRIM 命令,操作系统可以通知 SSD 固件哪些逻辑块地址 (LBA) 从文件系统的角度来看是空闲的,以便 SSD 控制器可以将映射到这些 LBA 的 TRIMmed 页面从 VALID 更改为 INVALID。

当 SSD 固件检测到 SSD 上没有足够的 FREE 块时,SSD 固件上的垃圾回收功能会将 INVALID 页面转换为 FREE 块。SSD 固件只能转换标记为 INVALID 的页面为 FREE 块。

在 3IE3、3IE4 和 3ME3 驱动器上,对于某些固件版本,TRIM 选项是操作系统可以通知 SSD 固件哪些 LBA 是空闲的唯一机制。如果未在这些驱动器上启用 TRIM 命令,则随着时间的推移,SSD 上几乎每个 FREE 块都会被数据填满并标记为 VALID。FREE 块的耗尽可能会导致 SSD 固件在 SSD 周围洗牌数据,以创建一个新的 FREE 块,它可以在其中写入新数据。这类似于对非 SSD 驱动器进行碎片整理。此过程非常耗时,并可能导致磁盘写入期间操作系统中的磁盘驱动程序超时,这反过来可能导致文件系统以只读方式挂载。

环境

Cumulus Linux 版本 3.0.0 到 3.7.3。

NVIDIA 支持大量带有 3IE3、3IE4 和 3ME3 SSD 的设备。要确定您是否拥有受影响的硬件,请运行

cumulus@switch:~$ ls /dev/disk/by-id | egrep '3ME3|3IE3|3IE4'

如果命令没有输出,则您未受影响。

解决方案

NVIDIA 正在分发一个名为 cumulus-trim 的软件包,该软件包与 Cumulus Linux 版本 3.0.0 到 3.7.3 兼容,可减轻客户设备遇到此故障的可能性。Cumulus Linux 3.7.4 及更高版本会检测需要 TRIM 的驱动器,并在安装网络操作系统期间创建 /etc/fstab 文件时启用 discard 选项。运行 apt-get upgrade 升级到 Cumulus Linux 3.7.4 或更高版本时,/etc/fstab 文件也会启用 discard 选项。

安装

要安装 cumulus-trim 软件包,请运行以下命令。安装完成后,如果软件包检测到受影响的驱动器,它将自动执行并执行操作。

cumulus@switch:~$ sudo -E apt-get update
cumulus@switch:~$ sudo -E apt-get install cumulus-trim

操作

如果 cumulus-trim 软件包检测到需要 TRIM 命令的驱动器,它将执行以下操作

  • 在软件包安装期间执行 /sbin/fstrim 命令,以指示 SSD 固件将与空闲 LBA 关联的页面标记为 INVALID,使其有资格转换为 FREE 块。
  • 创建一个 cron 作业,每 6 小时执行一次 /sbin/fstrim,以通知 SSD 固件空闲 LBA,从而允许 SSD 将关联的物理块地址 (PBA) 标记为 INVALID 并有资格转换为 FREE 块。
  • 修改 /etc/fstab 以在 SSD 挂载点上启用 discard 选项。discard 选项告诉操作系统的文件系统层,每当文件系统释放一系列文件系统块时,例如当有人删除文件或用较小的文件部分覆盖文件时,都向 SSD 固件发送 TRIM 命令。
  • 下次交换机在软件包安装后启动时,交换机检测到 discard 选项已启用,然后最后一次运行 /sbin/fstrim。然后,它会删除 cron 作业,因为它不再必要。