fstrimコマンドでLinuxのSSDにTRIMを実行する方法|fstrim.timerの自動化設定と効果確認の手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > ディスク操作 > fstrimコマンドでLinuxのSSDにTRIMを実行する方法|fstrim.timerの自動化設定と効果確認の手順
「SSDに換装したのにサーバーの書き込みが遅い。」「長期稼働のサーバーでI/Oが重くなってきた。」
こういった問題の原因のひとつが、SSDのTRIM未実施です。SSDはデータを上書きする前に対象ブロックをイレースしなければならないため、OSがTRIMで「このブロックはもう使っていない」とドライブに伝えていないと、書き込み効率が少しずつ低下していきます。

LinuxはTRIMをサポートしていますが、一部のディストリビューションではデフォルトで定期実行が無効になっており、意図せず性能が劣化し続けているケースがあります。

この記事では、fstrimコマンドを使ったSSDへの手動TRIMの実行から、systemdのfstrim.timerによる週次の自動化設定まで、RHEL 9.4 / Ubuntu 24.04 LTSの実機出力を交えて解説します。discardマウントオプションとの違い、LVMやLUKS環境での注意点も説明します。

この記事のポイント

・lsblk -DでSSDのTRIM対応状況を事前確認してからfstrimを実行する
・fstrim -avで全マウント済みパーティションへ手動TRIMを一括実行できる
・systemd fstrim.timerを有効化すれば週1回の自動TRIMが設定できる
・discardマウントオプションはリアルタイムTRIMで負荷増になるため定期実行が推奨


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

SSDとTRIMの仕組み|なぜfstrimが必要なのか

HDDはデータを上書きできますが、SSD(NAND型フラッシュメモリ)は書き込み前に対象ブロックを消去(イレース)する必要があります。OSがファイルを削除してもSSD側では「使用済み」のままで、次の書き込み時にイレース処理が発生して遅くなります。

TRIMはOSからSSDへ「このLBAはもう使っていない」と伝えるATAコマンド(NVMeではDeallocate)です。TRIMを実行するとSSDコントローラーが空きブロックをあらかじめ消去できるため、次回の書き込みが高速になります。

LinuxではTRIM実行方法が2種類あります。
・定期的なTRIM(fstrim):週1回程度まとめて実行する方式。サーバーへの負荷が低く推奨される
・リアルタイムTRIM(discardマウントオプション):削除のたびにTRIMを送る方式。書き込みが多いワークロードで負荷が増えるため非推奨

本記事では推奨である定期TRIMの実装方法を解説します。

fstrimコマンドの基本的な使い方

1. SSDのTRIM対応状況を確認する

TRIMを実行する前に、対象デバイスが対応しているかをlsblk -Dで確認します。

# ブロックデバイスのTRIM対応状況を確認 lsblk -D

RHEL 9.4での実機出力例です。

NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO sda 0 512B 2G 0 |-sda1 0 512B 2G 0 |-sda2 0 512B 2G 0 `-sda3 0 512B 2G 0 nvme0n1 0 512B 2.5T 0 |-nvme0n1p1 0 512B 2.5T 0 `-nvme0n1p2 0 512B 2.5T 0

DISC-GRAN(Discard Granularity)が0でなければTRIM対応です。上の出力ではsdaもnvme0n1も512Bと表示されており、どちらもTRIMに対応しています。DISC-GRANが0のデバイスにはfstrimは効きません。

2. 手動でTRIMを実行する

fstrim -avで現在マウントされているすべてのパーティションにTRIMを一括実行できます。

# すべてのマウント済みパーティションにTRIMを実行(-v: 詳細表示) sudo fstrim -av

RHEL 9.4での実機出力例です。

/boot/efi: 24 MiB (25165824 bytes) trimmed on /dev/sda1 /boot: 576 MiB (604307456 bytes) trimmed on /dev/sda2 /: 18.6 GiB (19972612096 bytes) trimmed on /dev/sda3

各パーティションでTRIMされたバイト数が表示されます。初回実行時は大きな数値になるのが正常です。「0 B (0 bytes) trimmed」が続く場合はTRIM非対応デバイスの可能性があります(後述のトラブルシュートを参照)。

特定のマウントポイントだけTRIMする場合です。

# ルートパーティションのみTRIM sudo fstrim -v / # /var パーティションのみTRIM sudo fstrim -v /var

3. 対象ファイルシステムを確認する

fstrimが対応しているファイルシステムはext4・xfs・btrfs・vfatなど主要なものをカバーしています。現在のマウント状況を確認するには次のコマンドを使います。

# マウント済みパーティションのファイルシステムを確認 df -T # ext4・xfs・btrfsだけを絞り込む findmnt -t ext4,xfs,btrfs

TARGET SOURCE FSTYPE OPTIONS / /dev/sda3 xfs rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota /boot /dev/sda2 xfs rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota /boot/efi /dev/sda1 vfat rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii

systemd fstrim.timerで定期TRIMを自動化する

毎回手動でfstrimを実行するのは現実的ではありません。systemdのタイマーユニットfstrim.timerを使えば、週1回の定期実行を自動化できます。

1. fstrim.timerの状態を確認する

# fstrim.timerの現在の状態を確認 systemctl status fstrim.timer

有効化前の出力例(RHEL 9.4)です。

o fstrim.timer - Discard unused blocks once a week Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; disabled; preset: disabled) Active: inactive (dead) Trigger: n/a Triggers: fstrim.service

disabled・inactive (dead)の場合は、ユニット自体は存在しますが自動起動が無効の状態です。RHEL 9はデフォルト無効です。Ubuntu 24.04はインストール直後から有効なことが多いですが、念のため確認してください。

2. fstrim.timerを有効化・起動する

# fstrim.timerを有効化して即座に起動する sudo systemctl enable --now fstrim.timer

Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer -> /usr/lib/systemd/system/fstrim.timer.

有効化後に状態を再確認します。

systemctl status fstrim.timer

* fstrim.timer - Discard unused blocks once a week Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; preset: disabled) Active: active (waiting) since Fri 2026-10-10 10:00:00 JST; 5min ago Trigger: Mon 2026-10-12 00:55:00 JST; 1 day 14h left Triggers: fstrim.service Oct 10 10:00:00 server01.example.com systemd[1]: Started Discard unused blocks once a week.

active (waiting)になれば設定完了です。Trigger:行に次回実行予定時刻が表示されます。

3. fstrim.timerのスケジュールを確認する

デフォルトのタイマー設定を確認します。

systemctl cat fstrim.timer

# /usr/lib/systemd/system/fstrim.timer [Unit] Description=Discard unused blocks once a week Documentation=man:fstrim ConditionVirtualization=!container ConditionPathExists=!/etc/initrd-release [Timer] OnCalendar=weekly AccuracySec=1h Persistent=true [Install] WantedBy=timers.target

OnCalendar=weeklyはデフォルトで月曜日の深夜に実行されます。Persistent=trueの指定により、サーバーがタイマー時刻に停止していた場合は次回起動時に実行されます。

実行ログの確認方法です。

# 直近のfstrim実行履歴を確認 journalctl -u fstrim.service --since "7 days ago"

Oct 06 01:15:23 server01.example.com systemd[1]: Starting Discard unused blocks on filesystems... Oct 06 01:15:25 server01.example.com fstrim[12345]: /: 2.1 GiB (2254857216 bytes) trimmed on /dev/sda3 Oct 06 01:15:25 server01.example.com fstrim[12345]: /boot: 128 MiB (134217728 bytes) trimmed on /dev/sda2 Oct 06 01:15:25 server01.example.com systemd[1]: Finished Discard unused blocks on filesystems.

Finishedと表示されれば正常に完了しています。

discardマウントオプションとの違いと使い分け

