Raspberry Pi 5でSSDを使う上でのtips
先日、Raspberry Pi 5をSSDで高速化するための記事を作成しましたが、SSDを使う上でのちょっとしたtipsを追加します。
作業が必要なもの
dphys-swapfile
物理メモリが足りない場合に、ファイルシステム上に仮想メモリファイルを作成して物理メモリの代わりに使うことができます。この仮想メモリファイル、つまりスワップファイルを動的に確保してくれるのがdphys-swapfileサービスです。
Raspberry Pi OSでは標準インストール状態でこのdphys-swapfileが有効になっており、100MBの動的スワップが作成されるようです。
$ sudo systemctl status dphys-swapfile
● dphys-swapfile.service - dphys-swapfile - set up, mount/unmount, and delete a swap file
Loaded: loaded (/lib/systemd/system/dphys-swapfile.service; enabled; preset: enabled)
Active: active (exited) since Fri 2024-02-23 19:50:03 JST; 1 day 3h ago
Docs: man:dphys-swapfile(8)
Process: 724 ExecStart=/sbin/dphys-swapfile setup (code=exited, status=0/SUCCESS)
Process: 815 ExecStart=/sbin/dphys-swapfile swapon (code=exited, status=0/SUCCESS)
Main PID: 815 (code=exited, status=0/SUCCESS)
CPU: 35ms
2月 23 19:50:03 raspberrypi systemd[1]: Starting dphys-swapfile.service - dphys-swapfile - set up, mount/unmount, and >
2月 23 19:50:03 raspberrypi dphys-swapfile[724]: want /var/swap=100MByte, checking existing: keeping it
2月 23 19:50:03 raspberrypi systemd[1]: Finished dphys-swapfile.service - dphys-swapfile - set up, mount/unmount, and >
$ cat /proc/swaps
Filename Type Size Used Priority
/var/swap file 102384 0 -2
しかしスワップファイルは頻繁なファイルI/Oが発生するため、SSDの寿命に影響します。メモリが豊富にある8GBモデルの場合は、このサービスを止めてしまってよいでしょう。ただし自己責任でお願いします。
$ sudo swapoff -a
$ sudo systemctl stop dphys-swapfile
$ sudo systemctl disable dphys-swapfile
4GBモデルの場合は悩ましいです。SSDの寿命とのトレードオフになりますが、重いアプリをガシガシと実行する場合はdphys-swapfileサービスは有効にしておいた方がよいかも知れません。
作業が不要なもの (設定済み)
fstrim
SSD上のデータを削除した後に同じ領域に再度書き込みができるようするためには完全にデータを削除する必要があります。このTRIM処理を行うのがfstrimコマンドです (かなり端折った説明です)。
fstrimを実行することで書き込み速度の改善が見込めます。このコマンドは手動で実行することもできますが、一般的には定期的に実行することが望ましいです。Raspberry Pi OSではそのためのfstrim.timerサービスが用意されており、標準インストールしていればenabledになっているはずです。systemctl statusで確認しましょう。
$ sudo systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled; preset: enabled)
Active: active (waiting) since Fri 2024-02-23 19:50:03 JST; 1 day 4h ago
Trigger: Mon 2024-02-26 00:39:17 JST; 24h left
Triggers: ● fstrim.service
Docs: man:fstrim
2月 23 19:50:03 raspberrypi systemd[1]: Started fstrim.timer - Discard unused blocks once a week.
もしdisabledになっているようであれば、以下のように実行して有効にしましょう。
$ sudo systemctl start fstrim.timer
$ sudo systemctl enable fstrimtimer
ちなみに、fstrimを実行するにはSSDとファイルシステムがTRIMに対応している必要があります。Raspberry Pi OS標準のext4ファイルシステムはTRIMに対応しています。今時のSSDならTRIMに対応していると思いますが、念の為に確認してみましょう。lsblkコマンドを使います。
$ lsblk --discard
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
nvme0n1 0 512B 2T 0
├─nvme0n1p1 0 512B 2T 0
└─nvme0n1p2 0 512B 2T 0
DISC-GRANとDISC-MAXの列が0でなければTRIMに対応しています。
なお、TRIM対応を確認するためにhdparmコマンドを使うよう記述しているウェブサイトもありますが、hdparmコマンドはNVMe SSDには対応しておらず、実行しても以下のように空の結果しか返されません。
$ sudo hdparm -I /dev/nvme0n1p2
/dev/nvme0n1p2:
USB SSDなら以下のような結果が得られると思います。
$ sudo hdparm -I /dev/sda | grep TRIM
* Data Set Management TRIM supported (limit 8 blocks)
noatime
ファイルを参照すると、参照タイムスタンプ (atime) が書き換えられます。通常は一日一回だけ更新される (relatime) ようになっていますが、一般的な用途ではこのタイムスタンプを更新する必要性はありません。
Raspberry Pi OSの標準インストール状態ではnoatimeが設定されるようです。/etc/fstabファイルを開いて確認しましょう。
$ cat /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=${UUID1} /boot/firmware vfat defaults 0 2
PARTUUID=${UUID2} / ext4 defaults,noatime 0 1
ルートファイルシステム ( / ) の4列目が defaults,noatime になっていればOKです。もしnoatimeが設定されていない場合はnoatimeを追記して、再起動しましょう。
※/etc/fstabの編集時は充分に注意して下さい。最悪、OSが起動しなくなります。USB SSDの場合またはNVMe -> SSBアダプタがある場合は
一度電源を落としてSSDを取り出し
別のRasPiやPCにUSBアダプタ等で接続し
マウントしてfstabファイルを修正し
SSDを接続して電源を入れ直す
のような対応、あるいはRasPiしかない場合は
一度電源を落としてSSDを取り出し
RasPi OSの焼いてあるmicroSDを挿して起動し
起動順をmicroSD優先に変更してから電源を落とし
microSDは挿したままSSDを接続し直して再起動し
マウントしてfstabファイルを編集し
起動順をSSD優先に戻して電源を落とし
microSDを外してから電源を入れ直す
等の対応が必要になります。