「ソリッドステートドライブ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
 
(7人の利用者による、間の65版が非表示)
1行目: 1行目:
 
[[Category:ストレージ]]
 
[[Category:ストレージ]]
[[en:Solid State Drives]]
+
[[en:Solid state drive]]
[[it:Solid State Drives]]
+
[[es:Solid State drive]]
[[ru:Solid State Drives]]
+
[[ru:Solid state drive]]
[[zh-CN:Solid State Drives]]
+
[[zh-hans:Solid state drive]]
[[zh-TW:Solid State Drives]]
 
 
{{Related articles start}}
 
{{Related articles start}}
  +
{{Related|ソリッドステートドライブ/NVMe}}
{{Related3|SSD Benchmarking|SSD ベンチマーク}}
 
  +
{{Related|ソリッドステートドライブ/メモリセルの消去}}
{{Related|SSD Memory Cell Clearing}}
 
  +
{{Related|ベンチマーク/データストレージデバイス}}
{{Related|profile-sync-daemon}}
 
  +
{{Related|パフォーマンスの向上#ストレージデバイス}}
 
{{Related articles end}}
 
{{Related articles end}}
   
  +
この記事では、[[Wikipedia:ja:ソリッドステートドライブ|ソリッドステートドライブ]] (SSD) や他のフラッシュメモリベースのストレージデバイスの取り扱いに関するトピックをカバーしています。
この記事では SSD (solid state drive) について Linux と関係する様々なことを記述していますが、一般的な根本原則やキーポイントは Windows ファミリーや Mac OS X など他のオペレーティングシステムで SSD を使っているユーザーも応用することができます。さらにそのような情報に加えて、Linux ユーザーはここに書かれた方法で SSD を最適化・調整することが可能です。
 
   
  +
特定の目的のために SSD をパーティショニングしたい場合、[[Wikipedia:List of file systems#File systems optimized for flash memory, solid state media|フラッシュメモリ向けに最適化されたファイルシステムのリスト]]で検討すると良いかもしれません。
==概要==
 
   
  +
一般的な利用では、自由に[[ファイルシステム]]を選び、[[#TRIM]] を有効化すると良いでしょう。
===イントロダクション===
 
   
  +
== 使用法 ==
Solid State Drive (SSD) は PnP デバイスではありません。パーティションアライメント、ファイルシステムの選択、TRIM サポートなどの特別事項は SSD の性能を最適化するために必要になります。この記事には Linux で SSD から最高の性能を引き出すための情報を集めています。コンテンツはトピックでまとめられており、必ずしも系統的または時系列順に並べられているわけではないので、実際に推奨事項をやろうとする前に記事全体を読むと良いでしょう。
 
   
  +
=== TRIM ===
{{Note|この記事は Linux を動作させているユーザーを対象にしていますが BSD, Mac OS X, Windows など他のオペレーティングシステムを使っているユーザーにも中身がほぼ全て当てはまります。}}
 
   
  +
ファイルの削除がファイルシステムレベルのみで処理される[https://www.redhat.com/sysadmin/linux-delete-file-rm]ハードドライブと比較して、SSD は、メモリブロックが解放されて再利用可能になったときにディスクコントローラに通知することで利益を得ます。SSD を構成するフラッシュセルは書き込み操作の度に少しづつ摩耗するため、ディスクコントローラは全てのセルに書き込み操作を分散させるアルゴリズムを使用します: この処理は[[Wikipedia:ja:ウェアレベリング|ウェアレベリング]]と呼ばれます。NVMe の [[Wikipedia:Trim (computing)#NVM_Express|DEALLOCATE]] や、SAS の [[Wikipedia:Trim (computing)#SCSI|UNMAP]]、[[Wikipedia:ATA_TRIM|ATA_TRIM]] コマンドが無ければ、空きメモリブロックがなくなると、1つセルに書き込む前にそのセルを削除するためにデータを移動しなければならないため、ディスクコントローラは書き込み操作により多くの時間を消費するようになってしまいます ([[Wikipedia:ja:ライトアンプリフィケーション]] を参照): [https://www.techspot.com/review/737-ocz-vector-150-ssd/page9.html TechSpot のベンチマーク]では、SSD をデータで埋める前と後でのパフォーマンスへの影響を表しています。
===HDD に対する利点===
 
   
  +
{{Note|TRIM を使用したいのであれば、定期的な TRIM か連続的な TRIM のどちらか一方'''のみ'''を使用してください。連続的な TRIM は、TRIM コマンドを発行する方法として Linux コミュニティの間で最も好まれているわけでは'''ありません'''。例えば、Ubuntu は定期的な TRIM をデフォルトで有効化しており [https://askubuntu.com/questions/1034169/is-trim-enabled-on-my-ubuntu-18-04-installation]、Debian は [[Debian:SSDOptimization#Mounting SSD filesystems|連続的な TRIM]] の使用を推奨しておらず、Red Hat は可能であれば連続的な TRIM よりも定期的な TRIM を使用することを推奨しています [https://web.archive.org/web/20160917183831/https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Storage_Administration_Guide/ch02s04.html]。}}
*高速な読み込み速度 - 最新のデスクトップ 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ワット消費するのに対してアイドル状態で1ワット、読み書き中は1-2ワット。
 
*軽量 - ノートパソコンに最適。
 
   
  +
Linux カーネルバージョン 3.8 以降、異なる[[ファイルシステム]]に対する TRIM のサポートが継続的に追加されました。概要は以下の表を見てください:
===欠点===
 
   
  +
{| class="wikitable sortable"
*容量単位のコスト (1GBあたり1ドル近く、それに対して回転メディアでは1GBあたり10または20セント)。
 
  +
! ファイルシステム !! 連続的な TRIM <br> ({{ic|discard}} オプション) !! 定期的な TRIM <br> (''fstrim'') !! 参照<br> と備考
*市販されているモデルの容量が HDD よりも少ない。
 
  +
|-
*セルの大きさによって回転メディアと異なるファイルシステムの最適化が必要。現代の OS はアクセスを最適化するためにフラッシュ変換レイヤを使用しており生のフラッシュアクセスは遮蔽されている。
 
  +
| [[Bcachefs]] || {{Yes}} || {{No}} ||
*パーティションとファイルシステムを SSD の特性にあわせて調整する必要がある。ページサイズや消去ページサイズは自動検出されません。
 
  +
|-
*セルは劣化します。一般的に、50nm プロセスによる民生の MLC セルは10000回の書き込み、35nm では5000回の書き込み、25nm では3000回の書き込みが出来ます(小さくなればなるほど高密度で値段が安くなります)。書き込みが適当に散らばっていて、小さすぎず、セルにピッタリはまるようになったときに、容量の倍数である最終的な SSD の書き込みボリュームに移されます。日々の書き込みボリュームは耐用年数から差引かなければなりません。ただし、最新のハードウェアで行われた試験 [http://techreport.com/review/25889/the-ssd-endurance-experiment-500tb-update][http://techreport.com/review/26523/the-ssd-endurance-experiment-casualties-on-the-way-to-a-petabyte][http://techreport.com/review/27436/the-ssd-endurance-experiment-two-freaking-petabytes] では SSD の劣化は無視できるほどで、人為的に書き込みボリュームを多くしても SSD の耐用年数は HDD と並ぶとされています。
 
  +
| [[Btrfs]] || {{Yes}} || {{Yes}} || カーネル 6.2 から非同期 discard がデフォルトで[[Btrfs#SSD TRIM|有効化]]されています。
*ファームウェアやコントローラーが複雑。たまにバグが存在することもあります。最新のコントローラーは HDD と匹敵するほどの電力を消費します。コントローラーにはガベージコレクションの付いたログ構造化ファイルシステムに相当するものが[https://lwn.net/Articles/353411/ 実装されています]。回転メディアにあわせて作られた SATA コマンドは変換されます。ファームウェアによってはオンザフライで圧縮を行います。反復書き込みをフラッシュ領域全体に散らばらせて、特定のセルがすぐに劣化するのをふせぎます。また、書き込みをまとめることで小さな書き込みがそれと同じ回数大きなセルを消去することにならないようにしています。最後にデータを含むセルを移動するので時間の経過によってセルが中身を失うことはありません。
 
  +
|-
*ディスクが満杯になるにつれてパフォーマンスが低下します。一般にガベージコレクションはあまり上手く実装されておらず、空き領域が完全に空のセルに集められているとは限りません。
 
  +
| [[Wikipedia:ja:exFAT|exFAT]] || {{Yes}} || {{Yes}} || ''fstrim'' はカーネル 5.13 以降、サポートされています。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=654762df2ec7d61b05acc788afbffaba52d658fe]
  +
|-
  +
| [[ext3]] || {{Yes}} || {{Yes}} ||
  +
|-
  +
| [[ext4]] || {{Yes}} || {{Yes}} || [https://docs.kernel.org/admin-guide/ext4.html?highlight=discard,%20nodiscard(*)#options] の "discard, nodiscard(*)"
  +
|-
  +
| [[F2FS]] || {{Yes}} || {{Yes}} ||
  +
|-
  +
| [[JFS]] || {{Yes}} || {{Yes}} || [https://www.phoronix.com/scan.php?page=news_item&px=MTE5ODY]
  +
|-
  +
| [[Wikipedia:ja:NILFS|NILFS2]] || {{Yes}} || {{Yes}} ||
  +
|-
  +
| rowspan=2 | [[NTFS]]
  +
| {{Yes}} || {{No}} || [https://docs.kernel.org/filesystems/ntfs3.html ntfs3] カーネルドライバは連続的な TRIM のみをサポートしています。
  +
|-
  +
| {{No}} || {{Yes}} || [[NTFS-3G]] ドライバは定期的な TRIM のみをサポートしています。
  +
|-
  +
| [[VFAT]] || {{Yes}} || {{Yes}} || ''fstrim'' はカーネル 4.19 以降、サポートされています。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f663b5b38fffeb31841f8bfaf0ef87a445b0ffee]
  +
|-
  +
| [[XFS]] || {{Yes}} || {{Yes}} || [https://xfs.org/index.php/FITRIM/discard]{{Dead link|2024|03|03|status=SSL error}}
  +
|}
   
  +
{{Warning|TRIM を試みる前に、SSD が TRIM をサポートしていることを確認する必要があります。さもないと、データを失うかもしれませんよ!}}
===購入前に考慮すべき事項===
 
   
  +
TRIM のサポートを確認するには、以下を実行してください:
最新の SSD を買う前に見ておくべきポイントがいくつか存在します。
 
*[[wikipedia:TRIM|TRIM]] のネイティブサポートは不可欠です。SSD の寿命を伸ばして、少しずつおこる書き込み操作のパフォーマンスの減少を少なくします。
 
*適切な容量の SSD を買うことが重要です。カーネルが SSD パーティションを効率的に利用するために占有率は75%以下が望まれます。
 
   
  +
$ lsblk --discard
==SSD のパフォーマンスを最大化させるヒント==
 
=== パーティションアライメント ===
 
消去ブロックサイズに揃えたパーティションを使用することを強く推奨します。昔は、パーティション分けをするときに手動で計算して設定する必要がありました。現在では一般的なパーティションツールのほとんどが(最新バージョンを使っていれば)パーティションアライメントを自動的に行います:
 
* fdisk
 
* gdisk
 
* gparted
 
* parted
 
   
  +
そして、DISC-GRAN (discard granularity) と DISC-MAX (discard max bytes) 列の値を確認してください。値が 0 でなければ、TRIM をサポートしていることを意味します。
パーティションが調整されているか確認するには、以下のように {{ic|/usr/bin/blockdev}} を使って問い合わせて下さい。'0' が返ってくれば、パーティションは揃えられています:
 
# blockdev --getalignoff /dev/<partition>
 
0
 
   
  +
SATA SSD の場合にのみ、{{Pkg|hdparm}} パッケージは、{{ic|hdparm -I /dev/sda {{!}} grep TRIM}} を [[ユーザーとグループ#概要|root ユーザ]]として実行することにより、TRIM サポートを検出することができます。{{Pkg|hdparm}} は、NVMe SSD をサポートしていません。
=== TRIM ===
 
   
  +
==== 定期的な TRIM ====
ほとんどの SSD は長期間パフォーマンスを維持するために [[wikipedia:TRIM|ATA_TRIM コマンド]]をサポートしています。ベンチマーク前後などの詳細は、[https://sites.google.com/site/lightrush/random-1/howtoconfigureext4toenabletrimforssdsonubuntu この]チュートリアルを見て下さい。
 
   
  +
{{Pkg|util-linux}} パッケージは {{ic|fstrim.service}} と {{ic|fstrim.timer}} [[systemd]] ユニットファイルを提供しています。タイマーを[[有効化]]すれば毎週サービスが実行されます。このサービスは、''discard'' 操作をサポートしているデバイス上のマウント済みのファイルシステムすべてに対して {{man|8|fstrim}} を実行します。
Linux カーネルバージョン 3.7 現在、次のファイルシステムが TRIM をサポートしています: [[Ext4]], [[Btrfs|Btrfs]], [[JFS]], VFAT, [[XFS|XFS]]。
 
   
  +
タイマーは最後に実行してから一週間経過したことを知るために (最初に実行したときに作成される) {{ic|/var/lib/systemd/timers/stamp-fstrim.timer}} のタイムスタンプを使います。そのため、''anacron'' のように、何度も頻繁に実行される恐れはありません。
VFAT はマウントフラグ 'discard' によって TRIM をサポートしています、fstrim はサポートしていません。
 
   
  +
ユニットの活動と状態を取得するには、[[journalctl]] を見てください。タイマーの周期や実行されるコマンドを変更するには、提供されているユニットファイルを[[編集]]してください。
この記事の[[#ファイルシステムの選択|ファイルシステムの選択]]のセクションにさらに詳しく書かれています。
 
   
==== TRIM のサポートを確認する ====
+
==== 連続的な TRIM ====
   
  +
TRIM コマンドを定期的に ({{ic|fstrim.timer}} を使用する場合はデフォルトで1週間に1度) 発行するのではなく、ファイルが削除されるたびに TRIM コマンドを発行することも可能です。後者は、連続的な TRIM (continuous TRIM) として知られています。
# hdparm -I /dev/sda |grep TRIM
 
* Data Set Management TRIM supported (limit 1 block)
 
* Deterministic read data after TRIM
 
   
  +
{{Warning|[[Wikipedia:Serial ATA#SATA revision 3.1|SATA 3.1]] 以前ではすべての TRIM コマンドはキューされなかったので、連続的な TRIM はシステムを頻繁にフリーズさせていました。この場合、低頻度で [[#定期的な TRIM]] を適用するのがより良い代替策です。また、深刻なデータ破損を引き起こすためキューに入れられた TRIM コマンドの実行がブラックリスト化されているデバイスの多くでも似たような問題が発生します ([https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/ata/libata-core.c Linux ソースコード]の {{ic|ata_device_blacklist}} を参照)。そのような場合、デバイスにも依りますが、システムはキューの TRIM コマンドではなく非キューの TRIM コマンドを SSD に送信することを強制される場合があります。詳細は [[Wikipedia:ja:TRIM#短所]] を見てください。}}
"limit 1 block" や "limit 8 block" の意味は、[[wikipedia:TRIM#ATA]] を見て下さい。
 
   
  +
{{ic|/etc/fstab}} 内で {{ic|discard}} オプションを使うことにより、デバイスオペレーションでの連続的な TRIM を有効化します:
==== マウントフラグで TRIM を有効にする ====
 
   
  +
/dev/sda1 / ext4 defaults,'''discard''' 0 1
{{ic|/etc/fstab}} でフラグを使うことで上述の TRIM コマンドの恩恵を得ることができます。
 
   
  +
{{Note|1=XFS {{ic|/}} パーティションの場合、{{ic|/etc/fstab}} 内で discard オプションを指定しても、うまく行きません。[https://bbs.archlinux.org/viewtopic.php?id=143254 このスレッド]によると、{{ic|1=rootflags=discard}} [[カーネルパラメータ]]を使用して設定しなければならないようです。}}
/dev/sda1 / ext4 defaults,noatime,'''discard''' 0 1
 
/dev/sda2 /home ext4 defaults,noatime,'''discard''' 0 2
 
   
{{Note|ext3 の root パーティョンで {{ic|discard}} フラグを使用すると読み取り専用でマウントされます。}}
+
ext4 ファイルステムは、''tune2fs'' を使って {{ic|discard}} フラグを[[アクセス制御リスト#ACL の有効化|デフォルトマウントオプション]]として設定することもできます:
{{Warning|{{ic|discard}} フラグを使ってパーティションをマウントする前に SSD が TRIM をサポートしていることを確認してください。そうしないとデータが喪失する可能性があります。}}
 
   
  +
# tune2fs -o discard /dev/sd'''XY'''
==== cron で TRIM を適用する ====
 
   
  +
外部ドライブの場合は、{{ic|/etc/fstab}} 内のエントリではなくデフォルトマウントオプションを使うと便利です。そのようなパーティションは、他のマシンでもデフォルトのオプションを使ってマウントされるからです。この方法では、すべてのマシンで {{ic|/etc/fstab}} を編集する必要はありません。
{{Note|この方法は VFAT ファイルシステムでは使えません。}}
 
サポートされている SSD では TRIM を有効にすることが基本的に推奨されますが、場合によってはファイルの削除中に SSD の[https://patrick-nagel.net/blog/archives/337 動作が遅くなる]問題が発生します。このような場合、代わりに fstrim を使うことを選択できます。
 
# fstrim -v /
 
fstrim を適用するパーティションはマウントされている必要があり、さらにマウントポイントで示さなければなりません。
 
   
  +
{{Note|デフォルトマウントオプションは、{{ic|/proc/mounts}} にリストアップされません。}}
この方法の方が上手くいくようでしたら、cron を使って定期的にこれを実行するようにすると良いでしょう。デフォルトの cron パッケージ ({{pkg|cronie}}) には、デフォルトで、毎時・毎日・毎週・毎月のジョブを設定するための anacron 実装が含まれています。Arch の新規インストールでは [[Cron#有効化と自動起動|cronie の systemd サービス]]はデフォルトで有効になっていないので注意してください。毎日の cron のタスクのリストに追加するには、希望の動作をするスクリプトを作成して {{ic|/etc/cron.daily}} や {{ic|/etc/cron.weekly}} に置くだけです。この方法を使用する場合は適当な nice や ionice の値を使うことを推奨します。上手くできたら、{{ic|/etc/fstab}} から {{ic|discard}} オプションは削除してください。
 
   
  +
==== デバイス全体を trim する ====
{{Note|まず最初は {{ic|discard}} マウントオプションを使うべきです。TRIM の通常実装で上手く行かない時にこの方法を使って下さい。}}
 
   
  +
一度に SSD 全体を trim したい場合 (例えば、新しいインストールのためや、そのドライブを売りたい場合など)、[[ソリッドステートドライブ/メモリセルの消去#blkdiscard による一般的な方法|blkdiscard]] コマンドが使えます。
==== systemd サービスで TRIM を適用する ====
 
   
  +
==== LVM ====
{{Pkg|util-linux}} パッケージには {{ic|fstrim.service}} と {{ic|fstrim.timer}} の [[systemd|systemd]] ユニットファイルが入っています。このタイマーを[[systemd#ユニットを使う|有効化]]すれば毎週サービスが実行され、discard をサポートしているデバイス上のマウント済みファイルシステム全てが trim されます。
 
   
  +
ファイルシステムから論理ボリュームへ渡された TRIM 要求は、自動的に物理ボリュームへ渡されます。追加の設定は必要ありません。
==== tune2fs で TRIM を有効にする (非推奨) ====
 
   
  +
デフォルトでは、[[LVM]] のオペレーション (''lvremove''、''lvreduce''、そしてその他すべて) は物理ボリュームに TRIM 要求を発行しません。これは、{{man|8|vgcfgrestore}} を使って以前のボリュームグループ設定を復元できるようにするためです。{{ic|/etc/lvm/lvm.conf}} 内の {{ic|issue_discards}} は、論理ボリュームがその基底となる物理ボリュームの領域をもはや使用しなくなった時に、その物理ボリュームに discard 要求を送信するかどうかを制御します。
tune2fs を使って静的に trim フラグを設定することができます:
 
   
  +
{{Note|{{ic|issue_discards}} の設定を変更する前に {{ic|/etc/lvm/lvm.conf}} 内のコメントをよく読んでください。この設定は、ファイルシステムからディスクへ渡される TRIM 要求 (例: ファイルシステム内でのファイル削除) には全く影響を与えませんし、シンプール内の領域管理にも影響を与えません。}}
# tune2fs -o discard /dev/sd'''XY'''
 
   
  +
{{Warning|{{ic|issue_discards}} を有効化すると、''vgcfgrestore'' によるボリュームグループメタデータの復元ができなくなります。LVM コマンドを誤って発行した場合のリカバリオプションは無くなります。}}
{{Warning|この方法を使うと {{ic|mount}} で {{ic|discard}} オプションが[https://bbs.archlinux.org/viewtopic.php?id&#61;137314 現れなくなります]。}}
 
   
==== LVM で TRIM を有効にする ====
+
==== dm-crypt ====
   
  +
{{Warning|discard オプションは、暗号化されているブロックデバイスを通して discard 要求を渡せるようにします。これは、SSD ストレージのパフォーマンスを向上させるかもしれませんし、しないかもしれません[https://lore.kernel.org/linux-raid/508FA2C6.2050800@hesbynett.no/]。しかし、セキュリティに影響を与えます。詳細は以下の記事を見てください:
{{ic|/etc/lvm/lvm.conf}} で {{ic|issue_discards}} オプションを有効にしてください。
 
   
  +
* [[Debian:SSDOptimization#Mounting SSD filesystems]]
==== dm-crypt で TRIM を有効にする ====
 
  +
* [[dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート]]
  +
}}
   
{{ic|/etc/crypttab}} を設定して SSD 上の暗号化されブロックデバイスのオプションリストに {{ic|discard}} を含めさい。この discard オプションは discard リクエストが暗号化されたブロックデバイスを通過するのを許可します。これによって SSD ストレージのパフォーマンスは向上しますが、セキュリティに影響があります。[[Dm-crypt/Specialties#Discard.2FTRIM_support_for_solid_state_drives_.28SSD.29|このセクョン]]を見てさい。
+
ルート以外のファイルシステムの場合、{{ic|/etc/crypttab}} を編集してSSD 上の暗号化されているブロックデバイスのオプションリストに {{ic|discard}} を追加しください ([[dm-crypt/システム設定#crypttab]] を見てください)
   
  +
ルートファイルシステムの場合、[[dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート]] の指示に従って、ブートローダーの設定に適切なカーネルパラメータを追加してください。
=== I/O スケジューラー ===
 
   
  +
=== パフォーマンスを最大化する ===
デフォルトの [[wikipedia:CFQ|CFQ]] (Completely Fair Queuing) スケジューラから [[wikipedia:NOOP_scheduler|NOOP]] または [[wikipedia:Deadline_scheduler|Deadline]] に切り替えるということも考えられます。後者の2つは SSD のパフォーマンスを加速させます。例えば、NOOP スケジューラは全ての I/O リクエストに対して、ディスクに物理的に近いものを並び替えたりグループ化することなく、一つのシンプルなキューを実行します。SSD においては全てのセクタでシーク時間は同じであり、シーク時間に基づいて I/O キューを並び替える必要性には説得力がありません。
 
   
  +
[[パフォーマンスの向上#ストレージデバイス]] のヒントに従ってドライブのパフォーマンスを最大化しましょう。
Arch ではデフォルトで CFQ スケジューラが有効にされています。{{ic|/sys/block/sd'''X'''/queue/scheduler}} の中身を見て確認してください:
 
   
  +
==== セクタサイズ ====
{{hc|$ cat /sys/block/sd'''X'''/queue/scheduler|
 
noop deadline [cfq]
 
}}
 
   
  +
[[Advanced Format#NVMe ソリッドステートドライブ]] を見てください。
表示されているスケジューラの中で角括弧で囲まれているのが現在使われているスケジューラです。
 
   
  +
==== SSD のメモリセルのクリア ====
ユーザーは再起動することなくスケジューラを変更することができます:
 
   
  +
時々、SSD のセルを完全にリセットしてデバイスにインストールした時と同じ初めの状態にすることで[https://www.anandtech.com/show/2738/8 製造時の書き込みパフォーマンス]を取り戻したいと思うことがあるかもしれません。SSD の書き込みパフォーマンスはネイティブの TRIM サポートを使っていても時間経過で落ちていきます。TRIM はファイル削除に対するセーフガードとして働くだけで、増加保存などの代わりにはなりません。
# echo noop > /sys/block/sd'''X'''/queue/scheduler
 
   
  +
[[ソリッドステートドライブ/メモリセルの消去#SATA ドライブ|#SATA]] や [[ソリッドステートドライブ/メモリセルの消去#NVMe ドライブ|#NVMe]] の場合、[[ソリッドステートドライブ/メモリセルの消去]] に書かれている適切な手順に従うことでリセットすることができます。
または:
 
   
  +
{{Note|リセットする目的がデータの消去ならば、SSD のコントローラに頼って安全に消去を行うことを望まない場合があるでしょう (例えば、あなたが SSD の製造業者を信頼していなかったり、潜在的なバグを不安に思っていたりする場合など)。この場合、手動消去を行う例やさらなる情報を [[ディスクの完全消去#フラッシュメモリ]] で見てください。}}
$ sudo tee /sys/block/sd'''X'''/queue/scheduler <<< noop
 
   
  +
=== セキュリティ ===
この方法は永続的ではありません (再起動で変更は失われます)。ファイルの中身をもう一度見て "noop" が使われるようになっていることを確認してください。
 
   
  +
==== Frozen モード ====
==== カーネルパラメータ (シングルデバイス) ====
 
   
  +
一部のマザーボードファームウェアは初期化時に ATA SECURITY FREEZE LOCK コマンドを SATA デバイスに発行します。これによりドライブは frozen モードになり、SEC2 状態 (セキュリティ無効、未ロック、frozen 状態) に遷移します。同様に、一部の SSD (と HDD) も工場出荷時にこの状態にすでに設定されています。このことは [[hdparm]] と [[smartctl]] の出力から確認できます:
システムの唯一のストレージデバイスが SSD である場合、{{ic|1=elevator=noop}} [[Kernel parameters|カーネルパラメータ]]でシステム全体の I/O スケジューラを設定できます。
 
   
  +
{{hc|head=# hdparm -I /dev/sda |output=
====1つのデバイスまたは HDD/SSD 混合環境で udev を使って設定する====
 
  +
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.
  +
}}
   
  +
{{hc|# smartctl -g security /dev/sda|
上の方法は確かに動作しますが、あくまで回避策と考えられています。つまり、デバイスのスケジューラを一番最初に実行するシステムを使うのが好ましいでしょう。この場合、それは udev で、設定するのに必要なのはシンプルな [[udev|udev]] ルールだけです。
 
  +
ATA Security is: Disabled, frozen [SEC2]
  +
}}
   
  +
デバイスのフォーマットやオペレーティングシステムのインストールといった操作は、frozen モードの影響を受けません。
設定するには、以下を作成してください:
 
   
  +
上記の ''hdparm'' の出力は、デバイスが起動時に HDD パスワードによって'''ロックされていない'''こと、そして '''frozen''' 状態によってデバイスを (実行時にパスワードを設定してデバイスをロックさせてしまうような) マルウェアから保護していることを示しています。
{{hc|/etc/udev/rules.d/60-schedulers.rules|<nowiki>
 
# set deadline scheduler for non-rotating disks
 
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
 
</nowiki>}}
 
   
  +
"frozen" 状態のデバイスにパスワードを設定したい場合、それに対応しているマザーボード BIOS が必要です。[[自己暗号化ドライブ|ハードウェア暗号化]]に必要なので、多くのノートパソコンでサポートされていますが、デスクトップやサーバーのボードではサポートがあるかどうかはっきりしないことがあります。
Deadline/CFQ をお望みのスケジューラに設定してください。次に起動した時に変更が適用されるはずです。新しいルールが適用されているか確認するには:
 
   
  +
例えば、Intel DH67CL/BL マザーボードの場合、設定にアクセスするには物理的なジャンパによってマザーボードを "maintenance mode" に設定する必要があります。[https://sstahlman.blogspot.in/2014/07/hardware-fde-with-intel-ssd-330-on.html?showComment=1411193181867#c4579383928221016762]
$ cat /sys/block/sd'''X'''/queue/scheduler # where '''X''' is the device in question
 
   
  +
{{Warning|よくわからないときは ''hdparm'' を使って上記の'''ロック'''セキュリティ設定を変更しないで下さい。}}
{{Note|In the example sixty is chosen because that is the number udev uses for its own persistent naming rules. Thus, it would seem that block devices are at this point able to be modified and this is a safe position for this particular rule. But the rule can be named anything so long as it ends in {{ic|.rules}}.)}}
 
   
  +
SSD を消去するときは、[[ディスクの完全消去#hdparm]] や [[ソリッドステートドライブ/メモリセルの消去]] を見て下さい。
=== SSD のスワップ領域 ===
 
   
  +
===== スリープから復帰したあとに SSD 状態を frozen モードにする =====
SSD 上にスワップパーティションを配置することが可能です。最新のデスクトップではメモリが2ギガ以上積まれておりスワップはほとんど使いません。ただしハイバネート機能を利用するシステムの場合は別です。以下のようにシステムの "swappiness" を減らすことで SSD にあるスワップへの書き込みを減らすことが推奨されます:
 
   
  +
SSD は S3 スリープから復帰すると SEC1 状態 (セキュリティ無効、未ロック、非 frozen) に戻っていることが多く、[[ソリッドステートドライブ/メモリセルの消去]] で説明されているように ATA SECURITY ERASE UNIT コマンドに対して脆弱になっています。
# echo 1 > /proc/sys/vm/swappiness
 
   
  +
この問題を回避するために、[[電源管理/サスペンドとハイバネート#/usr/lib/systemd/system-sleep のフック|スリープからの復帰後]]にスクリプトを実行することができます:
[[Maximizing_Performance#Swappiness|パフォーマンスの最大化]]の記事で推奨されているように行うこともできます:
 
   
{{hc|/etc/sysctl.d/99-sysctl.conf|2=
+
{{hc|/usr/lib/systemd/system-sleep/ssd-freeze.sh|2=
  +
#!/bin/sh
vm.swappiness=1
 
  +
if [ "$1" = 'post' ]; then
vm.vfs_cache_pressure=50
 
  +
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
 
}}
 
}}
   
  +
システムに複数のストレージデバイスやポータブル USB ドライブが存在している場合、[[Hdparm#udev ルールによる永続的な設定]] に書かれてあるテクニックを利用して、{{ic|--security-freeze}} を全ドライブ (HDD も含む) に発行することもできます。
=== Hdparm で "frozen" 状態と表示される ===
 
   
  +
==== ハードウェア暗号化 ====
マザーボードの BIOS は初期化時に取り付けられたストレージデバイスに "security freeze" コマンドを実行することがあります。同様に SSD (や HDD) の BIOS もファクトリーにおいて "security freeze" に設定されていることがあります。どちらにしても、以下の出力のようにデバイスのパスワードセキュリティ設定が "frozen" になります:
 
   
  +
[[#Frozen モード]] で説明されているように、BIOS でストレージデバイス (SSD/HDD) のパスワードを設定すると、それをサポートしているデバイスのハードウェア暗号化も初期化される場合があります。デバイスが OPAL 規格にも準拠している場合、パスフレーズを設定する機能が BIOS に無くとも、これを行える場合があります。[[自己暗号化ドライブ]] を見てください。
{{hc|head=:~# hdparm -I /dev/sda |output=
 
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" の影響を受けません。
 
   
  +
あなたが今遭遇している問題は、Linux 固有でないファームウェアのバグである可能性があります。ゆえに、SSD に影響を与える問題のトラブルシューティングに挑戦する前に、以下のアップデートが利用可能であるかをチェックするべきです:
上記の出力はデバイスが起動時に HDD パスワードによってロックされていないこと、そして凍結状態によってデバイスを (パスワードを設定してデバイスをロックさせてしまうような) マルウェアから保護していることがわかります。
 
   
  +
* [[#ファームウェア|SSD のファームウェア]]
凍結状態のデバイスにパスワードを設定したい場合、それに対応しているマザーボード BIOS が必要です。[[Wikipedia:Hardware-based_full_disk_encryption|ハードウェア暗号化]]に必須なので、ノートパソコンでは大抵サポートされていますが、デスクトップやサーバーのボードではサポートがあるかどうかはっきりしないことがあります。例えば、Intel DH67CL/BL マザーボードの場合、設定にアクセスするには物理的なジャンパによってマザーボードを "maintenance mode" に設定する必要があります ([http://sstahlman.blogspot.in/2014/07/hardware-fde-with-intel-ssd-330-on.html?showComment=1411193181867#c4579383928221016762], [https://communities.intel.com/message/251978#251978] を参照)。
 
  +
* [[Linux から BIOS を書き換える|マザーボードの BIOS/UEFI ファームウェア]]
   
  +
ファームウェアのバグであったとしても、解決できることがあります。ファームウェアにアップデートが存在しなかったり、ファームウェアのアップデートをしたくない場合、以下のセクションが役に立つかもしれません。
{{Warning|よくわからないときは {{ic|hdparm}} を使って上記のロックセキュリティ設定を変更しないで下さい。}}
 
   
  +
=== NCQ エラーを解消する ===
SSD を消去するときは、[[Securely wipe disk#hdparm]] や[[#SSD_Memory_Cell_Clearing|下のセクション]]を見て下さい。
 
   
  +
SSD や SATA チップセットによっては Linux Native Command Queueing (NCQ) が正しく動作しないことがあります。[[journal]] に以下のようなエラーが表示されます:
=== SSD Memory Cell Clearing ===
 
   
  +
ata9: exception Emask 0x0 SAct 0xf SErr 0x0 action 0x10 frozen
時々、SSD のセルを完全にリセットしてデバイスにインストールした時と同じ初めの状態にすることで [http://www.anandtech.com/storage/showdoc.aspx?i=3531&p=8 製造時の書き込みパフォーマンス] を取り戻したいと思うことがあるかもしれません。SSD の書き込みパフォーマンスはネイティブの TRIM サポートを使っていても時間経過で落ちていきます。TRIM はファイル削除に対するセーフガードとして働くだけで、増加保存などの代わりにはなりません。
 
  +
ata9.00: failed command: READ FPDMA QUEUED
  +
ata9.00: cmd 60/04:00:d4:82:85/00:00:1f:00:00/40 tag 0 ncq 2048 in
  +
res 40/00:18:d3:82:85/00:00:1f:00:00/40 Emask 0x4 (timeout)
   
  +
起動時に NCQ を無効にするには、[[ブートローダー]]の設定におけるカーネルコマンドラインに {{ic|1=libata.force=noncq}} を追加してください。ポート 9 のディスク 0 の NCQ だけを無効化するには次を使用: {{ic|1=libata.force=9.00:noncq}}。
リセットは [[SSD Memory Cell Clearing]] の wiki 記事に書かれている3つのステップで簡単に行なえます。
 
   
  +
また、sysfs を使うことで再起動せずに特定のドライブの NCQ を無効化することもできます:
=== NCQ エラーを解消する ===
 
   
  +
# echo 1 > /sys/block/sdX/device/queue_depth
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)
 
   
  +
=== SATA の電源管理関連のエラーを解消する ===
以下の方法のいずれかによって問題が解決する可能性があります:
 
   
  +
SATA Active Link Power Management ([[wikipedia:Aggressive Link Power Management|ALPM]]) が有効になっている場合にエラーを吐く SSD も存在します (例: Transcend MTS400)。ALPM はデフォルトで無効になっており、省電力デーモンによって有効になります (例: [[TLP]], [[Laptop Mode Tools]])。
# SSD のファームウェアをアップデートする。[[SSD#ファームウェアのアップデート]] を参照。
 
# マザーボードの BIOS/UEFI をアップデートする。[[Flashing_BIOS_from_Linux|Linux で BIOS を更新]] を参照。
 
# 起動時に NCQ を無効にする。[[Boot Loaders|ブートローダー]]の設定におけるカーネルコマンドラインに {{ic|1=libata.force=noncq}} を追加してください。
 
   
問題が解決したり他問題発生する場合[[Reporting_Bug_Guidelines|グレポ作成]]してください。
+
そのようデーモンを使ていて SATA 関連エラー表示される場合、バッテリと AC 電源のプロファイルを {{ic|max_performance}} に設定して ALPM 無効化てみてください。
   
==SSD の読み書きを最小化するヒント==
+
=== 外部 SSD TRIM サポー ===
   
  +
いくつかの USB から SATA へのブリッジチップ (VL715、VL716 など) や USB から PCIe へのブリッジチップ ([https://icybox.de/en/product.php?id=71 IB-1817M-C31] のような外部 NVMe エンクロージャで使用されている [https://www.jmicron.com/PDF/brief/jms583.pdf JMicron JMS583] など) は、[[Wikipedia:ja:USB Attached SCSI|USB Attached SCSI]] ドライバ (Linux では "uas" と呼ばれています) を通して送信できる TRIM ライクなコマンドをサポートしています。
SSD の使用で一番重要なテーマは読み書きが多い操作を SSD の代わりに RAM (Random Access Memory) や物理 HDD に配置するという'シンプリシティ'でしょう。そうすることで SSD をより長生きさせることができます。これは主として巨大な消去ブロックサイズのためで (場合によっては 512 KiB)、多数の小さな書き込みは大きな効果的な書き込みになります。
 
   
  +
しかし、カーネルはこの機能を自動的に検出しない場合があり、この機能を使用しないかもしれません。
{{Note|書き込み増幅率が平凡な 10x で、書き込み/消去サイクルが標準的な 10000 である、32GB の SSD の場合、毎日 10GB のデータ書き込みを行うと、8年間で寿命が尽きるとされます。この数字はもっと容量が大きい SSD を使ったり書き込み増幅が少ない最新のコントローラを使うことで改善されます。また、ディスクの書き込みを制限するのにどの方法が必要なのか考えるときは [http://techreport.com/review/25889/the-ssd-endurance-experiment-500tb-update] を比較してください。}}
 
  +
問題のブロックデバイスが /dev/sdX であると仮定すると、{{Pkg|sg3_utils}} パッケージのコマンドを使えばそのケースに当てはまっているかどうかを確認できます:
   
  +
# sg_readcap -l /dev/sdX
プログラムがディスクにどれだけ書き込んでいるか確認するには {{ic|$ iotop -oPa}} を使ってディスクの書き込み順にソートしてください。
 
   
  +
このコマンドの出力に "Logical block provisioning: lbpme=0" と始まる行がある場合、(LBPME) ビットがセットされていないためカーネルはそのデバイスが "[https://www.seagate.com/files/staticfiles/support/docs/manual/Interface%20manuals/100293068k.pdf#G4.1427908 Logical Block Provisioning Management]" をサポートしていないと推定していることを示しています。
=== 賢いパーティションスキーム ===
 
   
  +
この場合、デバイスの [https://www.seagate.com/files/staticfiles/support/docs/manual/Interface%20manuals/100293068k.pdf#G4.3076244 "Logical Block Provisioning" の "Vital Product Data" (VPD) ページ]でデータのアンマッピングのためのサポートされている機能を確認する必要があります。以下のコマンドでこれを行うことができます:
*SSD と HDD 両方搭載しているシステムでは、読み書きを減らすために {{ic|/var}} パーティションは SSD ではなく磁気ディスク上に配置すると良いでしょう。
 
   
  +
# sg_vpd -a /dev/sdX
===noatime マウントフラグ===
 
   
  +
出力から以下のような行を探してください:
このフラグを {{ic|/etc/fstab}} で使うと、ファイルに関連付けられた atime 情報の更新によるファイルシステムの読み込みアクセスの記録が止められます。{{ic|noatime}} 設定によってファイルの読み込みだけでファイルシステムに書き込みを行うのを阻止することになります。前のセクションで説明しているように書き込みは負担が大きいため、ある程度パフォーマンスが向上する可能性があります。
 
   
  +
Unmap command supported (LBPU): 1
{{Note|このオプションを有効にしても、ファイルが変更されたときのファイルの変更日時の情報は更新されます。}}
 
  +
Write same (16) with unmap bit supported (LBPWS): 0
  +
Write same (10) with unmap bit supported (LBPWS10): 0
   
  +
この例では、デバイスが "UNMAP" コマンドをサポートしていることを示しています。
/dev/sda1 / ext4 defaults,'''noatime''' 0 1
 
/dev/sda2 /home ext4 defaults,'''noatime''' 0 2
 
   
  +
以下のコマンドの出力を見てください:
{{Note|この設定を使うと [[Mutt]] などのプログラムで問題がおこります。ファイルのアクセス日時がやがて変更日時よりも前になってしまうからです。{{ic|noatime}} の代わりに {{ic|relatime}} オプションを使うことでファイルの最終変更日時よりも atime が前にならないようにすることができます。また、maildir ストレージフォーマットを使うことでも mutt の問題は解決します。}}
 
   
  +
$ cat /sys/block/sdX/device/scsi_disk/*/provisioning_mode
=== 頻繁に使うファイルを RAM に移動する ===
 
   
  +
カーネルがデバイスのデータアンマッピング機能を検出していない場合、このコマンドはおそらく "full" を返します。
==== ブラウザのプロファイル ====
 
  +
"full" の他に、カーネルの SCSI ストレージドライバは現在以下の provisioning_mode 値が登録されています:
   
  +
unmap
tmpfs を使って chromium, firefox, opera などのブラウザプロファイルを RAM へ''簡単に''マウントすることができ、また、rsync を使うことで HDD によるバックアップと同期させることができます。これによって速度が向上するだけでなく、SSD の読み書きサイクルを節約することにもなります。
 
  +
writesame_16
  +
writesame_10
  +
writesame_zero
  +
disabled
   
  +
上記の例の場合、"provisioning_mode" を "unmap" に設定することで、カーネルにそれを使用するように要求することができます:
AUR には {{AUR|profile-sync-daemon}} など、この手順を自動化するパッケージが複数存在します。
 
   
  +
# echo "unmap" >/sys/block/sdX/device/scsi_disk/*/provisioning_mode
==== その他 ====
 
   
  +
このコマンドを実行すると即座に、/dev/sdX 上で "blkdiscard" のようなツールを使ったり、/dev/sdX 上にマウントされているファイルシステム上で "fstrim" を実行したりできるようになるはずです。
ブラウザプロファイルを RAM に移動するのと同じ理由で、(ウェブサーバーを動かしている場合) {{ic|/srv/http}} などの頻繁に利用するディレクトリを移動することもできます。{{AUR|profile-sync-daemon}} の姉妹プロジェクトとして {{AUR|anything-sync-daemon}} があり、同じ方法・セーフガードを使って'''あらゆる'''ディレクトリを RAM に同期させるよう定義することが可能です。
 
   
  +
特定のベンダ/製品の外部デバイスが接続されたときに "provisioning_mode" を自動的に有効化したいならば、"[[udev]]" の機構を使うことで可能です。まず、USB Vendor と Product ID を調べてください:
=== tmpfs でコンパイルする ===
 
   
  +
$ cat /sys/block/sdX/../../../../../../idVendor
意図的に {{ic|/tmp}} でコンパイルすることで問題を少なくすることができます。Arch Linux はデフォルトで {{ic|/tmp}} を物理メモリの50%にします。メモリが 4GB 以上あるシステムならば、{{ic|/scratch}} を作成して tmpfs にマウントすることで物理メモリの50%以上を使うように設定できます。
 
  +
$ cat /sys/block/sdX/../../../../../../idProduct
   
  +
そして、[[udev]] ルールのファイルに以下の内容を記述してください (この例では、idVendor 152d と idProduct 0583 を使っています):
例えば物理メモリが 8GB あるマシンの場合:
 
   
  +
# echo 'ACTION=="add|change", ATTRS{idVendor}=="152d", ATTRS{idProduct}=="0583", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"' >>/etc/udev/rules.d/10-uas-discard.rules
{{hc|<nowiki>$ mount | grep tmpfs</nowiki>|2=
 
  +
tmpfs /scratch tmpfs nodev,nosuid,size=7G 0 0
 
  +
(関連する idVendor/idProduct は {{ic|lsusb}} を使うことでも取得できます。)
  +
  +
== ファームウェア ==
  +
  +
デバイスのベンダーによってサポートされていれば、[[fwupd]] ユーティリティを使ってファームウェアをアップデートすることが推奨されます。
  +
  +
現在のファームウェアバージョンを確認するには:
  +
  +
# smartctl -i /dev/''ssd_device''
  +
  +
=== ADATA ===
  +
  +
Linux での SSD ファームウェアのアップデートは ADATA によってサポートされていません。Windows でのみ利用できるユーティリティ SSD ToolBox が ADATA によって ADATAの[https://www.adata.com/en/support/consumer?tab=downloads&download=driver サポートページ]と ADATA XPG の[https://www.xpg.com/en/support/xpg?tab=downloads&download=driver サポートページ]で提供されています。このツールにより、監視、TRIM、ベンチマーク、ADATA SSD ファームウェアのアップデートができます。
  +
  +
{{Warning|[[Wine]] を使ってファームウェアをアップデートすることは推奨されていません。Wine はハードウェアインターフェイスを扱うようには設計されておらず、不完全なファームウェアアップデートはデバイスを文鎮化させる可能性があります。}}
  +
  +
=== Crucial ===
  +
  +
Crucial は ISO イメージを使ってファームウェアをアップデートする方法を提供しています。[https://www.crucial.com/usa/en/support-ssd SSD サポートページ]から製品を選んで "Manual Boot File" をダウンロードすることでイメージを入手できます。
  +
  +
{{Note|Crucial が提供している ISO イメージはハイブリッドではないようです。{{ic|dd}} コマンドを使って [[MBR]] が存在しないデバイスにイメージをコピーした場合、デバイスが起動できなくなります。{{Pkg|syslinux}} をインストールし、{{ic|isohybrid path/to/image.iso}} を実行してください。}}
  +
  +
M4 Crucial モデルを使っている場合、{{ic|smartctl}} でファームウェアのアップグレードが必要かどうかチェックすることが可能です。
  +
  +
{{hc|$ smartctl --all /dev/sd'''X'''|
  +
==> WARNING: This drive may hang after 5184 hours of power-on time:
  +
https://www.tomshardware.com/news/Crucial-m4-Firmware-BSOD,14544.html
  +
See the following web page for firmware updates:
  +
https://www.crucial.com/usa/en/support-ssd
 
}}
 
}}
   
  +
上記の警告が表示された場合は、重要なデータをバックアップしてから'''直ちにアップグレードを行うこと'''が推奨されます。ISO イメージと Grub を使用して Crucial MX100 のファームウェアをアップデートする手順は [https://www.rojtberg.net/1008/updating-crucial-mx100-firmware-with-ubuntu/ こちら] を参照してください。
詳細については、[[Makepkg#コンパイル時間を短縮する]] を参照してください。
 
   
  +
=== Intel ===
=== ファイルシステムのジャーナリングを無効にする ===
 
   
  +
Intel は、Windows の [https://downloadcenter.intel.com/download/30380/ Intel® Memory and Storage Tool (GUI)] ソフトウェアに対応していないオペレーティングシステム向けに、Linux ライブシステムをベースとする [https://downloadcenter.intel.com/download/18363 Firmware Update Tool] を配布しています。
SSD で ext4 などのジャーナリングファイルシステムを使っている場合、ジャーナルを無効にすることで読み書きを減らすことができます。ただし、ジャーナリングを無効にしたファイルシステムを使用するときの明らかな欠点として、ちゃんとマウントが解除されていない (つまり、電源が落ちたり、カーネルが固まったりする) とデータが消失します。最新の SSD では、ほとんどの場合、あまり読み書きサイクルを増やさないでジャーナリングを有効にすることができると [http://tytso.livejournal.com/61830.html Ted Tso] は主張しています:
 
   
  +
また、ファームウェアをリフラッシュできる、[https://downloadcenter.intel.com/download/29337/Intel-Memory-and-Storage-Tool-CLI-Command-Line-Interface-?product=83425 Intel Memory and Storage (MAS) Tool] という新しい Linux コマンドラインユーティリティもあります。{{AUR|intel-mas-cli-tool}} パッケージで利用できます。[https://downloadmirror.intel.com/646992/CLI-Intel-MAS-1.10-User-Guide-Public-342245-011US.pdf PDF のユーザガイド]があります。
'''{{ic|noatime}} でマウントされた ext4 ファイルシステムに書き込まれるデータの量 (単位はメガバイト)。'''
 
   
  +
ファームウェアの状態をチェックすると例えば以下のように表示されます:
{| class="wikitable"
 
! 操作 !! ジャーナル !! ジャーナルなし !! 減少率
 
|-
 
!git clone
 
|367.0
 
|353.0
 
|3.81 %
 
|-
 
!make
 
|207.6
 
|199.4
 
|3.95 %
 
|-
 
!make clean
 
|6.45
 
|3.73
 
|42.17 %
 
|}
 
   
  +
{{hc|# intelmas show -intelssd 0|
''"この結果は、make clean など、メタデータの変更が多い操作はディスクに書き込むデータ量がほぼ2倍になることを示しています。これは当然の結果です。なぜならメタデータが最終的にディスクに書き込まれる前に、メタデータブロックへの変更はまず全てジャーナルに書き込まれ、それからジャーナルのトランザクションが行われるからです。しかしながら、ファイルシステムのメタデータブロックを変更するだけでなくデータの書き込みも行うような一般的な操作では、違いはかなり少なくなります。"''
 
  +
DevicePath : /dev/nvme0n1
  +
DeviceStatus : Healthy
  +
Firmware : 002C
  +
FirmwareUpdateAvailable : The selected Intel SSD contains current firmware as of this tool release.
  +
}}
   
  +
システム上に1つしか SSD が存在しない場合、{{ic|-intelssd 0}} は省略できます。2番目の SSD は {{ic|-intelssd 1}} となります。
{{Note|表にある make clean の例は、この記事の[[#tmpfs でコンパイルする|前のセクション]]で説明している tmpfs でコンパイルするのが何故推奨されているのかを示す典型例でしょう。}}
 
   
  +
アップデートが利用できる場合は、{{ic|intelmas load -intelssd 0}} を実行することでアップデートできます。上記の PDF ユーザガイドでは、この手順は Linux で2回 (間に電源の切断と再投入を挟んで) 行う必要があると書かれています。すべてのデバイス用の最新のファームウェアは、MAS Tool 自体の一部として配布されており、別途ダウンロードする必要はありません。
== ファイルシステムの選択 ==
 
   
=== Btrfs ===
+
=== Kingston ===
   
  +
Sandforce ベースのドライバ向けに KFU ツールが利用できます ({{AUR|kingston_fw_updater}})。
[[wikipedia:ja:Btrfs|Btrfs]] のサポートは Linux カーネルのメインライン 2.6.29 リリースから含まれています。ext4 の後継として使っているアーリーアダプターもいますが、人によってはまだ日常的な利用には適さないと感じるかもしれません。詳細は [[Btrfs|Btrfs]] の記事を読んで下さい。
 
   
=== Ext4 ===
+
===Mushkin===
   
  +
マイナーな Mushkin ブランドのソリッドステートドライブも Sandforce コントローラーを使っており、ファームウェアをアップデートする Linux ユーティリティ (Kingston のものとほとんど同じ) が存在します。
[[wikipedia:ja:Ext4|Ext4]] は SSD をサポートしているもうひとつのファイルシステムです。2.6.28 から安定していると考えられており日常的な利用ができるレベルまで成熟しています。ext4 のユーザーは [[fstab|fstab]] で {{ic|discard}} マウントオプションを使って (もしくは {{ic|tune2fs -o discard /dev/sdaX}} で) 明示的に TRIM コマンドのサポートを有効にする必要があります。
 
ext4 に関する詳細情報は[https://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=Documentation/filesystems/ext4.txt カーネルツリーの公式ドキュメント]を見て下さい。
 
   
===XFS===
+
=== OCZ ===
   
  +
OCZ は Linux 用の [https://www.ocz.com/us/download/clout Command Line Online Update Tool (CLOUT)] を用意しています。{{AUR|ocz-ssd-utility}}, {{AUR|ocztoolbox}}, {{AUR|oczclout}} パッケージでインストールすることができます。
ext4 や btrfs に加えて、[[wikipedia:ja:XFS|XFS]] も TRIM をサポートしていることを知っているユーザーは多くないでしょう。通常の方法で有効にすることができます。つまり、上述の discard オプションを利用するか、または fstrim コマンドを使うか選択することが可能です。詳細は [http://xfs.org/index.php/FITRIM/discard XFS wiki] を見て下さい。
 
   
===JFS===
+
=== Samsung ===
   
  +
Samsung は Magician ソフトウェア以外の方法によるアップデートを"サポートしない"としていますが、不可能ではありません。Magician ソフトウェアは、ファームウェアのアップデートを含むブータブルな USB ドライブを作成することはできますが、Samsung はもはやコンシューマ SSD 向けのソフトウェアを提供していません。また、Samsung は 、ファームウェアをアップデートできる作成済みの[https://www.samsung.com/semiconductor/minisite/ssd/download/tools.html ブータブルな ISO イメージ]も提供しています。他のオプションは、{{AUR|samsung_magician-consumer-ssd}} によって提供されている、Samsung の ''magician'' ユーティリティを使うことです。Magician は Samsung ブランドの SSD のみをサポートしています。OEM (Lenovo など) 向けに Samsung によって製造された SSD はサポートされていません。
Linux カーネルバージョン 3.7 から、完全な TRIM サポートが追加されました。現在、このトピックに関する情報はあまり揃っていませんが、[http://www.phoronix.com/scan.php?page=news_item&px=MTE5ODY Linux ニュースサイト] によって確かに取り上げられています。{{ic|discard}} マウントオプションにより、または fstrim を使う方法で有効にすることが可能です。
 
   
  +
{{Note|Samsung はファームウェアアップデートをわかりやすく提供していません。ファームウェアアップデートに関連するページが4つあり、それぞれで別々の方法が示されています。}}
===他のファイルシステム===
 
   
  +
(Microsoft Windows で Samsung の "Magician" ソフトウェアを使わずに) Linux で作成したライブ USB スティックからファームウェアアップデートを実行したい場合は、[https://web.archive.org/web/20160322230114/fomori.org/blog/?p=933] を参照してください。注意点として、このブログ記事では Master Boot Record ([[MBR]]) を使ってブート可能な USB ドライブを作成する方法が説明されており、最近のマザーボートでは MBR がサポートされていないことがあります (例えば、[https://www.intel.com/content/www/us/en/support/articles/000057401/intel-nuc.html Intel NUC] はもはや MBR をサポートしていません)。
他にも [[wikipedia:List_of_flash_file_systems#File_systems_optimized_for_flash_memory.2C_solid_state_media|SSD に特化して]]設計されたファイルシステムが存在します。[[F2fs|F2fs]] などがあります。
 
   
== ファームウェアのアップデート ==
+
==== Linux でのアップデート ====
   
  +
SSD のファームウェアは以下に示すように (ブータブルな USB スティックを作らなくても) ネイティブにアップデートできます。まず、[https://www.samsung.com/semiconductor/minisite/ssd/download/tools Samsung downloads ページ]を開き、"Samsung SSD Firmware" セクションへ行き、あなたの SSD 用の最新のファームウェア (ISO イメージであるはずです) をダウンロードしてください。
=== ADATA ===
 
   
  +
{{Note|一部の ISO イメージには、以下で言及されている {{ic|initrd}} Linux イメージが欠落しています。その場合、代わりに [[#古い SSD]] を見てください。}}
ADATA は Linux (i686) で利用できるユーティリティを、[http://www.adata.com.tw/index.php?action=ss_main&page=ss_content_driver&lan=en ここ] にある彼らのサポートページに用意しています。モデルを選択すれば最新のファームウェアへのリンクが表示されます。
 
   
  +
ISO イメージから {{ic|initrd}} Linux イメージを抽出してください:
最新の Linux アップデートユーティリティはファームウェアと一緒に入っており root で実行してください。先立ってバイナリファイルに対して適切なパーミッションを設定する必要があるかもしれません。
 
   
  +
$ bsdtar xf ''samsung_ssd_firmware''.iso initrd
===Crucial===
 
   
  +
{{ic|root/fumagician/}} を抽出してください。このディレクトリには、ファームウェアのアップデートファイルが含まれています:
Crucial は ISO イメージを使ってファームウェアをアップデートする方法を提供しています。[http://www.crucial.com/support/firmware.aspx ここ] から製品を選んで "Manual Boot File" をダウンロードすることでイメージを入手できます。M4 Crucial モデルを使っている場合、{{ic|smartctl}} でファームウェアのアップグレードが必要かどうかチェックすることが可能です。
 
   
  +
$ bsdtar xf initrd root/fumagician
{{hc|$ smartctl --all /dev/sd'''X'''|
 
==> 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
 
}}
 
   
  +
最後に、{{ic|root/fumagician/fumagician}} を root 権限で実行し、(ファームウェアが正常にアップデートされたのであれば) システムを[[再起動]]してください。
このような警告が表示された場合は重要なデータをバックアップしてから'''直ちにアップグレードを行うこと'''が推奨されます。
 
   
  +
再起動後にファームウェアのバージョンが変わっていない場合は、{{ic|root/fumagician/fumagician 2> log}} を実行して、出力されたログファイルからエラーを探してください。例えば、ログに 'unzip is not available' という記述がある場合は、unzip をインストールするか、initrd から抽出してください。
===Kingston===
 
   
  +
===== 古い SSD =====
Kingston は Sandforce ベースのドライブのファームウェアをアップデートする Linux ユーティリティを用意しています。Kingston の [http://www.kingston.com/en/support/technical/downloads?product=sh100s3&filename=sh100_503fw_win サポートページ] で見つけることができます。
 
   
  +
SSD ファームウェアの ISO イメージのいくつかには、{{ic|initrd}} Linux イメージではなく FreeDOS イメージが含まれています。ゆえに、SSD ファームウェアのアップデートに必要なステップは上記とは異なります。以下の表は、そのような SSD (とそれに関連するパス) のリストです:
===Mushkin===
 
   
  +
{| class="wikitable"
マイナーな Mushkin ブランドのソリッドステートドライブも Sandforce コントローラーを使っており、ファームウェアをアップデートする Linux ユーティリティ (Kingston のものとほとんど同じ) が存在します。
 
  +
! SSD モデル !! FreeDOS イメージパス !! ファームウェアパッケージパス
  +
|-
  +
| 470, 830 || {{ic|BTDSK.IMG}} || {{ic|SSR/}}
  +
|-
  +
| 840 || {{ic|isolinux/btdsk.img}} || rowspan="2" | {{ic|samsung/DSRD/}}
  +
|-
  +
| 840 EVO (mSATA), Pro || {{ic|ISOLINUX/BTDSK.IMG}}
  +
|}
   
  +
まず、ISO イメージから FreeDOS イメージを抽出してください:
=== OCZ ===
 
   
  +
$ bsdtar xf ''samsung_ssd_firmware''.iso ''freedos_image_path''
OCZ は[http://www.ocztechnology.com/ssd_tools/ ここ] にある彼らのフォーラムで Linux (i686 と x86_64) 向けのコマンドラインユーティリティを提供しています。
 
   
  +
FreeDOS イメージを {{ic|/mnt/}} にマウントしてください:
===Samsung===
 
   
  +
# mount ''freedos_image_path'' /mnt
Samsung は Magician Software 以外の方法によるアップデートを"サポートしない"としていますが、不可能ではありません。Magician Software を使ってファームウェアのアップデートを起動する USB ドライブを作成することができるようですが、一番簡単な方法はファームウェアのアップデート用のブータブル ISO イメージを使用することです。イメージは[http://www.samsung.com/global/business/semiconductor/samsungssd/downloads.html ここ] から入手することが可能です。
 
   
  +
Magician SSD 管理ユーティリティから ''Disk Number'' にある SSD のディスク番号を入手してください:
{{Note|Samsung does not make it obvious at all that they actually provide these. They seem to have 4 different firmware update pages each referencing different ways of doing things.}}
 
   
  +
# magician --list
(Microsoft Windows で Samsung の "Magician" ソフトウェアを使わずに) Linux で作成したライブ USB スティックからファームウェアアップデートを実行したい場合は、[http://fomori.org/blog/?p=933 この記事] を参照してください。
 
  +
  +
ファームウェアパッケージのパスを指定し、指定したディスクに対して SSD ファームウェアをアップデートしてください:
  +
  +
# magician --disk ''disk_num'' --firmware-update --fwpackage-path /mnt/''firmware_package_path''
  +
  +
最後に、(root 権限で実行した) {{ic|magician --list}} の出力から ''Firmware'' にあるバージョンを確認し、ファームウェアが正常にアップデートできたか検証してください。ファームウェアが正常にアップデートされたのであれば、システムを再起動してください。
   
 
=== SanDisk ===
 
=== SanDisk ===
   
SanDisk は SanDisk SSD Toolkit でサポートされていないオペレーティングシステムにおいて SSD のファームウェアアップデートをするための '''ISO ファームウェアイメージ'''を作成しています。SSD の''モデル''だけでなく、SSD の''容量''にあわせて適切なファームウェアを選択する必要があります (例: 60GB '''または''' 256GB)。適当な ISO ファームウェアイメージを焼いたら、PC を再起動して新しく作成した CD/DVD ブートディスクで起動してください (USB スティックからでも動作するかもしれません)
+
SanDisk はSanDisk SSD Toolkit でサポートされていないオペレーティングシステムにおいて SSD のファームウェアアップデートをするための ISO ファームウェアイメージを作成しています。
   
  +
適切な ''SSD モデル'' '''だけでなく'''、適切な SSD ''容量'' (例: 60 GB '''または''' 256GB) も合わせて、ファームウェアを選択しなければなりません。ISO ファームウェアイメージを焼いたあと、PC を再起動し、新しく作成した CD/DVD ブートディスクを起動してください (USB スティックでも動作するかもしれません)。
ISO イメージには Linux カーネルと initrd が含まれています。それらを {{ic|/boot}} パーティションに展開して [[GRUB|GRUB]] や [[Syslinux|Syslinux]] で起動してファームウェアをアップデートしてください。
 
   
  +
ISO イメージには、Linux カーネルと initrd が含まれています。それらを {{ic|/boot}} パーティションに抽出し、[[GRUB]] や [[Syslinux]] でそれらを起動して、ファームウェアをアップデートしてください。
ファームウェアのアップデートが列挙された一つのページは存在しませんが (サイトがわかりづらい)、以下が関連するリンクです:
 
   
  +
参照:
SanDisk Extreme SSD [http://kb.sandisk.com/app/answers/detail/a_id/10127 Firmware Release notes] と [http://kb.sandisk.com/app/answers/detail/a_id/10476 Manual Firmware update version R211]
 
   
  +
* SanDisk Extreme SSD [https://forums.sandisk.com/t/sandisk-extreme-ssd-firmware-download-for-mac-and-linux-and-pc/74022 手動ファームウェアアップデート バージョン R211]
SanDisk Ultra SSD [http://kb.sandisk.com/app/answers/detail/a_id/10192 Firmware release notes] と [http://kb.sandisk.com/app/answers/detail/a_id/10477 Manual Firmware update version 365A13F0]
 
  +
* SanDisk Ultra SSD [https://forums.sandisk.com/t/sandisk-ultra-ssd-firmware-download-for-mac-and-linux-and-pc/74277 手動ファームウェアアップデート バージョン 365A13F0]
  +
* SanDisk Ultra+ SSD [https://forums.sandisk.com/t/sandisk-ultra-ssd-manual-firmware-update-version-x2316rl/74263 手動ファームウェアアップデート バージョン X2316RL] - "H2" モデルと "HP" モデルのうちどちらが使用されているかを確認するには、{{ic|smartctl -i dev/disk/by-id/*SanDisk!(*part*)}} を root として実行してください。
   
 
== 参照 ==
 
== 参照 ==
   
* [http://www.reddit.com/r/archlinux/comments/rkwjm/what_should_i_keep_in_mind_when_installing_on_ssd/ Discussion on Reddit about installing Arch on an SSD]
+
* [https://www.reddit.com/r/archlinux/comments/rkwjm/what_should_i_keep_in_mind_when_installing_on_ssd/ SSD Arch をインストールすることについての Reddit における討論]
  +
* [https://lore.kernel.org/linux-btrfs/20120830215008.GB2879@localhost.localdomain/ Re: Varying Leafsize and Nodesize in Btrfs]
* パフォーマンスを出すためにソリッドステートと回転デバイスを一緒に使う高度な話については [[Flashcache]] の記事を見て下さい。
 
  +
* [https://lore.kernel.org/linux-btrfs/5052700D.4020003@gmail.com/ Re: SSD alignment and Btrfs sector size]
* [http://lifehacker.com/5837769/make-sure-your-partitions-are-correctly-aligned-for-optimal-solid-state-drive-performance Speed Up Your SSD By Correctly Aligning Your Partitions] (using GParted)
 
  +
* [https://forums.anandtech.com/threads/erase-block-alignment-misinformation.2266113/ Erase Block (Alignment) Misinformation?]
* [http://permalink.gmane.org/gmane.comp.file-systems.btrfs/19446 Re: Varying Leafsize and Nodesize in Btrfs]
 
  +
* [https://superuser.com/questions/492084/is-alignment-to-erase-block-size-needed-for-modern-ssds Is alignment to erase block size needed for modern SSD's?]
* [http://thread.gmane.org/gmane.comp.file-systems.btrfs/19650/focus=19667 Re: SSD alignment and Btrfs sector size]
 
  +
* [https://lore.kernel.org/linux-btrfs/jgui4j$th5$1@dough.gmane.org/ Btrfs support for efficient SSD operation (data blocks alignment)]
* [http://forums.anandtech.com/showthread.php?t=2266113 Erase Block (Alignment) Misinformation?]
 
  +
* [http://superuser.com/questions/492084/is-alignment-to-erase-block-size-needed-for-modern-ssds Is alignment to erase block size needed for modern SSD's?]
 
  +
{{TranslationStatus|Solid state drive|2024-03-22|802360}}
* [http://thread.gmane.org/gmane.comp.file-systems.btrfs/15646 Btrfs support for efficient SSD operation (data blocks alignment)]
 
* [http://serverfault.com/questions/356534/ssd-erase-block-size-lvm-pv-on-raw-device-alignment SSD, Erase Block Size & LVM: PV on raw device, Alignment]
 

2024年3月22日 (金) 09:48時点における最新版

関連記事

この記事では、ソリッドステートドライブ (SSD) や他のフラッシュメモリベースのストレージデバイスの取り扱いに関するトピックをカバーしています。

特定の目的のために SSD をパーティショニングしたい場合、フラッシュメモリ向けに最適化されたファイルシステムのリストで検討すると良いかもしれません。

一般的な利用では、自由にファイルシステムを選び、#TRIM を有効化すると良いでしょう。

使用法

TRIM

ファイルの削除がファイルシステムレベルのみで処理される[1]ハードドライブと比較して、SSD は、メモリブロックが解放されて再利用可能になったときにディスクコントローラに通知することで利益を得ます。SSD を構成するフラッシュセルは書き込み操作の度に少しづつ摩耗するため、ディスクコントローラは全てのセルに書き込み操作を分散させるアルゴリズムを使用します: この処理はウェアレベリングと呼ばれます。NVMe の DEALLOCATE や、SAS の UNMAPATA_TRIM コマンドが無ければ、空きメモリブロックがなくなると、1つセルに書き込む前にそのセルを削除するためにデータを移動しなければならないため、ディスクコントローラは書き込み操作により多くの時間を消費するようになってしまいます (Wikipedia:ja:ライトアンプリフィケーション を参照): TechSpot のベンチマークでは、SSD をデータで埋める前と後でのパフォーマンスへの影響を表しています。

ノート: TRIM を使用したいのであれば、定期的な TRIM か連続的な TRIM のどちらか一方のみを使用してください。連続的な TRIM は、TRIM コマンドを発行する方法として Linux コミュニティの間で最も好まれているわけではありません。例えば、Ubuntu は定期的な TRIM をデフォルトで有効化しており [2]、Debian は 連続的な TRIM の使用を推奨しておらず、Red Hat は可能であれば連続的な TRIM よりも定期的な TRIM を使用することを推奨しています [3]

Linux カーネルバージョン 3.8 以降、異なるファイルシステムに対する TRIM のサポートが継続的に追加されました。概要は以下の表を見てください:

ファイルシステム 連続的な TRIM
(discard オプション)
定期的な TRIM
(fstrim)
参照
と備考
Bcachefs Yes No
Btrfs Yes Yes カーネル 6.2 から非同期 discard がデフォルトで有効化されています。
exFAT Yes Yes fstrim はカーネル 5.13 以降、サポートされています。[4]
ext3 Yes Yes
ext4 Yes Yes [5] の "discard, nodiscard(*)"
F2FS Yes Yes
JFS Yes Yes [6]
NILFS2 Yes Yes
NTFS Yes No ntfs3 カーネルドライバは連続的な TRIM のみをサポートしています。
No Yes NTFS-3G ドライバは定期的な TRIM のみをサポートしています。
VFAT Yes Yes fstrim はカーネル 4.19 以降、サポートされています。[7]
XFS Yes Yes [8][リンク切れ 2024-03-03]
警告: TRIM を試みる前に、SSD が TRIM をサポートしていることを確認する必要があります。さもないと、データを失うかもしれませんよ!

TRIM のサポートを確認するには、以下を実行してください:

$ lsblk --discard

そして、DISC-GRAN (discard granularity) と DISC-MAX (discard max bytes) 列の値を確認してください。値が 0 でなければ、TRIM をサポートしていることを意味します。

SATA SSD の場合にのみ、hdparm パッケージは、hdparm -I /dev/sda | grep TRIMroot ユーザとして実行することにより、TRIM サポートを検出することができます。hdparm は、NVMe SSD をサポートしていません。

定期的な TRIM

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

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

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

連続的な 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#短所 を見てください。

/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

警告: discard オプションは、暗号化されているブロックデバイスを通して discard 要求を渡せるようにします。これは、SSD ストレージのパフォーマンスを向上させるかもしれませんし、しないかもしれません[9]。しかし、セキュリティに影響を与えます。詳細は以下の記事を見てください:

ルート以外のファイルシステムの場合、/etc/crypttab を編集して、SSD 上の暗号化されているブロックデバイスのオプションリストに discard を追加してください (dm-crypt/システム設定#crypttab を見てください)。

ルートファイルシステムの場合、dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート の指示に従って、ブートローダーの設定に適切なカーネルパラメータを追加してください。

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

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

セクタサイズ

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

SSD のメモリセルのクリア

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

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

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

セキュリティ

Frozen モード

一部のマザーボードファームウェアは初期化時に ATA SECURITY FREEZE LOCK コマンドを SATA デバイスに発行します。これによりドライブは frozen モードになり、SEC2 状態 (セキュリティ無効、未ロック、frozen 状態) に遷移します。同様に、一部の SSD (と HDD) も工場出荷時にこの状態にすでに設定されています。このことは hdparmsmartctl の出力から確認できます:

# 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.
# smartctl -g security /dev/sda
ATA Security is:  Disabled, frozen [SEC2]

デバイスのフォーマットやオペレーティングシステムのインストールといった操作は、frozen モードの影響を受けません。

上記の hdparm の出力は、デバイスが起動時に HDD パスワードによってロックされていないこと、そして frozen 状態によってデバイスを (実行時にパスワードを設定してデバイスをロックさせてしまうような) マルウェアから保護していることを示しています。

"frozen" 状態のデバイスにパスワードを設定したい場合、それに対応しているマザーボード BIOS が必要です。ハードウェア暗号化に必要なので、多くのノートパソコンでサポートされていますが、デスクトップやサーバーのボードではサポートがあるかどうかはっきりしないことがあります。

例えば、Intel DH67CL/BL マザーボードの場合、設定にアクセスするには物理的なジャンパによってマザーボードを "maintenance mode" に設定する必要があります。[10]

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

SSD を消去するときは、ディスクの完全消去#hdparmソリッドステートドライブ/メモリセルの消去 を見て下さい。

スリープから復帰したあとに SSD 状態を frozen モードにする

SSD は S3 スリープから復帰すると SEC1 状態 (セキュリティ無効、未ロック、非 frozen) に戻っていることが多く、ソリッドステートドライブ/メモリセルの消去 で説明されているように ATA SECURITY ERASE UNIT コマンドに対して脆弱になっています。

この問題を回避するために、スリープからの復帰後にスクリプトを実行することができます:

/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

システムに複数のストレージデバイスやポータブル USB ドライブが存在している場合、Hdparm#udev ルールによる永続的な設定 に書かれてあるテクニックを利用して、--security-freeze を全ドライブ (HDD も含む) に発行することもできます。

ハードウェア暗号化

#Frozen モード で説明されているように、BIOS でストレージデバイス (SSD/HDD) のパスワードを設定すると、それをサポートしているデバイスのハードウェア暗号化も初期化される場合があります。デバイスが OPAL 規格にも準拠している場合、パスフレーズを設定する機能が BIOS に無くとも、これを行える場合があります。自己暗号化ドライブ を見てください。

トラブルシューティング

あなたが今遭遇している問題は、Linux 固有でないファームウェアのバグである可能性があります。ゆえに、SSD に影響を与える問題のトラブルシューティングに挑戦する前に、以下のアップデートが利用可能であるかをチェックするべきです:

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

NCQ エラーを解消する

SSD や SATA チップセットによっては Linux Native Command Queueing (NCQ) が正しく動作しないことがあります。journal に以下のようなエラーが表示されます:

ata9: exception Emask 0x0 SAct 0xf SErr 0x0 action 0x10 frozen
ata9.00: failed command: READ FPDMA QUEUED
ata9.00: cmd 60/04:00:d4:82:85/00:00:1f:00:00/40 tag 0 ncq 2048 in
res 40/00:18:d3:82:85/00:00:1f:00:00/40 Emask 0x4 (timeout)

起動時に NCQ を無効にするには、ブートローダーの設定におけるカーネルコマンドラインに libata.force=noncq を追加してください。ポート 9 のディスク 0 の NCQ だけを無効化するには次を使用: libata.force=9.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 での TRIM サポート

いくつかの USB から SATA へのブリッジチップ (VL715、VL716 など) や USB から PCIe へのブリッジチップ (IB-1817M-C31 のような外部 NVMe エンクロージャで使用されている JMicron JMS583 など) は、USB Attached SCSI ドライバ (Linux では "uas" と呼ばれています) を通して送信できる TRIM ライクなコマンドをサポートしています。

しかし、カーネルはこの機能を自動的に検出しない場合があり、この機能を使用しないかもしれません。 問題のブロックデバイスが /dev/sdX であると仮定すると、sg3_utils パッケージのコマンドを使えばそのケースに当てはまっているかどうかを確認できます:

# sg_readcap -l /dev/sdX

このコマンドの出力に "Logical block provisioning: lbpme=0" と始まる行がある場合、(LBPME) ビットがセットされていないためカーネルはそのデバイスが "Logical Block Provisioning Management" をサポートしていないと推定していることを示しています。

この場合、デバイスの "Logical Block Provisioning" の "Vital Product Data" (VPD) ページでデータのアンマッピングのためのサポートされている機能を確認する必要があります。以下のコマンドでこれを行うことができます:

# sg_vpd -a /dev/sdX

出力から以下のような行を探してください:

Unmap command supported (LBPU): 1
Write same (16) with unmap bit supported (LBPWS): 0
Write same (10) with unmap bit supported (LBPWS10): 0

この例では、デバイスが "UNMAP" コマンドをサポートしていることを示しています。

以下のコマンドの出力を見てください:

$ cat /sys/block/sdX/device/scsi_disk/*/provisioning_mode

カーネルがデバイスのデータアンマッピング機能を検出していない場合、このコマンドはおそらく "full" を返します。 "full" の他に、カーネルの SCSI ストレージドライバは現在以下の provisioning_mode 値が登録されています:

unmap
writesame_16
writesame_10
writesame_zero
disabled

上記の例の場合、"provisioning_mode" を "unmap" に設定することで、カーネルにそれを使用するように要求することができます:

# echo "unmap" >/sys/block/sdX/device/scsi_disk/*/provisioning_mode

このコマンドを実行すると即座に、/dev/sdX 上で "blkdiscard" のようなツールを使ったり、/dev/sdX 上にマウントされているファイルシステム上で "fstrim" を実行したりできるようになるはずです。

特定のベンダ/製品の外部デバイスが接続されたときに "provisioning_mode" を自動的に有効化したいならば、"udev" の機構を使うことで可能です。まず、USB Vendor と Product ID を調べてください:

$ cat /sys/block/sdX/../../../../../../idVendor
$ cat /sys/block/sdX/../../../../../../idProduct

そして、udev ルールのファイルに以下の内容を記述してください (この例では、idVendor 152d と idProduct 0583 を使っています):

# echo 'ACTION=="add|change", ATTRS{idVendor}=="152d", ATTRS{idProduct}=="0583", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"' >>/etc/udev/rules.d/10-uas-discard.rules

(関連する idVendor/idProduct は lsusb を使うことでも取得できます。)

ファームウェア

デバイスのベンダーによってサポートされていれば、fwupd ユーティリティを使ってファームウェアをアップデートすることが推奨されます。

現在のファームウェアバージョンを確認するには:

# smartctl -i /dev/ssd_device

ADATA

Linux での SSD ファームウェアのアップデートは ADATA によってサポートされていません。Windows でのみ利用できるユーティリティ SSD ToolBox が ADATA によって ADATAのサポートページと ADATA XPG のサポートページで提供されています。このツールにより、監視、TRIM、ベンチマーク、ADATA SSD ファームウェアのアップデートができます。

警告: Wine を使ってファームウェアをアップデートすることは推奨されていません。Wine はハードウェアインターフェイスを扱うようには設計されておらず、不完全なファームウェアアップデートはデバイスを文鎮化させる可能性があります。

Crucial

Crucial は ISO イメージを使ってファームウェアをアップデートする方法を提供しています。SSD サポートページから製品を選んで "Manual Boot File" をダウンロードすることでイメージを入手できます。

ノート: Crucial が提供している ISO イメージはハイブリッドではないようです。dd コマンドを使って MBR が存在しないデバイスにイメージをコピーした場合、デバイスが起動できなくなります。syslinux をインストールし、isohybrid path/to/image.iso を実行してください。

M4 Crucial モデルを使っている場合、smartctl でファームウェアのアップグレードが必要かどうかチェックすることが可能です。

$ smartctl --all /dev/sdX
==> WARNING: This drive may hang after 5184 hours of power-on time:
https://www.tomshardware.com/news/Crucial-m4-Firmware-BSOD,14544.html
See the following web page for firmware updates:
https://www.crucial.com/usa/en/support-ssd

上記の警告が表示された場合は、重要なデータをバックアップしてから直ちにアップグレードを行うことが推奨されます。ISO イメージと Grub を使用して Crucial MX100 のファームウェアをアップデートする手順は こちら を参照してください。

Intel

Intel は、Windows の Intel® Memory and Storage Tool (GUI) ソフトウェアに対応していないオペレーティングシステム向けに、Linux ライブシステムをベースとする Firmware Update Tool を配布しています。

また、ファームウェアをリフラッシュできる、Intel Memory and Storage (MAS) Tool という新しい Linux コマンドラインユーティリティもあります。intel-mas-cli-toolAUR パッケージで利用できます。PDF のユーザガイドがあります。

ファームウェアの状態をチェックすると例えば以下のように表示されます:

# intelmas show -intelssd 0
DevicePath : /dev/nvme0n1
DeviceStatus : Healthy
Firmware : 002C
FirmwareUpdateAvailable : The selected Intel SSD contains current firmware as of this tool release.

システム上に1つしか SSD が存在しない場合、-intelssd 0 は省略できます。2番目の SSD は -intelssd 1 となります。

アップデートが利用できる場合は、intelmas load -intelssd 0 を実行することでアップデートできます。上記の PDF ユーザガイドでは、この手順は Linux で2回 (間に電源の切断と再投入を挟んで) 行う必要があると書かれています。すべてのデバイス用の最新のファームウェアは、MAS Tool 自体の一部として配布されており、別途ダウンロードする必要はありません。

Kingston

Sandforce ベースのドライバ向けに KFU ツールが利用できます (kingston_fw_updaterAUR)。

Mushkin

マイナーな Mushkin ブランドのソリッドステートドライブも Sandforce コントローラーを使っており、ファームウェアをアップデートする Linux ユーティリティ (Kingston のものとほとんど同じ) が存在します。

OCZ

OCZ は Linux 用の Command Line Online Update Tool (CLOUT) を用意しています。ocz-ssd-utilityAUR, ocztoolboxAUR, oczcloutAUR パッケージでインストールすることができます。

Samsung

Samsung は Magician ソフトウェア以外の方法によるアップデートを"サポートしない"としていますが、不可能ではありません。Magician ソフトウェアは、ファームウェアのアップデートを含むブータブルな USB ドライブを作成することはできますが、Samsung はもはやコンシューマ SSD 向けのソフトウェアを提供していません。また、Samsung は 、ファームウェアをアップデートできる作成済みのブータブルな ISO イメージも提供しています。他のオプションは、samsung_magician-consumer-ssdAUR によって提供されている、Samsung の magician ユーティリティを使うことです。Magician は Samsung ブランドの SSD のみをサポートしています。OEM (Lenovo など) 向けに Samsung によって製造された SSD はサポートされていません。

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

(Microsoft Windows で Samsung の "Magician" ソフトウェアを使わずに) Linux で作成したライブ USB スティックからファームウェアアップデートを実行したい場合は、[11] を参照してください。注意点として、このブログ記事では Master Boot Record (MBR) を使ってブート可能な USB ドライブを作成する方法が説明されており、最近のマザーボートでは MBR がサポートされていないことがあります (例えば、Intel NUC はもはや MBR をサポートしていません)。

Linux でのアップデート

SSD のファームウェアは以下に示すように (ブータブルな USB スティックを作らなくても) ネイティブにアップデートできます。まず、Samsung downloads ページを開き、"Samsung SSD Firmware" セクションへ行き、あなたの SSD 用の最新のファームウェア (ISO イメージであるはずです) をダウンロードしてください。

ノート: 一部の ISO イメージには、以下で言及されている initrd Linux イメージが欠落しています。その場合、代わりに #古い SSD を見てください。

ISO イメージから initrd Linux イメージを抽出してください:

$ bsdtar xf samsung_ssd_firmware.iso initrd

root/fumagician/ を抽出してください。このディレクトリには、ファームウェアのアップデートファイルが含まれています:

$ bsdtar xf initrd root/fumagician

最後に、root/fumagician/fumagician を root 権限で実行し、(ファームウェアが正常にアップデートされたのであれば) システムを再起動してください。

再起動後にファームウェアのバージョンが変わっていない場合は、root/fumagician/fumagician 2> log を実行して、出力されたログファイルからエラーを探してください。例えば、ログに 'unzip is not available' という記述がある場合は、unzip をインストールするか、initrd から抽出してください。

古い SSD

SSD ファームウェアの ISO イメージのいくつかには、initrd Linux イメージではなく FreeDOS イメージが含まれています。ゆえに、SSD ファームウェアのアップデートに必要なステップは上記とは異なります。以下の表は、そのような SSD (とそれに関連するパス) のリストです:

SSD モデル FreeDOS イメージパス ファームウェアパッケージパス
470, 830 BTDSK.IMG SSR/
840 isolinux/btdsk.img samsung/DSRD/
840 EVO (mSATA), Pro ISOLINUX/BTDSK.IMG

まず、ISO イメージから FreeDOS イメージを抽出してください:

$ bsdtar xf samsung_ssd_firmware.iso freedos_image_path

FreeDOS イメージを /mnt/ にマウントしてください:

# mount freedos_image_path /mnt

Magician SSD 管理ユーティリティから Disk Number にある SSD のディスク番号を入手してください:

# magician --list

ファームウェアパッケージのパスを指定し、指定したディスクに対して SSD ファームウェアをアップデートしてください:

# magician --disk disk_num --firmware-update --fwpackage-path /mnt/firmware_package_path

最後に、(root 権限で実行した) magician --list の出力から Firmware にあるバージョンを確認し、ファームウェアが正常にアップデートできたか検証してください。ファームウェアが正常にアップデートされたのであれば、システムを再起動してください。

SanDisk

SanDisk は、SanDisk SSD Toolkit でサポートされていないオペレーティングシステムにおいて SSD のファームウェアアップデートをするための ISO ファームウェアイメージを作成しています。

適切な SSD モデル だけでなく、適切な SSD 容量 (例: 60 GB または 256GB) も合わせて、ファームウェアを選択しなければなりません。ISO ファームウェアイメージを焼いたあと、PC を再起動し、新しく作成した CD/DVD ブートディスクを起動してください (USB スティックでも動作するかもしれません)。

ISO イメージには、Linux カーネルと initrd が含まれています。それらを /boot パーティションに抽出し、GRUBSyslinux でそれらを起動して、ファームウェアをアップデートしてください。

参照:

参照

翻訳ステータス: このページは en:Solid state drive の翻訳バージョンです。最後の翻訳日は 2024-03-22 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。