「/etc/fstabにdiscardオプションを設定すればいいのでは?」という疑問が出ることがあります。しかしdiscardオプションはfstrim.timerとは異なるアプローチであり、本番サーバーでは推奨されません。

・discardオプション(リアルタイムTRIM):ファイル削除のたびにTRIMコマンドを即座に発行する。削除が多いワークロードではI/O性能が低下する可能性がある
・fstrim(定期TRIM):まとめてTRIMを発行するためI/Oへの影響が小さく、サーバーの安定稼働に適している

現在のマウントオプションを確認する方法です(mount コマンドの使い方も参照)。

# discardオプションが設定されているか確認 cat /proc/mounts | grep discard # または findmnt で確認 findmnt -o TARGET,OPTIONS | grep discard

discardオプションが設定されていた場合は、/etc/fstabからdiscardを削除してfstrim.timerに移行することをお勧めします。変更後は再マウントするか、次回起動時に反映させてください。

TRIMが効かない時のトラブルシュート

「0 B (0 bytes) trimmed」が続く場合

初回以降も0 bytesが続く場合、以下を確認します。

まずDISC-GRANを確認します。

lsblk -D

NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO sda 0 0B 0B 0 `-sda1 0 0B 0B 0

DISC-GRANが0Bの場合、そのデバイスはTRIM非対応です。VirtualBoxなど一部の仮想化環境ではゲストOSにTRIMが届かないことがあります。AWSのEBSやAzure Managed DiskはTRIM対応しているため、クラウド環境では基本的に問題ありません。

LVM構成でTRIMが通らない場合

LVMを使っている場合、デフォルトではTRIMコマンドがLVM層でブロックされます。/etc/lvm/lvm.confのissue_discards設定を確認します。

# issue_discards の設定値を確認 grep -n 'issue_discards' /etc/lvm/lvm.conf

# issue_discards = 0

コメントアウト状態では0(無効)扱いです。LVM経由でTRIMを通すには、バックアップを取ってからissue_discards = 1に変更します。

# 設定変更前にバックアップ sudo cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak # エディタで issue_discards = 0 を issue_discards = 1 に変更 sudo vi /etc/lvm/lvm.conf # 変更後はfstrimを手動実行して動作確認 sudo fstrim -av

LUKS(dm-crypt)環境での対応

LUKS暗号化ボリュームではdm-crypt層でもdiscardを許可する設定が必要です。/etc/crypttabを確認します。

cat /etc/crypttab

# デバイス名 UUID キーファイル オプション luks-abc123def456 UUID=abc123de-f456-7890-abcd-ef1234567890 none luks

luksだけではTRIMが通りません。luks,discardに変更する必要があります。ただし、LUKSのdiscardを有効化するとデータ利用パターンが外部から推測しやすくなるセキュリティ上のトレードオフがある点も認識した上で判断してください。

本記事のまとめ

やりたいこと コマンド・設定
TRIM対応状況を確認する lsblk -D
手動でTRIMを一括実行する sudo fstrim -av
特定パーティションだけTRIMする sudo fstrim -v /var
定期TRIMを有効化する sudo systemctl enable --now fstrim.timer
タイマーの次回実行時刻を確認する systemctl status fstrim.timer
TRIM実行ログを確認する journalctl -u fstrim.service
LVMでTRIMを通す /etc/lvm/lvm.conf の issue_discards = 1
discardオプション設定を確認する findmnt -o TARGET,OPTIONS | grep discard
SSDのTRIMは地味ですが、長期稼働するLinuxサーバーの書き込み性能を維持するための重要な設定です。特にRHEL 9ではfstrim.timerがデフォルト無効のため、新規サーバーの初期設定チェックリストに加えておくことをお勧めします。LVMやLUKSを使っている環境では追加設定が必要な点にも注意してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、ストレージ設計・パーティション構成・バックアップ戦略を含むLinux実務スキルを体系的に習得できるハンズオンセミナーを開催しています。

>> 詳しくはLinux実務ハンズオンセミナーのページへ

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。