Ubuntu 14.04LTS で Trim を設定
手持ちのサブPC - SSD(Solid State Drive)にインストールしている Ubuntu 12.04LTSで Firefoxの動作不良 が改善しないため 14.04LTSをクリーンインストールしました。
インストール先デバイスが SSDということで Ubuntu 14.04 LTS のインストール後に Trim を設定します。Trim は 14.04 からデフォルトで有効になっているとの事ですが、実は特定ベンダー(メーカー)の SSDに限定されています。
そのベンダーとは Intel と Samsung の2社です。今回インストールした SSD は OCZ製の AGILITY 4(下写真)なのでユーザー自身で Trimコマンドを手動実行するか、あるいは自動実行を設定する必要があります。
Linux で Trim といえば fstabに「discard」オプションを記述して / パーティションのマウント時に Trimを実行する方法があります。実際サブPCの Ubuntu 12.04LTS でもこの方法を使用していました。
しかし今回 14.04LTS の Trim について調べている中でこの方法は OS起動直後からシステムの動作が遅くなる弊害があるということで推奨されていないことが判明しました。
そこで今回は推奨されている cronジョブ(anacron)を用いて Trimコマンドのシェルスクリプトが OS起動後に自動実行するようにしました。(2016/7)
Trim を有効化するための条件
- Linux Kernel 2.6.33 以降である
- SSDが Trim をサポートしている
- ファイルシステムが EXT4 または BTRFS である
SSD ベンダーチェックを無効化
Intel と Samsung のベンダーチェックの設定を無効にします。端末エミュレータ(以降端末)から
$ sudo nano /etc/cron.weekly/fstrim
を実行し設定ファイルの最終行をコメントアウトしてその下に
#exec fstrim-all exec fstrim-all --no-model-check
のようにコードを追記します(下画像)
なぜに Intel と Samsung に限定されたベンダーチェックをしているのか調べてみると ubuntu manuals によれば Intel と Samsung 以外のファームウェアを持つその他の SSDにおいて Trim実行によるデータ消失のバグ報告があったようです。
但し、管理人の拙い英語力ではこれが正しい情報なのか確証はありません。
discard の確認
fstabに「discard」の記述がないことを確認し、もしも記述があれば削除して保存します。端末から
$ sudo nano /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=cd905f20-5fa5-4852-bf69-b6dcc58743fe / ext4 discard,errors=remount-ro 0 1
Trim 自動実行の設定
cronジョブ(anacron)を使って Ubuntu起動後に Trimコマンドを自動実行するように設定します。Trim自動実行のシェルスクリプトを /etc/cron.dailey に配置します。
端末から次のコマンド
$ sudo nano /etc/cron.daily/trim_ssd
を実行し
#!/bin/sh LOG=/var/log/trim_ssd.log echo "*** $(date -R) ***" >> $LOG fstrim -v / >> $LOG
と記述して保存します。これは cronジョブにより実行された fstrim -v / の結果を /var/log/trim_ssd.log に保存するという内容です。
したがって / 以外の例えば /boot や /home をそれぞれ個別のパーティションにインストールしている場合には
#!/bin/sh LOG=/var/log/trim_ssd.log echo "*** $(date -R) ***" >> $LOG fstrim -v / >> $LOG fstrim -v /boot >> $LOG fstrim -v /home >> $LOG
のように記述します。
続けて手動で Trimコマンドが実行される事を確認します(fig.3↓)
$ sudo fstrim -v /
[sudo] password forユーザー名:
/: 47241109504 bytes were trimmed
これは / の存在するパーティションを Trimしたセクタ数を -v オプションで標準出力するというコマンドです。
そして最後に作成した自動実行シェルスクリプトに実行権を付与します(fig.3↓)
$ sudo chmod 755 /etc/cron.daily/trim_ssd
以上で Trim自動実行の設定完了です。
下の画像は上記内容を設定したあと Trim が cronジョブにて実行された初回ログのスクリーンショットです。以降 Trim が実行される度にその日時がここへ追記されます。
ログファイル trim_ssd.log は自動的に作成されます。また anacron が実行された日付が /var/spool/anacron/cron.daily に記録され次回 anacron 実行の基準になります(fig.5↓)
上画像 trim_ssd.log の実行時刻に注目すると AM7:09 となっていますね。実は Trimは自動Trimを設定した翌日の AM6:25以前に OSが起動していないと実行されないのです。その理由は cronジョブの仕組みに由るもので次のセクションで説明しています。
cron ジョブについて
cronジョブは指定した時刻や任意の時刻にジョブ(タスク)を繰り返し実行するためのシステムです。ジョブの性質に合わせて crontab と anacrontab を併用または crontab 単独で(ダイナミックDNSへのIPアドレスUpdateなど)使用します。
anacron は cron を補完する機能です。例えば crontabで設定された時刻に停電などでジョブが実行できなかった場合次回の設定時刻まで実行されないことになります。
理屈上 OS起動のタイミングによっては永久に実行されない場合も出てくる事になります。これではまずいのでこれを解消するためにあるのが anacron です。
つまり anacronは OSが起動したタイミングで crontabまたは anacronの前回実行ログを読みに行き指定時刻または一定の時間内に実行されなかったジョブを anacrontabの設定に従って実行するわけです。
この crontab と anacrontab の仕組みや細かい設定については詳しく解説しているウェブサイトが多く存在しているのでそちらを参照してみてください。
下記の朱色が前セクションで作成した trim_ssd の実行時刻とファイルの保存先です。設定値や保存先ディレクトリは Ubuntuデフォルトのままです(設定の一部とコメントの一部を省略しています。完全版は fig.2↓)
/etc/crontab
# /etc/crontab: system-wide crontab
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
cronは「anacronが未インストールならば毎月・毎週・毎日・AM6:25に /etc/cron.daily 内のシェルスクリプトを実行する」と記述されています。すなわち AM6:25以前に OSが起動している場合のみ実行されます。
/etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# These replace cron's entries
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
anacronは「1日ごと(つまり毎日)/ var / spool / anacron / cron.daily の前回実行された日付けを読みに行き 1日以上経過してれば OS起動5分後から一定時間内に / etc / cron.daily 内のシェルスクリプトを実行する」と記述されています。
この様に設定することで結果的に OSを起動する度に Trim が実行されたか否かを確認し、未実行ならば Trim を実行する事になる訳です。この仕組みを理解しておけばその他広範囲に応用もできると思います。
Screen Shots
以下の画像は今回行った Trim設定に関するスクリーンショットです。
参考リンク
●Enable TRIM On SSD In Ubuntu For Better Performance http://www.webupd8.org/2013/01/enable-trim-on-ssd-solid-state-drives.html