SSDにLinuxMint17.2をフルインストールし、Trimなどの設定をした話

概要

これまではWindowsが入ったHDDの片隅にデュアルブートされていたLinuxMint17を使っていたが、これを機にLinuxMint17.2を購入したSSDにフルインストールする。
SSDの利用に「Trim」というものが必要だということは知っていたので、設定した経緯をまとめる。



SSDの発売から数年……。
当初は「寿命が短い」「容量の割に高い」という問題を抱えていたが、今やHDDよりも耐久性が高く、容量も申し分ないレベルにまできた。

SSDにはシステムのみを導入し、音楽や画像といったデータはHDDに保存することが好ましいらしいが、この知識は古いと思いSSDのみを購入。

購入したSSDは
MacbookがSSDストレージでみんなシステムもデータも突っ込んでいるのだからヘーキヘーキ。

それにLinuxは軽い。
デュアルブートでもシステムに割いた容量は20GBだが、必要なソフトを揃えても15GBだった。

何が必要か

1.Trimコマンドが使えるか確認いろいろ

まだパソコンの初心者だった頃、コンピュータ上で削除をすれば、そのファイルは文字通り削除されると思っていた。
だから、復旧ソフトやサルベージがどうして可能なのか不思議に思っていた。

それはユーザがアクセスできないだけで、実際にはHDD/SSDにはまだ残っている。
見えない、さわれない、容量が空くことで削除されたと思い込んでいた。
(バグでしかたどり着けないゲームのデバッグモードみたいだ)

HDDでは、実際には残っている部分に上書きすることができる。
私たちには上書きするだけの時間があればよかった。

ところが、SSDでは事情が異なる。
SSDは上書きすることができない。
つまり、新たなデータを書き込むために、すでにあるデータを削除するプロセスが必要になる。
従来と違い、(待ち時間)=(削除する時間)+(書き込む時間)が必要になる。

そこで登場するのがTrimコマンドだ。
不要になった部分を事前に削除することで、待ち時間を短縮できるようになった。
さて、Trimコマンドが有用であることがわかったが、どうすれば利用できる?

そのために、さらにいくつか確認する必要があった。

1−1.SATAモードをAHCIに変更する

※私は「AHCIに切り替える必要がある」という説明を見て実行したが、執筆段階で「AHCIをOFFにするのが基本」という記事をみつけてしまった。
その記事いわく「HDDと併用すればHDDのパフォーマンスが向上する」そうで、手元の環境でもSSD特有の高速起動ができているのでAHCIに設定している。
(SATA2で速度が理論値の半分だということを考慮してもHDDよりも明らかに起動が速い)
まずは、マザーボードがAHCIに対応している必要がある。
私のP5Q SEも古いのにページが残っていてうれしい。
2009年当時は全然理解できなかったが、多くの機能が搭載されていることに驚く。
公式では見つけられなかったのでググってAHCIがサポートされているのを確認。
PC起動時にBIOSに入って設定を変更。(スクショが撮れないので画像はない。)

1−2.Trimが対応しているファイルシステムを使う

Trimが必要であることがわかってしても、システムが対応していなければ意味がない。
今回、LinuxMintを引用するにあたって、ファイルシステムは「ext4」を用いた。(図1)

Linux カーネルバージョン 3.8 現在、次のファイルシステムが TRIM をサポートしています: Ext4BtrfsJFS, VFAT, XFSF2FS


執筆時点でのLinuxMint17.2のカーネルのバージョンは3.16だが、2.6.33以上であれば問題ないようだ。


パーティション分割はテンプレがないのでこちらを真似してみた。

1−3.SSDがTrimに対応しているか確認する

SSD自体がTrimに対応している必要があるとのことなので、そちらも確認。
コマンドは
$sudo hdparm -I /dev/sda | grep -i trim
「Trimはサポートされています」と返ってくるのでOKだろう。(図2)

図2.このSSDではTrimがサポートされていることがわかる

2.いざ、Trimを有効化

