ソリッドステートドライブ

提供: ArchWiki
2022年11月9日 (水) 16:58時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎LVM: 翻訳)
ナビゲーションに移動 検索に移動

関連記事

この記事では、ソリッドステートドライブ (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 を試みる前に、SSD が TRIM をサポートしていることを確認する必要があります。さもないと、データを失うかもしれませんよ!

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 のサポートには異なる種類があります。ゆえに、ドライブが何をサポートしているかによってこの出力は異なる場合があります。詳細は、Wikipedia:ja:TRIM#ATA を見てください。

定期的な TRIM

util-linux パッケージは fstrim.servicefstrim.timer systemd ユニットファイルを提供しています。タイマーを有効化すれば毎週サービスが実行されます。このサービスは、discard 操作をサポートしているデバイス上のマウント済みのファイルシステムすべてに対して fstrim(8) を実行します。

タイマーは最後に実行してから一週間経過したことを知るために (最初に実行したときに作成される) /var/lib/systemd/timers/stamp-fstrim.timer のタイムスタンプを使います。そのため、anacron のように、何度も頻繁に実行される恐れはありません。

ユニットの活動と状態を取得するには、journalctl を見てください。タイマーの周期や実行されるコマンドを変更するには、提供されているユニットファイルを編集してください。

連続的な TRIM

ノート: fstrim を定期的に実行しているのであれば、連続的な TRIM を有効化する必要はありません。TRIM を使いたいのであれば、定期的な TRIM か連続的な TRIM のどちらか一方を使ってください。

TRIM コマンドを定期的に (fstrim.timer を使用する場合はデフォルトで1週間に1度) 発行するのではなく、ファイルが削除されるたびに TRIM コマンドを発行することも可能です。後者は、連続的な TRIM (continuous TRIM) として知られています。

警告: SATA 3.1 以前ではすべての TRIM コマンドはキューされなかったので、連続的な TRIM はシステムを頻繁にフリーズさせていました。この場合、低頻度で #定期的な TRIM を適用するのがより良い代替策です。また、深刻なデータ破損のため、キューに入れられた TRIM コマンドの実行がブラックリスト化されているデバイスの多くでも似たような問題が発生します (Linux ソースコードata_device_blacklist を参照)。そのような場合、デバイスにも依りますが、システムはキューの TRIM コマンドではなく非キューの TRIM コマンドを SSD に送信することを強制される場合があります。詳細は Wikipedia:ja:TRIM#短所 を見てください。
ノート: 連続的な TRIM は、TRIM コマンドを発行する方法として Linux コミュニティの間で最も好まれているわけではありません。例えば、Ubuntu は定期的な TRIM をデフォルトで有効化しており [7]、Debian は 連続的な TRIM の使用を推奨しておらず、Red Hat は可能であれば連続的な TRIM よりも定期的な TRIM を使用することを推奨しています [8]

/etc/fstab 内で discard オプションを使うことにより、デバイスオペレーションでの連続的な TRIM を有効化します:

/dev/sda1  /           ext4  defaults,discard   0  1
ノート: XFS / パーティションの場合、/etc/fstab 内で discard オプションを指定しても、うまく行きません。このスレッドによると、rootflags=discard カーネルパラメータを使用して設定しなければならないようです。

ext4 ファイルシステムでは、tune2fs を使って discard フラグをデフォルトマウントオプションとして設定することもできます:

# tune2fs -o discard /dev/sdXY

外部ドライブの場合は、/etc/fstab 内のエントリではなくデフォルトマウントオプションを使うと便利です。そのようなパーティションは、他のマシンでもデフォルトのオプションを使ってマウントされるからです。この方法では、すべてのマシンで /etc/fstab を編集する必要はありません。

ノート: デフォルトマウントオプションは、/proc/mounts にリストアップされません。

デバイス全体を trim する

一度に SSD 全体を trim したい場合 (例えば、新しいインストールのためや、そのドライブを売りたい場合など)、blkdiscard コマンドが使えます。

LVM

ファイルシステムから論理ボリュームへ渡された TRIM 要求は、自動的に物理ボリュームへ渡されます。追加の設定は必要ありません。

デフォルトでは、LVM のオペレーション (lvremovelvreduce、そしてその他すべて) は物理ボリュームに TRIM 要求を発行しません。これは、vgcfgrestore(8) を使って以前のボリュームグループ設定を復元できるようにするためです。/etc/lvm/lvm.conf 内の issue_discards は、論理ボリュームがその基底となる物理ボリュームの領域をもはや使用しなくなった時に、その物理ボリュームに discard 要求を送信するかどうかを制御します。

ノート: issue_discards の設定を変更する前に /etc/lvm/lvm.conf 内のコメントをよく読んでください。この設定は、ファイルシステムからディスクへ渡される TRIM 要求 (例: ファイルシステム内でのファイル削除) には全く影響を与えませんし、シンプール内の領域管理にも影響を与えません。
警告: issue_discards を有効化すると、vgcfgrestore によるボリュームグループメタデータの復元ができなくなります。LVM コマンドを誤って発行した場合のリカバリオプションは存在しません。

dm-crypt

警告: The discard option allows discard requests to be passed through the encrypted block device. This may or may not improve performance on SSD storage [9] but has security implications. See the following for more information:

For non-root filesystems, configure /etc/crypttab to include discard in the list of options for encrypted block devices located on an SSD (see dm-crypt/System configuration#crypttab).

For the root filesystem, follow the instructions from dm-crypt/Specialties#Discard/TRIM support for solid state drives (SSD) to add the right kernel parameter to the bootloader configuration.

パフォーマンスを最大化する

パフォーマンスの最大化#ストレージデバイス のヒントに従ってドライブのパフォーマンスを最大化しましょう。

セクタサイズ

Advanced Format#ソリッドステートドライブ を見てください。

SSD のメモリセルのクリア

時々、SSD のセルを完全にリセットしてデバイスにインストールした時と同じ初めの状態にすることで製造時の書き込みパフォーマンスを取り戻したいと思うことがあるかもしれません。SSD の書き込みパフォーマンスはネイティブの TRIM サポートを使っていても時間経過で落ちていきます。TRIM はファイル削除に対するセーフガードとして働くだけで、増加保存などの代わりにはなりません。

#SATA#NVMe の場合、ソリッドステートドライブ/メモリセルの消去 に書かれている適切な手順に従うことでリセットすることができます。

ノート: リセットする目的がデータの消去ならば、SSD のコントローラに頼って安全に消去を行うことを望まない場合があるでしょう (例えば、あなたが SSD の製造業者を信頼していなかったり、潜在的なバグを不安に思っていたりする場合など)。この場合、手動消去を行う例やさらなる情報を ディスクの完全消去#フラッシュメモリ で見てください。

セキュリティ

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] を参照)。

警告: よくわからないときは hdparm を使って上記のロックセキュリティ設定を変更しないで下さい。

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 に関しては、問題のトラブルシューティングを始める前に、ファームウェアのアップデートが存在しないか確認してみてください:

ファームウェアのバグであったとしても、解決できることがあります。ファームウェアにアップデートが存在しなかったり、ファームウェアのアップデートをしたくない場合、以下のセクションを見て下さい。

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" をダウンロードすることでイメージを入手できます。

ノート: Crucial が提供している ISO イメージはハイブリッドではありません。dd コマンドを使ってイメージを MBR が存在しないデバイスにコピーした場合、デバイスが起動できなくなります。

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 など)。

ノート: Samsung はファームウェアアップデートをわかりやすく提供していません。ファームウェアアップデートに関連するページが4つあり、それぞれで別々の方法が示されています。

(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 パーティションに展開して GRUBSyslinux で起動してファームウェアをアップデートしてください。

ファームウェアのアップデートが列挙された一つのページは存在しませんが (サイトがわかりづらい)、以下が関連するリンクです:

参照