プログラミング系ブログ

プログラミング系ブログ

プログラムやパソコンパーツ関連のことを、まったりと解説したり、しなかったりするブログです。

raspi4 の外付け ssd で trim コマンドを実行する

読者の皆様、いつも記事を読んでいただきありがとうございます。
今日は、前回記事の で設定したssd の trim に関して、usb 接続でも trim ができるという、
RPi4 external USB3 SSD Enable and Check Trim
のフォーラムの内容を試してみたので記事にします。

筆者の環境では成功しましたが、どうもすべての ssd でできるわけではない?ようなので、いつものように自己責任でお願いします。
あまり考えたくないですが最悪のケースだと上手く行っているように見えて、その実、データが破壊されたなんてこともあり得ますので、バックアップを取るなど、試される方は失敗した時のことも想定して慎重にお願いします。

USB SSD の TRIM

まず、前提条件として、SSD が trim に対応している必要があるので、以下のコマンドで確認します。

 sudo hdparm -I /dev/sda | grep -i trim 

以下のように

       *    Data Set Management TRIM supported (limit 8 blocks)
       *    Deterministic read ZEROs after TRIM

と表示されれば、trim に対応しています。もしも、それ以外ならば、trim をすることはできません。ただ、

sg_io: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
       *    Data Set Management TRIM supported (limit 8 blocks)
       *    Deterministic read ZEROs after TRIM

となった方は、おそらくケースが対応していないので、ケースを取り換えることで trim ができるかもしれません。

もともと筆者は、ORICO というメーカーのケースを使用しており、"sg_io: bad/missing sense data, sb[]:" が表示されて上手く行かなかったのですが、以下のロジテックのケースに取り換えたところ上手くいきました。

このケースは以前 Ubuntu を外付け ssd にインストールした記事と同一のものになります。
(フォーラムにある通り、JMicron 578 チップのケースではファームウェアを更新する必要があるらしく、ORICO のケースも JMicron 578 チップだったので、ファームウェアを更新すればできるのかもしれませんが、筆者は試していません。)
ちなみに、筆者の ssd は、MX300 CT275MX300SSD1 で、raspi 4 のカーネルバージョンは、5.4.51-v7l+ です。
あまり関係ないと思いますが、参考までに。

このケースから raspi4 を起動した状態で、試しに trim をしてみると、

sudo fstrim -v /

の結果は、

fstrim: /: the discard operation is not supported

と表示され、このままでは trim ができません。(linux は、基本的に usb 接続の ssd に対して trim ができないです。)

そこで、ssd の trim に関する?ルールファイルを記述します。
ベンダー ID と プロダクト ID が必要になるので、調べる為に以下のコマンドを打ちます。

lsusb

以下のように表示されるので、

Bus 002 Device 003: ID 152d:0567 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge
Bus 002 Device 002: ID 0789:0302 Logitec Corp. 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

筆者の場合ではケースが logitec なので、2番目を見ると分かります。
VID:PID の順番なので、0789:0302 がそれぞれ、ベンダー ID と プロダクト ID になっています。

これをもとに、ルールファイルを記述します。

sudo nano /etc/udev/rules.d/ssd-trim.rules

で新しいルールファイルを開き、(ssd-trim.rules は、trim.rules とかでもいいです)

ACTION=="add|change", ATTRS{idVendor}=="ベンダー ID", ATTRS{idProduct}=="プロダクト ID", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"

として先ほど調べたベンダー ID と プロダクト ID をルールファイルに書き込みます。筆者の場合は以下のようになります。

ACTION=="add|change", ATTRS{idVendor}=="0789", ATTRS{idProduct}=="0302", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"

f:id:dpcblog:20200806214204j:plain

保存したら再起動します。
raspi4 が起動したら再度、

sudo fstrim -v /

とすると上手く行けば trim ができると思います。
f:id:dpcblog:20200806213954j:plain
写真のように、

/: 206.4 GiB (221621776384 bytes) trimmed

などと表示されれば成功です。

このまま 1 週間ほどしばらく使ってみて異常がなければ、

sudo systemctl enable fstrim.timer

で毎週の trim を有効化してみるとよいと思います。

ですが、sd カードも同時に使用していると、sd カードも trim されてしまうらしいので、その場合はあまりよくないかも。
(出来ないはずの trim ができるだけで御の字なので、気が向いたときに手動で trim をすればよいと思います。)
sd カードも使ってるけどどうしても、毎週自動でしたい方は、

sudo nano /lib/systemd/system/fstrim.service

で、fstrim.service の設定ファイルを開き、

# 変更前
ExecStart=/sbin/fstrim -Av
# 変更後
ExecStart=/sbin/fstrim -v /

として保存し、

sudo systemctl daemon-reload

でサービスの再読み込みをしておけばいいみたいです。
ちなみに筆者はやりましたけどね...。(笑)

おわりに

以上が、USB SSD の TRIM 手順になります。
今回は、公式に推奨された操作ではないのでお勧めはしにくいのですが、 筆者のように SSD なのに TRIM ができないなんて我慢できない!という方はやってみると良いかもしれません。
もしもうまくいかなかったら申し訳ないのでくれぐれもバックアップ等には気を付けて行っていただくようにお願いします。
最後まで読んでいただきありがとうございました!