外观
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 -avOMV 的界面里没有 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 -DDISC-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 更稳。
检查结果
systemctl list-timers fstrim.timer显示下次运行时间,journalctl -u fstrim.service里最近一次输出了裁剪量。lsblk -D里承载文件系统的那一层,DISC-GRAN和DISC-MAX非零。- 在 SMART 详情里能看到固态盘的寿命或健康指标,NVMe 的
Percentage Used、Available Spare在正常范围内。 - 把这块盘的寿命指标写进你的维护记录,下次对比增长速度。
常见问题
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.。
参考资料
- OMV 文档:前提条件(SSD、TRIM 与写入的说明)
- util-linux:
fstrim.timer与fstrim.service - Linux 内核文档:ext4 的
discard、Btrfs 挂载选项discard - Linux 内核源码:raid5 的
devices_handle_discard_safely - OMV 源码:
srv/salt/omv/setup/fstrim、smartinformation.inc(NVMe 评估)