一見TRIMの設定ができたように見えていたが後日問題(後述)が発覚した。
原因等が分かるまでは重要な環境では実行しないでほしい。(2023/1/10 追加)
はじめに
NanoPi NEO / NanoPi NEO2 NASキットに搭載したSATA SSDがfstrim
コマンドを使用してTRIM操作できないので対処した。
環境
- NanoPi NEO / NanoPi NEO2
- NanoPi NEO / NanoPi NEO2 NASキット(1-bay NAS Kit v1.2 for NanoPi NEO&NEO2)
- Armbian 22.11.1 Bullseye (Kernel 5.15.80)
状況
SATA SSDに移動してある/
パーティションに対してfstrim
コマンドを実行するとエラーメッセージが出る。
# fstrim -v /
fstrim: /: the discard operation is not supported
NanoPi NEO / NanoPi NEO2 NASキットでは、SATA SSDは内部的にUSB接続されている。USB接続されたSSDは環境や設定によってTRIMできないらしい。
対処手順
1. root
で/etc/udev/rules.d/
にルールファイルを作成する。ファイル名は例えば99-usap-trim.rules
にする(ファイル名の拡張子がrules
ならよい)
ACTION=="add|change", ATTRS{idVendor}=="152d", ATTRS{idProduct}=="0578", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"
152d
、0578
は、lsusbコマンドの出力結果を元にしている。
2. システムを再起動
3.trim出来るようになった。
# fstrim -v /
/: 461.5 MiB (483868672 bytes) trimmed
発覚した問題
dmesg
コマンドで確認すると以前は出ていなかったセクターエラーがたくさん出ていることに気が付いた。(sdaはTRIM対象のSSD)なお、この時点で破損したファイル等は確認できていない。
[294720.241259] sd 0:0:0:0: [sda] tag#18 UNKNOWN(0x2003) Result: hostbyte=0x00 driverbyte=DRIVER_OK cmd_age=0s
[294720.241332] sd 0:0:0:0: [sda] tag#18 Sense Key : 0x5 [current]
[294720.241347] sd 0:0:0:0: [sda] tag#18 ASC=0x26 ASCQ=0x0
[294720.241369] sd 0:0:0:0: [sda] tag#18 CDB: opcode=0x42 42 00 00 00 00 00 00 00 18 00
[294720.241384] blk_update_request: critical target error, dev sda, sector 16853776 op 0x3:(DISCARD) flags 0x800 phys_seg 1 prio class 0
操作するにしたがってセクターエラーのメッセージが増えているようだったのでSDカードで一度リブートしてからSSDのファイルシステムをfsck
コマンドで修復した。その後はセクターエラーがいったん出なくなった。
当初fstrim
コマンド発行後にセクターエラーが出ているかとも思ったが、しばらく起動しておくとfstrim
コマンドを発行しなくてもセクターエラーが出ることがあった。
状況としては、
- 対象のSSD(Intel 525s)はTRIM対応
- OS(Armbian、Debian bullseyeベース )、ファイルシステム(ext4)もTRIM対応
- 対象のSSDは
discard
オプションなしでマウントされている(discard
オプションで自動的にTIRMが実行される)
で、いろいろ調べてみるとOSインストール時点でfstrim.timer
サービスが有効になっていて、週1回TRIMが自動実行される設定になっていた。そのためセクターエラーが出ている可能性が濃厚と判断。別のNanoPi NEO+NASキットでもfstrim.timer
実行直後にセクターエラーが多発していることも確認。
残るポイントはUSB→eSATA変換の周り(JMicronチップ、ファームウェア、ドライバ)周りだが、そもそもTRIMできなくて問題が発生しているわけではないので、また時間がある時に追加調査しようと考えている。(NASキットに使われているJMicronチップはファームウェアの問題も報告されているので、JMicronチップのファームウェアを無理矢理バージョンアップすればいいかもしれない)
補足情報
当初JMicronチップはOS(armbian)が認識しているJMS578
と記載していた。しかし、チップのシルク印刷がJMS567
であり、メーカーの仕様上もJMS567
であることからJMS567
に記事の記載を変更した。いろいろ調べてみるとJMS578
のIDを返すファームウェアが乗っているJMS567
である可能性が高そう。
NanoPi NEO / NanoPi NEO2とSATA SSDはNASキット基板上のUSB-SATA変換チップ(JMicron JMS567
)を経由してUSB(USB2.0=480Mbps、遅い)接続されている。そしてJMicron JMS567
とSATA SSDの間はSATA3(6Gbps)で接続されている。
plantUMLで図にするとこんな感じ。
lsusb
コマンドの出力結果でBus 004 Device 002
と認識されているのがJMicron JMS567
。ベンダーIDが152d
、プロダクトIDが0578
になっている。(ネットを検索すると、JMS567
やJMS578
について複数のプロダクトIDが見つかる12。lsusb
コマンドの結果はJMS567
/JMS578
に関してはあまりあてにできないのかもしれない)
# lsusb
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS578 SATA 6Gb/s
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 009 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
SATA SSDはUSB2.0(480Mbps)接続だが、ちゃんとUASP対応になっている(Bus 04.Port 1
につながっているDev 2
がDriver=uas
になっている)
# lsusb -t
/: Bus 09.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M
/: Bus 08.Port 1: Dev 1, Class=root_hub, Driver=ohci-platform/1p, 12M
/: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=ohci-platform/1p, 12M
/: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=ohci-platform/1p, 12M
/: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/1p, 480M
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=uas, 480M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/1p, 480M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ohci-platform/1p, 12M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/1p, 480M