ソリッドステートドライブ
この記事では、ソリッドステートドライブ (SSD) や他のフラッシュメモリベースのストレージデバイスの取り扱いに関するトピックをカバーしています。
特定の目的のために SSD をパーティショニングしたい場合、フラッシュメモリ向けに最適化されたファイルシステムのリストで検討すると良いかもしれません。
一般的な利用では、自由にファイルシステムを選び、#TRIM を有効化すると良いでしょう。
使用法
TRIM
ほとんどの SSD は、長期的なパフォーマンスの維持とウェアレベリングのための ATA_TRIM コマンドをサポートしています。TechSpot 記事では、SSD をデータで埋める前と後でのパフォーマンスベンチマークの例が示されています。
Linux カーネルバージョン 3.8 以降、異なるファイルシステムに対する TRIM のサポートが継続的に追加されました。概要は以下の表を見てください:
ファイルシステム | 連続的な TRIM ( discard オプション) |
定期的な TRIM (fstrim) |
参照 と備考 |
---|---|---|---|
Btrfs | Yes | Yes | |
exFAT | Yes | Yes | fstrim はカーネル 5.13 以降、サポートされています。[1] |
ext3 | Yes | Yes | |
ext4 | Yes | Yes | [2] の "discard, nodiscard(*)" |
F2FS | Yes | Yes | |
JFS | Yes | Yes | [3] |
NILFS2 | Yes | Yes | |
NTFS-3G | No | Yes | バージョン 2015.3.14 以降 [4] |
VFAT | Yes | Yes | fstrim はカーネル 4.19 以降、サポートされています。[5] |
XFS | Yes | Yes | [6] |
TRIM のサポートを確認するには、以下を実行してください:
$ lsblk --discard
そして、DISC-GRAN (discard granularity) と DISC-MAX (discard max bytes) 列の値を確認してください。値が 0 でなければ、TRIM をサポートしていることを意味します。
あるいは、hdparm パッケージをインストールし、以下を実行してください:
# hdparm -I /dev/sda | grep TRIM
* Data Set Management TRIM supported (limit 1 block)
定期的な TRIM
util-linux パッケージは fstrim.service
と fstrim.timer
systemd ユニットファイルを提供しています。タイマーを有効化すれば毎週サービスが実行されます。このサービスは、discard 操作をサポートしているデバイス上のマウント済みのファイルシステムすべてに対して fstrim(8) を実行します。
タイマーは最後に実行してから一週間経過したことを知るために (最初に実行したときに作成される) /var/lib/systemd/timers/stamp-fstrim.timer
のタイムスタンプを使います。そのため、anacron のように、何度も頻繁に実行される恐れはありません。
ユニットの活動と状態を取得するには、journalctl を見てください。タイマーの周期や実行されるコマンドを変更するには、提供されているユニットファイルを編集してください。
連続的な TRIM
TRIM コマンドを定期的に (fstrim.timer
を使用する場合はデフォルトで1週間に1度) 発行するのではなく、ファイルが削除されるたびに TRIM コマンドを発行することも可能です。後者は、連続的な TRIM (continuous TRIM) として知られています。
/etc/fstab
内で discard
オプションを使うことにより、デバイスオペレーションでの連続的な TRIM を有効化します:
/dev/sda1 / ext4 defaults,discard 0 1
ext4 ファイルシステムでは、tune2fs を使って discard
フラグをデフォルトマウントオプションとして設定することもできます:
# tune2fs -o discard /dev/sdXY
外部ドライブの場合は、/etc/fstab
内のエントリではなくデフォルトマウントオプションを使うと便利です。そのようなパーティションは、他のマシンでもデフォルトのオプションを使ってマウントされるからです。この方法では、すべてのマシンで /etc/fstab
を編集する必要はありません。
デバイス全体を trim する
一度に SSD 全体を trim したい場合 (例えば、新しいインストールのためや、そのドライブを売りたい場合など)、blkdiscard コマンドが使えます。
LVM
ファイルシステムから論理ボリュームへ渡された TRIM 要求は、自動的に物理ボリュームへ渡されます。追加の設定は必要ありません。
デフォルトでは、LVM のオペレーション (lvremove、lvreduce、そしてその他すべて) は物理ボリュームに TRIM 要求を発行しません。これは、vgcfgrestore(8) を使って以前のボリュームグループ設定を復元できるようにするためです。/etc/lvm/lvm.conf
内の issue_discards
は、論理ボリュームがその基底となる物理ボリュームの領域をもはや使用しなくなった時に、その物理ボリュームに discard 要求を送信するかどうかを制御します。
dm-crypt
ルート以外のファイルシステムの場合、/etc/crypttab
を編集して、SSD 上の暗号化されているブロックデバイスのオプションリストに discard
を追加してください (dm-crypt/システム設定#crypttab を見てください)。
ルートファイルシステムの場合、dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート の指示に従って、ブートローダーの設定に適切なカーネルパラメータを追加してください。
パフォーマンスを最大化する
パフォーマンスの最大化#ストレージデバイス のヒントに従ってドライブのパフォーマンスを最大化しましょう。
セクタサイズ
Advanced Format#ソリッドステートドライブ を見てください。
SSD のメモリセルのクリア
時々、SSD のセルを完全にリセットしてデバイスにインストールした時と同じ初めの状態にすることで製造時の書き込みパフォーマンスを取り戻したいと思うことがあるかもしれません。SSD の書き込みパフォーマンスはネイティブの TRIM サポートを使っていても時間経過で落ちていきます。TRIM はファイル削除に対するセーフガードとして働くだけで、増加保存などの代わりにはなりません。
#SATA や #NVMe の場合、ソリッドステートドライブ/メモリセルの消去 に書かれている適切な手順に従うことでリセットすることができます。
セキュリティ
Hdparm で "frozen" 状態と表示される
一部のマザーボードの BIOS は、初期化時に SATA デバイスに対して "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 パスワードによってロックされていないこと、そして frozen 状態によってデバイスを (実行時にパスワードを設定してデバイスをロックさせてしまうような) マルウェアから保護していることを示しています。
"frozen" 状態のデバイスにパスワードを設定したい場合、それに対応しているマザーボード BIOS が必要です。ハードウェア暗号化に必要なので、多くのノートパソコンでサポートされていますが、デスクトップやサーバーのボードではサポートがあるかどうかはっきりしないことがあります。
例えば、Intel DH67CL/BL マザーボードの場合、設定にアクセスするには物理的なジャンパによってマザーボードを "maintenance mode" に設定する必要があります ([10], [11] を参照)。
SSD を消去するときは、ディスクの完全消去#hdparm や ソリッドステートドライブ/メモリセルの消去 を見て下さい。
スリープから復帰したあとに SSD 状態を "frozen" にする
スリープからの復帰時に SSD は "frozen" 状態を失っていることが多く、ソリッドステートドライブ/メモリセルの消去 で説明されているように ATA SECURE ERASE コマンドに対して脆弱になっています。
この問題を回避するために、スリープからの復帰後にスクリプトを実行することができます:
/usr/lib/systemd/system-sleep/ssd-freeze.sh
#!/bin/sh if [ "$1" = 'post' ]; then sleep 1 if hdparm --security-freeze /dev/disk/by-id/ata-name-of-disk; then logger "$0: SSD freeze command executed successfully" else logger "$0: SSD freeze command failed" fi fi
ハードウェア暗号化
#Hdparm で "frozen" 状態と表示される で説明されているように、BIOS でストレージデバイス (SSD/HDD) のパスワードを設定すると、それをサポートしているデバイスのハードウェア暗号化も初期化される場合があります。デバイスが OPAL 規格にも準拠している場合、パスフレーズを設定する機能が BIOS に無くとも、これを行える場合があります。自己暗号化ドライブ を見てください。
トラブルシューティング
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 を無効化してみてください。
ファームウェア
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 に 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