跳转到内容

SSD、NVMe 与 TRIM ​

读完这一篇,你能确认固态盘上的定时 TRIM 在正常运行,知道在 RAID、加密、USB 盒这些场景下它为什么可能无效,并能看懂 SSD 和 NVMe 的寿命指标。

TRIM 是什么,为什么要它 ​

固态盘不能直接覆盖已有数据,写入前要先擦除整块闪存。文件系统删掉文件后,如果不告诉盘「这些块已经没用了」,盘仍把它们当成有效数据,垃圾回收时反而要搬运它们,写入变慢、写放大变大、寿命缩短。TRIM(SATA 上的叫法,NVMe 上叫 Deallocate,Linux 里统称 discard)就是文件系统告诉盘哪些块可以回收的命令。

OMV 官方文档的说法是:固态盘上 TRIM 对保持长期性能很重要,不做的话盘会随时间变慢。

OMV 已经替你配好了定时 TRIM ​

OMV 在初始化时启用了系统自带的 fstrim.timer。它是 util-linux 提供的定时器:

  • 每周运行一次,起始时间有最多 100 分钟的随机延迟;
  • 如果关机错过了时间,下次开机后补跑;
  • 它执行的是 fstrim --listed-in /etc/fstab:/proc/self/mountinfo --verbose --quiet-unsupported,只处理 /etc/fstab 或当前挂载列表里的文件系统,对不支持 TRIM 的会静默跳过,所以机械盘上它是无害的。

在 OMV 的 shell(SSH 或本机控制台,以 root 身份)里确认它在运行,两条都是只读的:

sh
systemctl list-timers fstrim.timer
journalctl -u fstrim.service -n 20 --no-pager

第一条看下次运行时间,第二条看上一次执行的输出(每个文件系统裁剪了多少字节)。

想立刻手动做一次,可以在同一个 shell 里执行下面的命令。它只告诉盘哪些空闲块可以回收,不会修改文件里的数据,但会占用一阵 I/O,选在空闲时段:

sh
fstrim -av

OMV 的界面里没有 TRIM 的开关或计划,它靠系统定时器完成。

不要加 discard 挂载选项 ​

discard 挂载选项让文件系统每次删文件都实时发 TRIM。OMV 的默认挂载选项里没有它,通常也不建议加:

  • Linux 内核文档说,ext4 的 discard 默认是关的,原因是「要等充分测试之后」,也就是实时 discard 有性能和兼容性风险。
  • 定期的 fstrim 把一周的删除合并成一次发给盘,更省事。
  • Btrfs 不一样:它在内核 6.2 起,对支持的设备默认启用异步 discard(discard=async),成本很低,不需要你操心。OMV 对固态盘上的 Btrfs 还会自动加 ssd 挂载选项。

要改挂载选项,见文件系统挂载选项与 fstab,别为了「立即回收」去加 discard。

哪些情况下 TRIM 到不了盘 ​

TRIM 要一路畅通地传到固态盘。下面这些场景会在中途被截断:

场景情况怎么办
md RAID 5/6内核模块参数 devices_handle_discard_safely 默认关闭,不向成员盘下发 discard想开要确认所有盘读已回收区域时都返回全零;一般别动
md RAID 0、1、10一般会向成员盘传递用下面的 lsblk -D 确认
LUKS 加密默认不允许 discard,因为会暴露文件系统层的信息解锁时可选「允许 discard」,有安全影响,见 LUKS 磁盘加密
USB 硬盘盒要看转接芯片,很多不透传 TRIM用 lsblk -D 检查;不支持就没办法
虚拟机里的虚拟盘取决于宿主机是否启用了 discard 或 TRIM 选项在宿主机上开启
硬件 RAID 卡视型号而定查卡的手册

在 OMV 的 shell 里用下面的命令检查某块盘到底支不支持 discard,只读:

sh
lsblk -D

DISC-GRAN 和 DISC-MAX 两列非零,说明这一层设备支持 discard;全是 0,就是不支持,或者中间有一层把它拦住了。看的是整条链,所以要检查你实际挂载文件系统的那一层(md 设备、加密映射设备等),不只是物理盘。

看 SSD 和 NVMe 的寿命与健康 ​

固态盘的主要消耗是擦写寿命。厂商的规格书会给出可写入总量(TBW)。OMV 的 存储器 → S.M.A.R.T.(Storage → S.M.A.R.T.)对固态盘同样可用,见 S.M.A.R.T.。

SATA 固态盘 ​

没有统一的寿命属性,各厂商用不同的名字,常见的有 Wear_Leveling_Count、Media_Wearout_Indicator、Percent_Lifetime_Remain、SSD_Life_Left 和 Total_LBAs_Written。多数厂商的做法是标准化值从 100 逐渐降到 0,具体含义以厂商文档为准。在详情的属性页签里找带 Wear、Life 字样的行。

NVMe ​

NVMe 有统一的健康信息,OMV 的评估逻辑直接用到这几项(在详情的扩展信息页签或 smartctl -a /dev/nvme0 里能看到):

项含义OMV 怎么判断
Critical Warning严重警告位图,备用块不足、过热、可靠性下降、只读模式等非零就显示「未知」,别当成没事
Available Spare 与 Available Spare Threshold可用备用块百分比和它的告警线低于告警线显示「损坏」
Percentage Used已用寿命的估计百分比,可以超过 100大于等于 100 显示「损坏」
Media and Data Integrity Errors介质和数据完整性错误数大于 0 显示「警告」
Data Units Written累计写入量与规格书的 TBW 对比
Temperature当前温度过热会降速,注意散热

OMV 8.5.9 修复了 ATA 和 NVMe 的状态评估,包括 NVMe 的严重警告,用旧版本的话先更新系统。

减少不必要的写入 ​

  • 系统盘用 U 盘、SD 卡或廉价闪存的,装 writecache 插件,把日志这类频繁的小写入聚在内存里。
  • OMV 官方文档提醒:休眠(suspend-to-disk)会产生大量写入,NAS 应当长期开机或直接关机;在 SSD、eMMC 上启用加密或压缩(例如 Btrfs、ZFS 的压缩)也会增加写入。
  • 固态盘写满后性能和寿命都会变差。OMV 的创建流程会把整块盘划满,所以靠用量警告阈值控制,别让它超过 80% 到 85%,见创建并挂载文件系统。
  • 用固态盘做缓存见 bcache,要小心写回模式的风险。
  • 没有断电保护的消费级固态盘,突然断电可能丢失正在写的数据,接 UPS 更稳。

检查结果 ​

  1. systemctl list-timers fstrim.timer 显示下次运行时间,journalctl -u fstrim.service 里最近一次输出了裁剪量。
  2. lsblk -D 里承载文件系统的那一层,DISC-GRAN 和 DISC-MAX 非零。
  3. 在 SMART 详情里能看到固态盘的寿命或健康指标,NVMe 的 Percentage Used、Available Spare 在正常范围内。
  4. 把这块盘的寿命指标写进你的维护记录,下次对比增长速度。

常见问题 ​

fstrim 输出「the discard operation is not supported」。 这一层不支持 discard。机械盘上是正常的;固态盘上,看上面的表找哪一层拦住了。

机械盘上也要管 TRIM 吗。 不用。fstrim.timer 会静默跳过不支持的设备。

能在 OMV 界面里看到固态盘的磨损吗。 在 存储器 → S.M.A.R.T. → 设备(Devices)里选中盘,点显示详情,NVMe 看扩展信息页签,SATA 固态盘看属性页签。仪表盘的 SMART 状态小部件只显示整体评估。

NVMe 温度很高。 检查散热和机箱风道。没有散热片的 M.2 盘在持续写入时很容易过热降速。设了 SMART 温度告警会收到邮件,见 S.M.A.R.T.。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。