Trimが不要になった領域をあらかじめ削除する機能であることは既に述べた。
次は、「そのTrimをいつ実行させるか」だ。
fstrimコマンドを実行すると「何バイトTrimしたよ」と返ってくる。(図3)
コマンドは
$sudo fstrim -v /
というか、LinuxMintのインストール時にTrimの設定ができていなかった疑惑が出てきた(小声 
図3.トリムコマンドの実行と結果
ググってみると当たり前のように自動化の話になっているが、忘れずに定期的にTrimを実行できるなら手動でもいいのではないだろうか。
設定も面倒だが、これからのPCライフで毎日もしくは毎週実行する方が面倒なので、先駆者の記事を参考に自動化を試みたほうがよさそうだ。

選択肢は2つあるようだ。
  • マウントオプションにdiscardを追加する
  • systemdから定期的にfstrimを実行させる
マウントプションにdiscardを追加すれば、書き込み時にTrimを実行してくれるようだ。
しかし、先に書いたように、これでは待ち時間が増えることになる。

なので、cronやsystem.dから定期的にTrimを実行する方法を……取ろうと思ったのだが


Trimの設定をしていた当時、「Ubuntu14.04ではTrimを自動発行してくれるので設定は不要」という記事を見つけて手が止まった。
UbuntuベースのLinuxMintであれば適用されているのだろうか?
運良く、その質問に答えているページを見つけたので紹介する。
たしかに、/etc/cron.weekly/fstrimには「exec fstrim-all --no-model-check」と記述がある。(図4)
図4./etc/cron.weekly/fstrimの中身


ということは、Trimの定期的な発行はcronで実現していたわけで、特に何かをする必要はなくなった。
めでたしめでたし。
(もっと設定に手こずると思っていたので拍子抜けした)

3.I/Oスケジューラをdeadline/noopに設定する

SSDの寿命を伸ばすには、もう少し工夫がいるようだ。
I/Oスケジューラの知識はないので引用した方が速い。

ディスクにデータを読み書きに行くスケジュール方法が3種類(noop、deadline、cfq)あり、HDDとSSDでは物理構造が違うため、デフォルトでHDD用のcfqから、noopかdeadlineに変更すると良いようです。速度優先ならnoop、安定度でいえばdeadline、効果に懐疑的な方はデフォルトのcfqが良いみたいです。

デフォルトの CFQ (Completely Fair Queuing) スケジューラから NOOP または Deadline に切り替えたほうが良いでしょう。後者の2つは SSD のパフォーマンスを加速させます。 
例えば、NOOP スケジューラは全ての I/O リクエストに対して、ディスクに物理的に近いものを並び替えたりグループ化することなく、一つのシンプルなキューを実行します。SSD においては全てのセクタでシーク時間は同じであり、シーク時間に基づいて I/O キューを並び替える必要性には説得力がありません。

こうして調べてみると、意見はバラバラのようだ。
HDDとは仕組みが違うため、CFQである必要はないだろう。
記事の多さと安定性を求めて、ここではdeadlineを設定していた。(図5)(図6)

grubの設定を書き換えて再起動する必要があるが、先駆者の記事を参考に設定できていたようだ。

図5./etc/default/grubにdeadlineを追記

図6.スケジューラにdeadlineが適用されている

4.マウントオプションにnoatimeを設定する

「noatime」を設定することで、ファイルにアクセスした日時を保存させなくする
なるほど、これで書き込み回数を減らせるというわけだ。

atime(access time)とは,LinuxなどのUNIX系OSがファイルに記録する時刻情報の1つです。atimeには,文字通り,ファイルにアクセスした時刻が記録されます。より厳密には,ファイルの実データが読み込まれた際に,その時刻が記録されます。ファイルの管理情報(メタデータ)だけを読み込んだ場合になどには更新されません。



    アアアアッ確認したら「noatime」が設定できてない/(^o^)\(図7)

    図7./etc/fstabの中身
    nanoでもgeditでもvimでもいいので追記しちゃいましょうねぇ。(図8)
    パーティションで切ってる部分も全部適用……する必要があるんだろうな。
    同じSSD内だし。
    図8.noatimeを追記。カンマを忘れずに


  • 参考:DebianでSSDの最適化を考察【2015年版】
  • 参考:LinuxのSSD設定


  • 5.書き込み回数を抑えるためにswapさせない

    swapとは物理メモリが足りない場合にHDDに一時的にデータを書き込んでおく機能だ。
    メモリが1GB以下の時代には必要だったようだが、このPCは4GB積んであるので不要と判断し、/etc/sysctl.confに「vm.swappiness=0」を設定していた。

    ただ、この設定は文字通りスワップをゼロにするものではないらしい。
    /etc/sysctl.confにvm.swappiness=1を書く。 昔は0で良いと思ってたんですが、挙動が変わったみたいです。

    どのように挙動が変わったのか書いてなかったのでリンク先を見に行くが……わからん。
    Google翻訳にぶち込んでも「メモリは充分あるのにスワップした。vm.swappiness=0はスワップをさせないわけではない」くらい。
    挙動が変わったのは事実かもしれない。
    実際、SSDを買う前、「vm.swappiness=0」を設定しているにも関わらず、Google Chrome 40とKritaというドローソフトを使用しているときにスワップが発生した。
    4GB中、2GBも余裕があったにも関わらず。
    Chromeのバージョンが上がってからはスワップは発生していない。

    これについては検索しても誰も言及していないので「vm.swappiness=0」が踏襲されていくだろう。

    6.物理メモリに一時ファイルを任せる

    RAMディスクに一時ファイルを置くことで、高速化はもちろんSSDへの書き込みを抑制することができる。
    Windowsではシステムがメモリを大食いするのでできなかったが(8GB, 16GBなら気にならないだろうが)、Linuxなら軽い。
    このLinuxMintでも起動時には280MB、Chrome + Flash playerで1GB前後で済む。


    RAMディスクを使う命令を/etc/fstabに書き込む。
    書き込む内容は
    tmpfs /tmp tmpfs default 0 0
    オプションは付けずにメモリの半分(2GB)を割り当てる。(図9)
    Kritaでレイヤーを増やしても2GB前後なので充分だろう。
    図9./etc/fstabに命令を追加

    書き込みが多い/varディレクトリにも適用しているが、書き込みが多いのは/var/logらしいので効果あるのか不明。
    ログファイルを何かに使ったりしてないから適用しておいた。
    これでSSD用の設定は終わった。
    なお、ブラウザのキャッシュ保存場所は変更していない(中途半端

    さいごに

    参考記事を踏襲して実現できてはいるが、自分の手で確認する方法を身につける必要があると感じた。
    参考のリンクを張りながら、「〜らしい」「〜ようだ」と書きながら、「Ubuntu14.04ではTrimが自動で発行される」というニュースを見つけたときの「えっ、この辺の設定ってもしかして要らないんじゃ……」という戸惑いは衝撃だった。

    SSD用の設定がいつまで必要なのか、不要になったとどうしたらわかるのか。
    知識の広まりに時間差があることを実感する調査だった。