ソリッドステートドライブ
この記事では SSD (solid state drive) について Linux と関係する様々なことを記述していますが、一般的な根本原則やキーポイントは Windows ファミリーや macOS など他のオペレーティングシステムで SSD を使っているユーザーも応用することができます。さらにそのような情報に加えて、Linux ユーザーはここに書かれた方法で SSD を最適化・調整することが可能です。
目次
概要
イントロダクション
Solid State Drive (SSD) は PnP デバイスではありません。パーティションアライメント、ファイルシステムの選択、TRIM サポートなどの特別事項は SSD の性能を最適化するために必要になります。この記事には Linux で SSD から最高の性能を引き出すための情報を集めています。コンテンツはトピックでまとめられており、必ずしも系統的または時系列順に並べられているわけではないので、実際に推奨事項をやろうとする前に記事全体を読むと良いでしょう。
HDD に対する利点
- 高速な読み込み速度 - 最新のデスクトップ HDD のおよそ2-3倍高速 (7,200 RPM で SATA2 インタフェースを使用した場合に比べて)。
- 一定の読み込み速度 - デバイス全体で読み込み速度の低下がありません。HDD はドライブのヘッドが外縁から HDD プラッタの中心に移動するにつれパフォーマンスがだんだん低下します。
- 極小のアクセス時間 - HDD よりおおよそ100倍高速。例えば、デスクトップ HDD の 12-20 ms (12,000-20,000 us) に対して 0.1 ms (100 us)。
- 高度な信頼性。
- 可動部が存在しない。
- 熱の発生が少ない。
- 消費電力が少ない - HDDが回転速度によって 10-30ワット消費するのに対して、SSDはアイドル状態で1ワット、読み書き中は1-2ワット。
- 軽量 - モバイル端末のストレージに最適。
HDDに対する欠点
- 容量単位のコスト (1GBあたり10から20セント近く、それに対してHDDでは1GBあたり1または2セント)。
- 市販されているモデルの容量が HDD よりも少ない。
- セルの大きさによって回転メディアと異なるファイルシステムの最適化が必要。現代の OS はアクセスを最適化するためにフラッシュ変換レイヤを使用しており生のフラッシュアクセスは遮蔽されている。
- パーティションとファイルシステムを SSD の特性にあわせて調整する必要がある。ページサイズや消去ページサイズは自動検出されません。
- セルは劣化します。一般的に、50nm プロセスによる民生の MLC セルは10000回の書き込み、35nm では5000回の書き込み、25nm では3000回の書き込みが出来ます(小さくなればなるほど高密度で値段が安くなります)。書き込みが適当に散らばっていて、小さすぎず、セルにピッタリはまるようになったときに、容量の倍数である最終的な SSD の書き込みボリュームに移されます。日々の書き込みボリュームは耐用年数から差引かなければなりません。ただし、最新のハードウェアで行われた試験 [1][2][3][4] では SSD の劣化は無視できるほどで、人為的に書き込みボリュームを多くしても SSD の耐用年数は HDD と並ぶとされています。
- ファームウェアやコントローラーが複雑。たまにバグが存在することもあります。最新のコントローラーは HDD と匹敵するほどの電力を消費します。コントローラーにはガベージコレクションの付いたログ構造化ファイルシステムに相当するものが実装されています。回転メディアにあわせて作られた SATA コマンドは変換されます。ファームウェアによってはオンザフライで圧縮を行います。反復書き込みをフラッシュ領域全体に散らばらせて、特定のセルがすぐに劣化するのをふせぎます。また、書き込みをまとめることで小さな書き込みがそれと同じ回数大きなセルを消去することにならないようにしています。最後にデータを含むセルを移動するので時間の経過によってセルが中身を失うことはありません。
- ディスクが満杯になるにつれてパフォーマンスが低下します。一般にガベージコレクションはあまり上手く実装されておらず、空き領域が完全に空のセルに集められているとは限りません。
購入前に考慮すべき事項
最新の SSD を買う前に見ておくべきポイントがいくつか存在します。
- TRIM のネイティブサポートは不可欠です。SSD の寿命を伸ばして、少しずつおこる書き込み操作のパフォーマンスの減少を少なくします。
- 適切な容量の SSD を買うことが重要です。カーネルが SSD パーティションを効率的に利用するために占有率は75%以下が望まれます。
SSD のパフォーマンスを最大化させるヒント
パーティションアライメント
消去ブロックサイズに揃えたパーティションを使用することを強く推奨します。昔は、パーティション分けをするときに手動で計算して設定する必要がありました。現在では一般的なパーティションツールのほとんどが(最新バージョンを使っていれば)パーティションアライメントを自動的に行います:
- fdisk
- gdisk
- gparted
- parted
パーティションが調整されているか確認するには、以下のように /usr/bin/blockdev
を使って問い合わせて下さい。'0' が返ってくれば、パーティションは揃えられています:
# blockdev --getalignoff /dev/<partition> 0
TRIM
ほとんどの SSD は長期間パフォーマンスを維持するために ATA_TRIM コマンドをサポートしています。ベンチマーク前後などの詳細は、この チュートリアルを見て下さい。
Linux カーネルバージョン 3.8 現在、次のファイルシステムが TRIM をサポートしています: Ext4, Btrfs, JFS, VFAT, XFS, F2FS。
ntfs-3g バージョン 2015.3.14 から、NTFS ファイルシステムも TRIM がサポートされています [5]。
VFAT はマウントフラグ discard
によって TRIM をサポートしています、カーネル4.19以降はfstrim
もサポートしています。
この記事のファイルシステムの選択のセクションにさらに詳しく書かれています。
TRIM のサポートを確認する
# hdparm -I /dev/sda |grep TRIM * Data Set Management TRIM supported (limit 1 block) * Deterministic read data after TRIM
"limit 1 block" や "limit 8 block" の意味は、wikipedia:TRIM#ATA を見て下さい。
fstrim で定期的に TRIM を適用する
(base と base-devel に含まれている) util-linux パッケージには fstrim.service
と fstrim.timer
の systemd ユニットファイルが入っています。このタイマーを有効化すれば毎週サービスが実行され、discard をサポートしているデバイス上のマウント済みファイルシステム全てが trim されます。
タイマーは最後に実行してから一週間経過したことを知るために (最初に実行したときに作成される) /var/lib/systemd/timers/stamp-fstrim.timer
のタイムスタンプを使います。そのため、何度も頻繁に実行される恐れはありません。
journalctl
や systemctl status
コマンドを使うことでユニットの活動状態を調べることができます:
# journalctl -u fstrim
... <shows several log entries if enabled> ...
# systemctl status fstrim
● fstrim.service - Discard unused blocks Loaded: loaded (/usr/lib/systemd/system/fstrim.service; static; vendor preset: disabled) Active: inactive (dead) since lun. 2015-06-08 00:00:18 CEST; 2 days ago Process: 18152 ExecStart=/sbin/fstrim -a (code=exited, status=0/SUCCESS) Main PID: 18152 (code=exited, status=0/SUCCESS) juin 08 00:00:16 arch-clevo systemd[1]: Starting Discard unused blocks... juin 08 00:00:18 arch-clevo systemd[1]: Started Discard unused blocks.
タイマーの実行間隔を変更したい場合は、ユニットファイルを編集してください。
マウントフラグで TRIM を有効にする
/etc/fstab
のエントリで discard
オプションを使うことで TRIM コマンドが有効になります:
/dev/sda2 /boot ext4 defaults,noatime,discard 0 2 /dev/sda1 /boot/efi vfat defaults,noatime,discard 0 2 /dev/sda3 / ext4 defaults,noatime,discard 0 2
TRIM の一番大きな恩恵は速度です。SSD は効率的に ガーベジコレクション を行えるようになります。ただし、効果はモデルによって異なり、初期に製造された SSD の場合、逆効果が現れることもあります。このため、ディストリビューションによっては TRIM を使用しないように決定したところもあります (例えば Ubuntu。この記事 や 関連するブループリント を参照)。
tune2fs で TRIM を有効にする (非推奨)
tune2fs を使って静的に trim フラグを設定することができます:
# tune2fs -o discard /dev/sdXY
LVM で TRIM を有効にする
/etc/lvm/lvm.conf
で issue_discards
オプションを有効にしてください。
dm-crypt で TRIM を有効にする
/etc/crypttab
を設定して SSD 上の暗号化されたブロックデバイスのオプションのリストに discard
を含めて下さい。この discard オプションは discard リクエストが暗号化されたブロックデバイスを通過するのを許可します。これによって SSD ストレージのパフォーマンスは向上しますが、セキュリティに影響があります。このセクションを見て下さい。
I/O スケジューラー
デフォルトの CFQ (Completely Fair Queuing) スケジューラから NOOP または Deadline に切り替えたほうが良いでしょう。後者の2つは SSD のパフォーマンスを加速させます。例えば、NOOP スケジューラは全ての I/O リクエストに対して、ディスクに物理的に近いものを並び替えたりグループ化することなく、一つのシンプルなキューを実行します。SSD においては全てのセクタでシーク時間は同じであり、シーク時間に基づいて I/O キューを並び替える必要性には説得力がありません。
Arch ではデフォルトで CFQ スケジューラが有効にされています。/sys/block/sdX/queue/scheduler
の中身を見て確認してください:
$ cat /sys/block/sdX/queue/scheduler
noop deadline [cfq]
表示されているスケジューラの中で角括弧で囲まれているのが現在使われているスケジューラです。
ユーザーは再起動することなくスケジューラを変更することができます:
# echo noop > /sys/block/sdX/queue/scheduler
または:
$ sudo tee /sys/block/sdX/queue/scheduler <<< noop
この方法は永続的ではありません (再起動で変更は失われます)。ファイルの中身をもう一度見て "noop" が使われるようになっていることを確認してください。
カーネルパラメータ (シングルデバイス)
システムの唯一のストレージデバイスが SSD である場合、elevator=noop
カーネルパラメータでシステム全体の I/O スケジューラを設定できます。
1つのデバイスまたは HDD/SSD 混合環境で udev を使って設定する
上の方法は確かに動作しますが、あくまで回避策と考えられています。つまり、デバイスのスケジューラを一番最初に実行するシステムを使うのが好ましいでしょう。この場合、それは udev で、設定するのに必要なのはシンプルな udev ルールだけです。
設定するには、以下を作成してください:
/etc/udev/rules.d/60-schedulers.rules
# set deadline scheduler for non-rotating disks ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
Deadline/CFQ をお望みのスケジューラに設定してください。次に起動した時に変更が適用されるはずです。新しいルールが適用されているか確認するには:
$ cat /sys/block/sdX/queue/scheduler # where X is the device in question
SSD のスワップ領域
SSD 上にスワップパーティションを配置することが可能です。最新のデスクトップではメモリが2ギガ以上積まれておりスワップはほとんど使いません。ただしハイバネート機能を利用するシステムの場合は別です。以下のようにシステムの "swappiness" を減らすことで SSD にあるスワップへの書き込みを減らすことが推奨されます:
# echo 1 > /proc/sys/vm/swappiness
パフォーマンスの最大化の記事で推奨されているように行うこともできます:
/etc/sysctl.d/99-sysctl.conf
vm.swappiness=1 vm.vfs_cache_pressure=50
Hdparm で "frozen" 状態と表示される
マザーボードの BIOS は初期化時に取り付けられたストレージデバイスに "security freeze" コマンドを実行することがあります。同様に SSD (や HDD) の BIOS もファクトリーにおいて "security freeze" に設定されていることがあります。どちらにしても、以下の出力のようにデバイスのパスワードセキュリティ設定が "frozen" になります:
# hdparm -I /dev/sda
Security: Master password revision code = 65534 supported not enabled not locked frozen not expired: security count supported: enhanced erase 4min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
デバイスのフォーマットやオペレーティングシステムのインストールといった操作はこの "security freeze" の影響を受けません。
上記の出力はデバイスが起動時に HDD パスワードによってロックされていないこと、そして凍結状態によってデバイスを (パスワードを設定してデバイスをロックさせてしまうような) マルウェアから保護していることがわかります。
凍結状態のデバイスにパスワードを設定したい場合、それに対応しているマザーボード BIOS が必要です。ハードウェア暗号化に必須なので、ノートパソコンでは大抵サポートされていますが、デスクトップやサーバーのボードではサポートがあるかどうかはっきりしないことがあります。例えば、Intel DH67CL/BL マザーボードの場合、設定にアクセスするには物理的なジャンパによってマザーボードを "maintenance mode" に設定する必要があります ([8], [9] を参照)。
SSD を消去するときは、ディスクの完全消去#hdparm や下のセクションを見て下さい。
SSD Memory Cell Clearing
時々、SSD のセルを完全にリセットしてデバイスにインストールした時と同じ初めの状態にすることで 製造時の書き込みパフォーマンス を取り戻したいと思うことがあるかもしれません。SSD の書き込みパフォーマンスはネイティブの TRIM サポートを使っていても時間経過で落ちていきます。TRIM はファイル削除に対するセーフガードとして働くだけで、増加保存などの代わりにはなりません。
リセットは SSD メモリセルの消去の wiki 記事に書かれている3つのステップで簡単に行なえます。何らかの理由で SSD の BIOS を使わずにディスクのデータを消去したい場合はディスクの完全消去#フラッシュメモリを読んでください。
ファイルシステムの選択
Btrfs
Btrfs のサポートは Linux カーネルのメインライン 2.6.29 リリースから含まれています。ext4 の後継として使っているアーリーアダプターもいますが、人によってはまだ日常的な利用には適さないと感じるかもしれません。詳細は Btrfs の記事を読んで下さい。
Ext4
Ext4 は SSD をサポートしているもうひとつのファイルシステムです。2.6.28 から安定していると考えられており日常的な利用ができるレベルまで成熟しています。ext4 のユーザーは fstab で discard
マウントオプションを使って (もしくは tune2fs -o discard /dev/sdaX
で) 明示的に TRIM コマンドのサポートを有効にする必要があります。
ext4 に関する詳細情報はカーネルツリーの公式ドキュメントを見て下さい。
XFS
ext4 や btrfs に加えて、XFS も TRIM をサポートしていることを知っているユーザーは多くないでしょう。通常の方法で有効にすることができます。つまり、上述の discard オプションを利用するか、または fstrim コマンドを使うか選択することが可能です。詳細は XFS wiki を見て下さい。
JFS
Linux カーネルバージョン 3.7 から、完全な TRIM サポートが追加されました。現在、このトピックに関する情報はあまり揃っていませんが、Linux ニュースサイト によって確かに取り上げられています。discard
マウントオプションにより、または fstrim を使う方法で有効にすることが可能です。
他のファイルシステム
他にも SSD に特化して設計されたファイルシステムが存在します。F2FS などがあります。
ファームウェアのアップデート
ADATA
ADATA は Linux (i686) で利用できるユーティリティを、ここ にある彼らのサポートページに用意しています。モデルを選択すれば最新のファームウェアへのリンクが表示されます。
最新の Linux アップデートユーティリティはファームウェアと一緒に入っており root で実行してください。最初にバイナリファイルに対して適切なパーミッションを設定する必要があるかもしれません。
Crucial
Crucial は ISO イメージを使ってファームウェアをアップデートする方法を提供しています。ここ から製品を選んで "Manual Boot File" をダウンロードすることでイメージを入手できます。
M4 Crucial モデルを使っている場合、smartctl
でファームウェアのアップグレードが必要かどうかチェックすることが可能です:
$ smartctl --all /dev/sdX
==> WARNING: This drive may hang after 5184 hours of power-on time: http://www.tomshardware.com/news/Crucial-m4-Firmware-BSOD,14544.html See the following web pages for firmware updates: http://www.crucial.com/support/firmware.aspx http://www.micron.com/products/solid-state-storage/client-ssd#software
上記のような警告が表示された場合は重要なデータをバックアップしてから直ちにアップグレードを行うことが推奨されます。ISO イメージと Grub を使用して Crucial MX100 のファームウェアをアップデートする手順は こちら を参照してください。
Intel
Intel は Intel® Solid-State Drive Toolbox ソフトウェアが対応していないオペレーティングシステム向けに、Linux ライブシステムベースの Firmware Update Tool を用意しています。
Kingston
Kingston は Sandforce コントローラを搭載しているドライブのファームウェアをアップデートする Linux ユーティリティを用意しています。Kingston の SSD のサポートページ で見つけることができます。使用している SSD のモデルにあわせてページを開いてください。例えば SH100S3 SSD のサポートは HyperX のサポートページ です。
Mushkin
マイナーな Mushkin ブランドのソリッドステートドライブも Sandforce コントローラーを使っており、ファームウェアをアップデートする Linux ユーティリティ (Kingston のものとほとんど同じ) が存在します。
OCZ
OCZ は Linux 用の Command Line Online Update Tool (CLOUT) を用意しています。ocz-ssd-utilityAUR, ocztoolboxAUR, oczcloutAUR パッケージでインストールすることができます。
Samsung
Samsung は Magician Software 以外の方法によるアップデートを"サポートしない"としていますが、不可能ではありません。Magician Software を使ってファームウェアのアップデートを起動する USB ドライブを作成することができるようですが、一番簡単な方法はファームウェアのアップデート用のブータブル ISO イメージを使用することです。イメージは ここ から入手することが可能です。また、samsung_magicianAUR[リンク切れ: パッケージが存在しません] パッケージでインストールすることができます。Magician がサポートしているのは Samsung ブランドの SSD だけです。OEM 供給されている Samsung 製の SSD はサポートされていません (Lenovo 向けの SSD など)。
(Microsoft Windows で Samsung の "Magician" ソフトウェアを使わずに) Linux で作成したライブ USB スティックからファームウェアアップデートを実行したい場合は、この記事 を参照してください。
SanDisk
SanDisk は SanDisk SSD Toolkit でサポートされていないオペレーティングシステムにおいて SSD のファームウェアアップデートをするための ISO ファームウェアイメージを作成しています。SSD のモデルだけでなく、SSD の容量にあわせて適切なファームウェアを選択する必要があります (例: 60GB または 256GB)。適当な ISO ファームウェアイメージを焼いたら、PC を再起動して新しく作成した CD/DVD ブートディスクで起動してください (USB スティックからでも動作するかもしれません)。
ISO イメージには Linux カーネルと initrd が含まれています。それらを /boot
パーティションに展開して GRUB や Syslinux で起動してファームウェアをアップデートしてください。
ファームウェアのアップデートが列挙された一つのページは存在しませんが (サイトがわかりづらい)、以下が関連するリンクです:
- SanDisk Extreme SSD の ファームウェアのリリースノート と 手動ファームウェアアップデートのバージョン R211。
- SanDisk Ultra SSD の ファームウェアのリリースノート と 手動ファームウェアアップデートのバージョン 365A13F0。
トラブルシューティング
SSD の問題は Linux 固有の問題ではないファームウェアのバグである可能性も存在します。SSD に関しては、問題のトラブルシューティングを始める前に、ファームウェアのアップデートが存在しないか確認してみてください:
- SSD のファームウェアをアップデートする。#ファームウェアのアップデート を参照。
- マザーボードの BIOS/UEFI をアップデートする。Linux から BIOS を書き換えるを参照。
ファームウェアのバグであったとしても、解決できることがあります。ファームウェアにアップデートが存在しなかったり、ファームウェアのアップデートをしたくない場合、以下のセクションを見て下さい。
NCQ エラーを解消する
SSD や SATA チップセットによっては Linux Native Command Queueing (NCQ) が正しく動作しないことがあります。dmesg に以下のようなエラーが表示されます:
[ 9.115544] ata9: exception Emask 0x0 SAct 0xf SErr 0x0 action 0x10 frozen [ 9.115550] ata9.00: failed command: READ FPDMA QUEUED [ 9.115556] ata9.00: cmd 60/04:00:d4:82:85/00:00:1f:00:00/40 tag 0 ncq 2048 in [ 9.115557] res 40/00:18:d3:82:85/00:00:1f:00:00/40 Emask 0x4 (timeout)
起動時に NCQ を無効にするには、ブートローダーの設定におけるカーネルコマンドラインに libata.force=noncq
を追加してください。ポート 1 のディスク 0 の NCQ だけを無効化するには次を使用: libata.force=1.00:noncq
。
また、sysfs を使うことで再起動せずに特定のドライブの NCQ を無効化することもできます:
# echo 1 > /sys/block/sdX/device/queue_depth
問題が解決しなかったり他の問題が発生する場合は、バグレポートを作成してください。
SATA の電源管理関連のエラーを解消する
SATA Active Link Power Management (ALPM) が有効になっている場合にエラーを吐く SSD も存在します (例: Transcend MTS400)。ALPM はデフォルトで無効になっており、省電力デーモンによって有効になります (例: TLP, Laptop Mode Tools)。
省電力デーモンを使っていて SATA 関連のエラーが表示される場合、バッテリーと AC 電源のプロファイルを max_performance
に設定して ALPM を無効化してみてください。
参照
- SSD に Arch をインストールすることについての Reddit における討論
- Re: Varying Leafsize and Nodesize in Btrfs
- Re: SSD alignment and Btrfs sector size
- Erase Block (Alignment) Misinformation?
- Is alignment to erase block size needed for modern SSD's?
- Btrfs support for efficient SSD operation (data blocks alignment)
- SSD, Erase Block Size & LVM: PV on raw device, Alignment