こういった問題の原因のひとつが、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で負荷増になるため定期実行が推奨
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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
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
sdaもnvme0n1も512Bと表示されており、どちらもTRIMに対応しています。DISC-GRANが0のデバイスにはfstrimは効きません。2. 手動でTRIMを実行する
fstrim -avで現在マウントされているすべてのパーティションにTRIMを一括実行できます。# すべてのマウント済みパーティションにTRIMを実行(-v: 詳細表示) sudo fstrim -av
/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する場合です。
# ルートパーティションのみ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
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を削除して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
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 |
>> 詳しくはLinux実務ハンズオンセミナーのページへ
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Linuxのディスククォータを設定する方法|quota・edquota・repquotaで使用量を制限する実践手順
- この記事の属するカテゴリ:ディスク操作へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます