「ソリッドステートドライブ」の版間の差分
(→欠点: 容量あたりの単価を更新) |
(同期) |
||
(同じ利用者による、間の45版が非表示) | |||
1行目: | 1行目: | ||
[[Category:ストレージ]] |
[[Category:ストレージ]] |
||
− | [[en:Solid |
+ | [[en:Solid state drive]] |
− | [[ |
+ | [[es:Solid State drive]] |
− | [[ru:Solid |
+ | [[ru:Solid state drive]] |
− | [[zh-hans:Solid |
+ | [[zh-hans:Solid state drive]] |
− | [[zh-hant:Solid State Drives]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|ソリッドステートドライブ/NVMe}} |
{{Related|ソリッドステートドライブ/NVMe}} |
||
{{Related|ソリッドステートドライブ/メモリセルの消去}} |
{{Related|ソリッドステートドライブ/メモリセルの消去}} |
||
{{Related|ベンチマーク/データストレージデバイス}} |
{{Related|ベンチマーク/データストレージデバイス}} |
||
− | {{Related|パフォーマンスの |
+ | {{Related|パフォーマンスの向上#ストレージデバイス}} |
− | {{Related|Flashcache}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
+ | この記事では、[[Wikipedia:ja:ソリッドステートドライブ|ソリッドステートドライブ]] (SSD) や他のフラッシュメモリベースのストレージデバイスの取り扱いに関するトピックをカバーしています。 |
||
− | この記事では SSD (solid state drive) について Linux と関係する様々なことを記述していますが、一般的な根本原則やキーポイントは Windows ファミリーや macOS など他のオペレーティングシステムで 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 から最高の性能を引き出すための情報を集めています。コンテンツはトピックでまとめられており、必ずしも系統的または時系列順に並べられているわけではないので、実際に推奨事項をやろうとする前に記事全体を読むと良いでしょう。 |
||
− | |||
− | {{Note|この記事は Linux を動作させているユーザーを対象にしていますが BSD, macOS, Windows など他のオペレーティングシステムを使っているユーザーにも中身がほぼ全て当てはまります。}} |
||
− | |||
− | ===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 の書き込みボリュームに移されます。日々の書き込みボリュームは耐用年数から差引かなければなりません。ただし、最新のハードウェアで行われた試験 [https://techreport.com/review/25889/the-ssd-endurance-experiment-500tb-update][https://techreport.com/review/26523/the-ssd-endurance-experiment-casualties-on-the-way-to-a-petabyte][https://techreport.com/review/27436/the-ssd-endurance-experiment-two-freaking-petabytes][https://techreport.com/review/27909/the-ssd-endurance-experiment-theyre-all-dead] では SSD の劣化は無視できるほどで、人為的に書き込みボリュームを多くしても SSD の耐用年数は HDD と並ぶとされています。 |
||
− | *ファームウェアやコントローラーが複雑。たまにバグが存在することもあります。最新のコントローラーは HDD と匹敵するほどの電力を消費します。コントローラーにはガベージコレクションの付いたログ構造化ファイルシステムに相当するものが[https://lwn.net/Articles/353411/ 実装されています]。回転メディアにあわせて作られた SATA コマンドは変換されます。ファームウェアによってはオンザフライで圧縮を行います。反復書き込みをフラッシュ領域全体に散らばらせて、特定のセルがすぐに劣化するのをふせぎます。また、書き込みをまとめることで小さな書き込みがそれと同じ回数大きなセルを消去することにならないようにしています。最後にデータを含むセルを移動するので時間の経過によってセルが中身を失うことはありません。 |
||
− | *ディスクが満杯になるにつれてパフォーマンスが低下します。一般にガベージコレクションはあまり上手く実装されておらず、空き領域が完全に空のセルに集められているとは限りません。 |
||
− | |||
− | ===購入前に考慮すべき事項=== |
||
− | |||
− | 最新の SSD を買う前に見ておくべきポイントがいくつか存在します。 |
||
− | *[[wikipedia:TRIM|TRIM]] のネイティブサポートは不可欠です。SSD の寿命を伸ばして、少しずつおこる書き込み操作のパフォーマンスの減少を少なくします。 |
||
− | *適切な容量の SSD を買うことが重要です。カーネルが SSD パーティションを効率的に利用するために占有率は75%以下が望まれます。 |
||
− | |||
− | ==SSD のパフォーマンスを最大化させるヒント== |
||
− | === パーティションアライメント === |
||
− | 消去ブロックサイズに揃えたパーティションを使用することを強く推奨します。昔は、パーティション分けをするときに手動で計算して設定する必要がありました。現在では一般的なパーティションツールのほとんどが(最新バージョンを使っていれば)パーティションアライメントを自動的に行います: |
||
− | * fdisk |
||
− | * gdisk |
||
− | * gparted |
||
− | * parted |
||
− | |||
− | パーティションが調整されているか確認するには、以下のように {{ic|/usr/bin/blockdev}} を使って問い合わせて下さい。'0' が返ってくれば、パーティションは揃えられています: |
||
− | # blockdev --getalignoff /dev/<partition> |
||
− | 0 |
||
=== TRIM === |
=== TRIM === |
||
+ | ファイルの削除がファイルシステムレベルのみで処理される[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 をデータで埋める前と後でのパフォーマンスへの影響を表しています。 |
||
− | ほとんどの SSD は長期間パフォーマンスを維持するために [[wikipedia:TRIM|ATA_TRIM コマンド]]をサポートしています。ベンチマーク前後などの詳細は、[https://sites.google.com/site/lightrush/random-1/howtoconfigureext4toenabletrimforssdsonubuntu この] チュートリアルを見て下さい。 |
||
+ | {{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]。}} |
||
− | Linux カーネルバージョン 3.8 現在、次のファイルシステムが TRIM をサポートしています: [[Ext4]], [[Btrfs]], [[JFS]], VFAT, [[XFS]], [[F2FS]]。 |
||
− | + | Linux カーネルバージョン 3.8 以降、異なる[[ファイルシステム]]に対する TRIM のサポートが継続的に追加されました。概要は以下の表を見てください: |
|
+ | {| class="wikitable sortable" |
||
− | VFAT はマウントフラグ {{ic|discard}} によって TRIM をサポートしています、カーネル4.19以降は{{ic|fstrim}}もサポートしています。 |
||
+ | ! ファイルシステム !! 連続的な TRIM <br> ({{ic|discard}} オプション) !! 定期的な TRIM <br> (''fstrim'') !! 参照<br> と備考 |
||
+ | |- |
||
+ | | [[Bcachefs]] || {{Yes}} || {{No}} || |
||
+ | |- |
||
+ | | [[Btrfs]] || {{Yes}} || {{Yes}} || カーネル 6.2 から非同期 discard がデフォルトで[[Btrfs#SSD TRIM|有効化]]されています。 |
||
+ | |- |
||
+ | | [[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 のサポートを確認するには、以下を実行してください: |
|
+ | $ lsblk --discard |
||
− | # hdparm -I /dev/sda |grep TRIM |
||
− | * Data Set Management TRIM supported (limit 1 block) |
||
− | * Deterministic read data after TRIM |
||
+ | そして、DISC-GRAN (discard granularity) と DISC-MAX (discard max bytes) 列の値を確認してください。値が 0 でなければ、TRIM をサポートしていることを意味します。 |
||
− | "limit 1 block" や "limit 8 block" の意味は、[[wikipedia:TRIM#ATA]] を見て下さい。 |
||
+ | SATA SSD の場合にのみ、{{Pkg|hdparm}} パッケージは、{{ic|hdparm -I /dev/sda {{!}} grep TRIM}} を [[ユーザーとグループ#概要|root ユーザ]]として実行することにより、TRIM サポートを検出することができます。{{Pkg|hdparm}} は、NVMe SSD をサポートしていません。 |
||
− | ==== fstrim で定期的に TRIM を適用する ==== |
||
+ | ==== 定期的な TRIM ==== |
||
− | {{Note|この方法は VFAT ファイルシステムでは使えません。}} |
||
− | + | {{Pkg|util-linux}} パッケージは {{ic|fstrim.service}} と {{ic|fstrim.timer}} [[systemd]] ユニットファイルを提供しています。タイマーを[[有効化]]すれば毎週サービスが実行されます。このサービスは、''discard'' 操作をサポートしているデバイス上のマウント済みのファイルシステムすべてに対して {{man|8|fstrim}} を実行します。 |
|
− | タイマーは最後に実行してから一週間経過したことを知るために (最初に実行したときに作成される) {{ic|/var/lib/systemd/timers/stamp-fstrim.timer}} のタイムスタンプを使います。そのため、何度も頻繁に実行される恐れはありません。 |
+ | タイマーは最後に実行してから一週間経過したことを知るために (最初に実行したときに作成される) {{ic|/var/lib/systemd/timers/stamp-fstrim.timer}} のタイムスタンプを使います。そのため、''anacron'' のように、何度も頻繁に実行される恐れはありません。 |
+ | ユニットの活動と状態を取得するには、[[journalctl]] を見てください。タイマーの周期や実行されるコマンドを変更するには、提供されているユニットファイルを[[編集]]してください。 |
||
− | {{ic|journalctl}} や {{ic|systemctl status}} コマンドを使うことでユニットの活動状態を調べることができます: |
||
− | {{hc|# journalctl -u fstrim|2= |
||
− | ... |
||
− | <shows several log entries if enabled> |
||
− | ...}} |
||
− | {{hc|# systemctl status fstrim|2= |
||
− | ● 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) |
||
+ | ==== 連続的な TRIM ==== |
||
− | 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. |
||
− | }} |
||
− | {{Note|タイマーを調査したい時は {{ic|.timer}} 拡張子を指定するようにしてください。}} |
||
+ | TRIM コマンドを定期的に ({{ic|fstrim.timer}} を使用する場合はデフォルトで1週間に1度) 発行するのではなく、ファイルが削除されるたびに TRIM コマンドを発行することも可能です。後者は、連続的な TRIM (continuous TRIM) として知られています。 |
||
− | タイマーの実行間隔を変更したい場合は、[[Systemd#ユニットファイルの編集|ユニットファイルを編集]]してください。 |
||
+ | {{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#短所]] を見てください。}} |
||
− | ==== マウントフラグで TRIM を有効にする ==== |
||
+ | {{ic|/etc/fstab}} 内で {{ic|discard}} オプションを使うことにより、デバイスオペレーションでの連続的な TRIM を有効化します: |
||
− | {{Warning|{{ic|discard}} フラグを使ってパーティションをマウントする前に SSD が TRIM をサポートしていることを確認してください。そうしないとデータが喪失する可能性があります。残念ながら SSD の TRIM の実行に関する BIOS の品質はバラバラであり、ファイルシステム開発者 Theodore Ts'o は {{ic|discard}} マウントフラグの使用を[http://thread.gmane.org/gmane.comp.file-systems.ext4/41974 推奨していません] 。あなたの使用しているハードウェアについて不安があるのならば、代わりに [[#fstrim で定期的に TRIM を適用する|fstrim で定期的に TRIM を適用する]]ようにしてください。また、TRIM の他の[[WikiPedia:Trim_(computing)#Shortcomings|欠点]]として、TRIM コマンドを実行すると特定のデバイス (特に Samsung 8* シリーズ) で深刻なデータ障害が発生する可能性があります [https://blog.algolia.com/when-solid-state-drives-are-not-that-solid/]。データの破損が確認された後 [https://github.com/torvalds/linux/blob/e64f638483a21105c7ce330d543fa1f1c35b5bc7/drivers/ata/libata-core.c#L4109-L4286]、Linux カーネルは多数の [https://github.com/torvalds/linux/blob/e64f638483a21105c7ce330d543fa1f1c35b5bc7/drivers/ata/libata-core.c#L4227 デバイス] で TRIM コマンドの実行をブラックリスト化しています (2015年7月現在)。}} |
||
+ | /dev/sda1 / ext4 defaults,'''discard''' 0 1 |
||
− | {{ic|/etc/fstab}} のエントリで {{ic|discard}} オプションを使うことで TRIM コマンドが有効になります: |
||
+ | {{Note|1=XFS {{ic|/}} パーティションの場合、{{ic|/etc/fstab}} 内で discard オプションを指定しても、うまく行きません。[https://bbs.archlinux.org/viewtopic.php?id=143254 このスレッド]によると、{{ic|1=rootflags=discard}} [[カーネルパラメータ]]を使用して設定しなければならないようです。}} |
||
− | /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 |
||
+ | ext4 ファイルシステムでは、''tune2fs'' を使って {{ic|discard}} フラグを[[アクセス制御リスト#ACL の有効化|デフォルトマウントオプション]]として設定することもできます: |
||
− | TRIM の一番大きな恩恵は速度です。SSD は効率的に [https://arstechnica.com/gadgets/2015/04/ask-ars-my-ssd-does-garbage-collection-so-i-dont-need-trim-right/ ガーベジコレクション] を行えるようになります。ただし、効果はモデルによって異なり、初期に製造された SSD の場合、逆効果が現れることもあります。このため、ディストリビューションによっては TRIM を使用しないように決定したところもあります (例えば Ubuntu。[https://www.phoronix.com/scan.php?page=news_item&px=MTUxOTY この記事] や [https://blueprints.launchpad.net/ubuntu/+spec/core-1311-ssd-trimming 関連するブループリント] を参照)。 |
||
+ | # tune2fs -o discard /dev/sd'''XY''' |
||
− | {{Note| |
||
− | * SSD でブロックデバイス暗号化を使っている場合 TRIM はデフォルトでは有効になりません。詳しくは [[Dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート|Dm-crypt/SSD の TRIM のサポート]]を参照。 |
||
− | * {{ic|fstrim}} を定期的に実行している場合 {{ic|discard}} フラグは必要ありません。 |
||
− | * ext3 の root パーティションで {{ic|discard}} フラグを使用すると読み取り専用でマウントされます。 |
||
− | }} |
||
+ | 外部ドライブの場合は、{{ic|/etc/fstab}} 内のエントリではなくデフォルトマウントオプションを使うと便利です。そのようなパーティションは、他のマシンでもデフォルトのオプションを使ってマウントされるからです。この方法では、すべてのマシンで {{ic|/etc/fstab}} を編集する必要はありません。 |
||
− | ==== tune2fs で TRIM を有効にする (非推奨) ==== |
||
+ | {{Note|デフォルトマウントオプションは、{{ic|/proc/mounts}} にリストアップされません。}} |
||
− | tune2fs を使って静的に trim フラグを設定することができます: |
||
+ | ==== デバイス全体を trim する ==== |
||
− | # tune2fs -o discard /dev/sd'''XY''' |
||
+ | 一度に SSD 全体を trim したい場合 (例えば、新しいインストールのためや、そのドライブを売りたい場合など)、[[ソリッドステートドライブ/メモリセルの消去#blkdiscard による一般的な方法|blkdiscard]] コマンドが使えます。 |
||
− | {{Warning|この方法を使うと {{ic|mount}} で {{ic|discard}} オプションが[https://bbs.archlinux.org/viewtopic.php?id=137314 現れなくなります]。}} |
||
− | ==== LVM |
+ | ==== LVM ==== |
+ | ファイルシステムから論理ボリュームへ渡された TRIM 要求は、自動的に物理ボリュームへ渡されます。追加の設定は必要ありません。 |
||
− | {{ic|/etc/lvm/lvm.conf}} で {{ic|issue_discards}} オプションを有効にしてください。 |
||
+ | デフォルトでは、[[LVM]] のオペレーション (''lvremove''、''lvreduce''、そしてその他すべて) は物理ボリュームに TRIM 要求を発行しません。これは、{{man|8|vgcfgrestore}} を使って以前のボリュームグループ設定を復元できるようにするためです。{{ic|/etc/lvm/lvm.conf}} 内の {{ic|issue_discards}} は、論理ボリュームがその基底となる物理ボリュームの領域をもはや使用しなくなった時に、その物理ボリュームに discard 要求を送信するかどうかを制御します。 |
||
− | ==== dm-crypt で TRIM を有効にする ==== |
||
+ | {{Note|{{ic|issue_discards}} の設定を変更する前に {{ic|/etc/lvm/lvm.conf}} 内のコメントをよく読んでください。この設定は、ファイルシステムからディスクへ渡される TRIM 要求 (例: ファイルシステム内でのファイル削除) には全く影響を与えませんし、シンプール内の領域管理にも影響を与えません。}} |
||
− | {{ic|/etc/crypttab}} を設定して SSD 上の暗号化されたブロックデバイスのオプションのリストに {{ic|discard}} を含めて下さい。この discard オプションは discard リクエストが暗号化されたブロックデバイスを通過するのを許可します。これによって SSD ストレージのパフォーマンスは向上しますが、セキュリティに影響があります。[[Dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート|このセクション]]を見て下さい。 |
||
+ | {{Warning|{{ic|issue_discards}} を有効化すると、''vgcfgrestore'' によるボリュームグループメタデータの復元ができなくなります。LVM コマンドを誤って発行した場合のリカバリオプションは無くなります。}} |
||
− | === I/O スケジューラー === |
||
+ | ==== dm-crypt ==== |
||
− | デフォルトの [[wikipedia:CFQ|CFQ]] (Completely Fair Queuing) スケジューラから [[wikipedia:NOOP_scheduler|NOOP]] または [[wikipedia:Deadline_scheduler|Deadline]] に切り替えたほうが良いでしょう。後者の2つは SSD のパフォーマンスを加速させます。例えば、NOOP スケジューラは全ての I/O リクエストに対して、ディスクに物理的に近いものを並び替えたりグループ化することなく、一つのシンプルなキューを実行します。SSD においては全てのセクタでシーク時間は同じであり、シーク時間に基づいて I/O キューを並び替える必要性には説得力がありません。 |
||
+ | {{Warning|discard オプションは、暗号化されているブロックデバイスを通して discard 要求を渡せるようにします。これは、SSD ストレージのパフォーマンスを向上させるかもしれませんし、しないかもしれません[https://lore.kernel.org/linux-raid/508FA2C6.2050800@hesbynett.no/]。しかし、セキュリティに影響を与えます。詳細は以下の記事を見てください: |
||
− | Arch ではデフォルトで CFQ スケジューラが有効にされています。{{ic|/sys/block/sd'''X'''/queue/scheduler}} の中身を見て確認してください: |
||
+ | * [[Debian:SSDOptimization#Mounting SSD filesystems]] |
||
− | {{hc|$ cat /sys/block/sd'''X'''/queue/scheduler| |
||
+ | * [[dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート]] |
||
− | noop deadline [cfq] |
||
}} |
}} |
||
+ | ルート以外のファイルシステムの場合、{{ic|/etc/crypttab}} を編集して、SSD 上の暗号化されているブロックデバイスのオプションリストに {{ic|discard}} を追加してください ([[dm-crypt/システム設定#crypttab]] を見てください)。 |
||
− | 表示されているスケジューラの中で角括弧で囲まれているのが現在使われているスケジューラです。 |
||
+ | ルートファイルシステムの場合、[[dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート]] の指示に従って、ブートローダーの設定に適切なカーネルパラメータを追加してください。 |
||
− | ユーザーは再起動することなくスケジューラを変更することができます: |
||
+ | === パフォーマンスを最大化する === |
||
− | # echo noop > /sys/block/sd'''X'''/queue/scheduler |
||
+ | [[パフォーマンスの向上#ストレージデバイス]] のヒントに従ってドライブのパフォーマンスを最大化しましょう。 |
||
− | または: |
||
+ | ==== セクタサイズ ==== |
||
− | $ sudo tee /sys/block/sd'''X'''/queue/scheduler <<< noop |
||
+ | [[Advanced Format#NVMe ソリッドステートドライブ]] を見てください。 |
||
− | この方法は永続的ではありません (再起動で変更は失われます)。ファイルの中身をもう一度見て "noop" が使われるようになっていることを確認してください。 |
||
− | ==== |
+ | ==== SSD のメモリセルのクリア ==== |
+ | 時々、SSD のセルを完全にリセットしてデバイスにインストールした時と同じ初めの状態にすることで[https://www.anandtech.com/show/2738/8 製造時の書き込みパフォーマンス]を取り戻したいと思うことがあるかもしれません。SSD の書き込みパフォーマンスはネイティブの TRIM サポートを使っていても時間経過で落ちていきます。TRIM はファイル削除に対するセーフガードとして働くだけで、増加保存などの代わりにはなりません。 |
||
− | システムの唯一のストレージデバイスが SSD である場合、{{ic|1=elevator=noop}} [[カーネルパラメータ]]でシステム全体の I/O スケジューラを設定できます。 |
||
+ | [[ソリッドステートドライブ/メモリセルの消去#SATA ドライブ|#SATA]] や [[ソリッドステートドライブ/メモリセルの消去#NVMe ドライブ|#NVMe]] の場合、[[ソリッドステートドライブ/メモリセルの消去]] に書かれている適切な手順に従うことでリセットすることができます。 |
||
− | ====1つのデバイスまたは HDD/SSD 混合環境で udev を使って設定する==== |
||
+ | {{Note|リセットする目的がデータの消去ならば、SSD のコントローラに頼って安全に消去を行うことを望まない場合があるでしょう (例えば、あなたが SSD の製造業者を信頼していなかったり、潜在的なバグを不安に思っていたりする場合など)。この場合、手動消去を行う例やさらなる情報を [[ディスクの完全消去#フラッシュメモリ]] で見てください。}} |
||
− | 上の方法は確かに動作しますが、あくまで回避策と考えられています。つまり、デバイスのスケジューラを一番最初に実行するシステムを使うのが好ましいでしょう。この場合、それは udev で、設定するのに必要なのはシンプルな [[udev]] ルールだけです。 |
||
+ | === セキュリティ === |
||
− | 設定するには、以下を作成してください: |
||
+ | ==== 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>}} |
||
+ | 一部のマザーボードファームウェアは初期化時に ATA SECURITY FREEZE LOCK コマンドを SATA デバイスに発行します。これによりドライブは frozen モードになり、SEC2 状態 (セキュリティ無効、未ロック、frozen 状態) に遷移します。同様に、一部の SSD (と HDD) も工場出荷時にこの状態にすでに設定されています。このことは [[hdparm]] と [[smartctl]] の出力から確認できます: |
||
− | Deadline/CFQ をお望みのスケジューラに設定してください。次に起動した時に変更が適用されるはずです。新しいルールが適用されているか確認するには: |
||
− | |||
− | $ cat /sys/block/sd'''X'''/queue/scheduler # where '''X''' is the device in question |
||
− | |||
− | {{Note|上記の例で udev ルールの名前に60を使っていますが、終わりが {{ic|.rules}} であればどんな名前でも付けられます。}} |
||
− | |||
− | === SSD のスワップ領域 === |
||
− | |||
− | SSD 上にスワップパーティションを配置することが可能です。最新のデスクトップではメモリが2ギガ以上積まれておりスワップはほとんど使いません。ただしハイバネート機能を利用するシステムの場合は別です。以下のようにシステムの "swappiness" を減らすことで SSD にあるスワップへの書き込みを減らすことが推奨されます: |
||
− | |||
− | # echo 1 > /proc/sys/vm/swappiness |
||
− | |||
− | [[パフォーマンスの最大化#Swappiness|パフォーマンスの最大化]]の記事で推奨されているように行うこともできます: |
||
− | |||
− | {{hc|/etc/sysctl.d/99-sysctl.conf|2= |
||
− | vm.swappiness=1 |
||
− | vm.vfs_cache_pressure=50 |
||
− | }} |
||
− | |||
− | === Hdparm で "frozen" 状態と表示される === |
||
− | |||
− | マザーボードの BIOS は初期化時に取り付けられたストレージデバイスに "security freeze" コマンドを実行することがあります。同様に SSD (や HDD) の BIOS もファクトリーにおいて "security freeze" に設定されていることがあります。どちらにしても、以下の出力のようにデバイスのパスワードセキュリティ設定が "frozen" になります: |
||
{{hc|head=# hdparm -I /dev/sda |output= |
{{hc|head=# hdparm -I /dev/sda |output= |
||
207行目: | 146行目: | ||
Master password revision code = 65534 |
Master password revision code = 65534 |
||
supported |
supported |
||
− | not enabled |
+ | '''not enabled''' |
'''not locked''' |
'''not locked''' |
||
'''frozen''' |
'''frozen''' |
||
not expired: security count |
not expired: security count |
||
supported: enhanced erase |
supported: enhanced erase |
||
− | 4min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT. |
+ | 4min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT. |
+ | }} |
||
+ | {{hc|# smartctl -g security /dev/sda| |
||
− | デバイスのフォーマットやオペレーティングシステムのインストールといった操作はこの "security freeze" の影響を受けません。 |
||
+ | ATA Security is: Disabled, frozen [SEC2] |
||
+ | }} |
||
+ | デバイスのフォーマットやオペレーティングシステムのインストールといった操作は、frozen モードの影響を受けません。 |
||
− | 上記の出力はデバイスが起動時に HDD パスワードによってロックされていないこと、そして凍結状態によってデバイスを (パスワードを設定してデバイスをロックさせてしまうような) マルウェアから保護していることがわかります。 |
||
+ | 上記の ''hdparm'' の出力は、デバイスが起動時に HDD パスワードによって'''ロックされていない'''こと、そして '''frozen''' 状態によってデバイスを (実行時にパスワードを設定してデバイスをロックさせてしまうような) マルウェアから保護していることを示しています。 |
||
− | 凍結状態のデバイスにパスワードを設定したい場合、それに対応しているマザーボード BIOS が必要です。[[Wikipedia:Hardware-based_full_disk_encryption|ハードウェア暗号化]]に必須なので、ノートパソコンでは大抵サポートされていますが、デスクトップやサーバーのボードではサポートがあるかどうかはっきりしないことがあります。例えば、Intel DH67CL/BL マザーボードの場合、設定にアクセスするには物理的なジャンパによってマザーボードを "maintenance mode" に設定する必要があります ([https://sstahlman.blogspot.in/2014/07/hardware-fde-with-intel-ssd-330-on.html?showComment=1411193181867#c4579383928221016762], [https://communities.intel.com/message/251978#251978] を参照)。 |
||
+ | "frozen" 状態のデバイスにパスワードを設定したい場合、それに対応しているマザーボード BIOS が必要です。[[自己暗号化ドライブ|ハードウェア暗号化]]に必要なので、多くのノートパソコンでサポートされていますが、デスクトップやサーバーのボードではサポートがあるかどうかはっきりしないことがあります。 |
||
− | {{Warning|よくわからないときは {{ic|hdparm}} を使って上記のロックセキュリティ設定を変更しないで下さい。}} |
||
+ | 例えば、Intel DH67CL/BL マザーボードの場合、設定にアクセスするには物理的なジャンパによってマザーボードを "maintenance mode" に設定する必要があります。[https://sstahlman.blogspot.in/2014/07/hardware-fde-with-intel-ssd-330-on.html?showComment=1411193181867#c4579383928221016762] |
||
− | SSD を消去するときは、[[ディスクの完全消去#hdparm]] や[[#SSD_Memory_Cell_Clearing|下のセクション]]を見て下さい。 |
||
+ | {{Warning|よくわからないときは ''hdparm'' を使って上記の'''ロック'''セキュリティ設定を変更しないで下さい。}} |
||
− | === SSD Memory Cell Clearing === |
||
+ | SSD を消去するときは、[[ディスクの完全消去#hdparm]] や [[ソリッドステートドライブ/メモリセルの消去]] を見て下さい。 |
||
− | 時々、SSD のセルを完全にリセットしてデバイスにインストールした時と同じ初めの状態にすることで [https://www.anandtech.com/show/2738/8 製造時の書き込みパフォーマンス] を取り戻したいと思うことがあるかもしれません。SSD の書き込みパフォーマンスはネイティブの TRIM サポートを使っていても時間経過で落ちていきます。TRIM はファイル削除に対するセーフガードとして働くだけで、増加保存などの代わりにはなりません。 |
||
+ | ===== スリープから復帰したあとに SSD 状態を frozen モードにする ===== |
||
− | リセットは [[ソリッドステートドライブ/メモリセルの消去|SSD メモリセルの消去]]の wiki 記事に書かれている3つのステップで簡単に行なえます。何らかの理由で SSD の BIOS を使わずにディスクのデータを消去したい場合は[[ディスクの完全消去#フラッシュメモリ]]を読んでください。 |
||
+ | SSD は S3 スリープから復帰すると SEC1 状態 (セキュリティ無効、未ロック、非 frozen) に戻っていることが多く、[[ソリッドステートドライブ/メモリセルの消去]] で説明されているように ATA SECURITY ERASE UNIT コマンドに対して脆弱になっています。 |
||
− | ==SSD の読み書きを最小化するヒント== |
||
+ | この問題を回避するために、[[電源管理/サスペンドとハイバネート#/usr/lib/systemd/system-sleep のフック|スリープからの復帰後]]にスクリプトを実行することができます: |
||
− | SSD の使用で一番重要なテーマは読み書きが多い操作を SSD の代わりに RAM (Random Access Memory) や物理 HDD に配置するという'シンプリシティ'でしょう。そうすることで SSD をより長生きさせることができます。これは主として巨大な消去ブロックサイズのためで (場合によっては 512 KiB)、多数の小さな書き込みは大きな効果的な書き込みになります。 |
||
+ | {{hc|/usr/lib/systemd/system-sleep/ssd-freeze.sh|2= |
||
− | {{Note|書き込み増幅率が平凡な 10x で、書き込み/消去サイクルが標準的な 10000 である、32GB の SSD の場合、毎日 10GB のデータ書き込みを行うと、8年間で寿命が尽きるとされます。この数字はもっと容量が大きい SSD を使ったり書き込み増幅が少ない最新のコントローラを使うことで改善されます。また、ディスクの書き込みを制限するのにどの方法が必要なのか考えるときは [https://techreport.com/review/25889/the-ssd-endurance-experiment-500tb-update] を比較してください。}} |
||
+ | #!/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 ルールによる永続的な設定]] に書かれてあるテクニックを利用して、{{ic|--security-freeze}} を全ドライブ (HDD も含む) に発行することもできます。 |
||
− | プログラムがディスクにどれだけ書き込んでいるか確認するには {{ic|$ iotop -oPa}} を使ってディスクの書き込み順にソートしてください。 |
||
− | === |
+ | ==== ハードウェア暗号化 ==== |
+ | [[#Frozen モード]] で説明されているように、BIOS でストレージデバイス (SSD/HDD) のパスワードを設定すると、それをサポートしているデバイスのハードウェア暗号化も初期化される場合があります。デバイスが OPAL 規格にも準拠している場合、パスフレーズを設定する機能が BIOS に無くとも、これを行える場合があります。[[自己暗号化ドライブ]] を見てください。 |
||
− | *SSD と HDD 両方搭載しているシステムでは、読み書きを減らすために {{ic|/var}} パーティションは SSD ではなく磁気ディスク上に配置すると良いでしょう。 |
||
− | == |
+ | == トラブルシューティング == |
+ | あなたが今遭遇している問題は、Linux 固有でないファームウェアのバグである可能性があります。ゆえに、SSD に影響を与える問題のトラブルシューティングに挑戦する前に、以下のアップデートが利用可能であるかをチェックするべきです: |
||
− | このフラグを {{ic|/etc/fstab}} で使うと、ファイルに関連付けられた atime 情報の更新によるファイルシステムの読み込みアクセスの記録が止められます。{{ic|noatime}} 設定によってファイルの読み込みだけでファイルシステムに書き込みを行うのを阻止することになります。前のセクションで説明しているように書き込みは負担が大きいため、ある程度パフォーマンスが向上する可能性があります。 |
||
+ | * [[#ファームウェア|SSD のファームウェア]] |
||
− | {{Note|このオプションを有効にしても、ファイルが変更されたときのファイルの変更日時の情報は更新されます。}} |
||
+ | * [[Linux から BIOS を書き換える|マザーボードの BIOS/UEFI ファームウェア]] |
||
+ | ファームウェアのバグであったとしても、解決できることがあります。ファームウェアにアップデートが存在しなかったり、ファームウェアのアップデートをしたくない場合、以下のセクションが役に立つかもしれません。 |
||
− | /dev/sda1 / ext4 defaults,'''noatime''' 0 1 |
||
− | /dev/sda2 /home ext4 defaults,'''noatime''' 0 2 |
||
+ | === NCQ エラーを解消する === |
||
− | {{Note|この設定を使うと [[Mutt]] などのプログラムで問題がおこります。ファイルのアクセス日時がやがて変更日時よりも前になってしまうからです。{{ic|noatime}} の代わりに {{ic|relatime}} オプションを使うことでファイルの最終変更日時よりも atime が前にならないようにすることができます。また、maildir ストレージフォーマットを使うことでも mutt の問題は解決します。}} |
||
+ | SSD や SATA チップセットによっては Linux Native Command Queueing (NCQ) が正しく動作しないことがあります。[[journal]] に以下のようなエラーが表示されます: |
||
− | === 頻繁に使うファイルを RAM に移動する === |
||
+ | 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 を無効にするには、[[ブートローダー]]の設定におけるカーネルコマンドラインに {{ic|1=libata.force=noncq}} を追加してください。ポート 9 のディスク 0 の NCQ だけを無効化するには次を使用: {{ic|1=libata.force=9.00:noncq}}。 |
||
− | tmpfs を使って chromium, firefox, opera などのブラウザプロファイルを RAM へ''簡単に''マウントすることができ、また、rsync を使うことで HDD によるバックアップと同期させることができます。これによって速度が向上するだけでなく、SSD の読み書きサイクルを節約することにもなります。 |
||
+ | また、sysfs を使うことで再起動せずに特定のドライブの NCQ を無効化することもできます: |
||
− | AUR には {{Pkg|profile-sync-daemon}} など、この手順を自動化するパッケージが複数存在します。 |
||
+ | # echo 1 > /sys/block/sdX/device/queue_depth |
||
− | ==== その他 ==== |
||
+ | 問題が解決しなかったり他の問題が発生する場合は、[[バグ報告ガイドライン|バグレポートを作成]]してください。 |
||
− | ブラウザプロファイルを RAM に移動するのと同じ理由で、(ウェブサーバーを動かしている場合) {{ic|/srv/http}} などの頻繁に利用するディレクトリを移動することもできます。{{Pkg|profile-sync-daemon}} の姉妹プロジェクトとして {{Pkg|anything-sync-daemon}} があり、同じ方法・セーフガードを使って'''あらゆる'''ディレクトリを RAM に同期させるよう定義することが可能です。 |
||
− | === |
+ | === SATA の電源管理関連のエラーを解消する === |
+ | SATA Active Link Power Management ([[wikipedia:Aggressive Link Power Management|ALPM]]) が有効になっている場合にエラーを吐く SSD も存在します (例: Transcend MTS400)。ALPM はデフォルトで無効になっており、省電力デーモンによって有効になります (例: [[TLP]], [[Laptop Mode Tools]])。 |
||
− | 意図的に {{ic|/tmp}} でコンパイルすることで問題を少なくすることができます。Arch Linux はデフォルトで {{ic|/tmp}} を物理メモリの50%にします。メモリが 4GB 以上あるシステムならば、{{ic|/scratch}} を作成して tmpfs にマウントすることで物理メモリの50%以上を使うように設定できます。 |
||
+ | そのようなデーモンを使っていて SATA 関連のエラーが表示される場合、バッテリーと AC 電源のプロファイルを {{ic|max_performance}} に設定して ALPM を無効化してみてください。 |
||
− | 例えば物理メモリが 8GB あるマシンの場合: |
||
+ | === 外部 SSD での TRIM サポート === |
||
− | {{hc|<nowiki>$ mount | grep tmpfs</nowiki>|2= |
||
− | tmpfs /scratch tmpfs nodev,nosuid,size=7G 0 0 |
||
− | }} |
||
+ | いくつかの 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 ライクなコマンドをサポートしています。 |
||
− | 詳細については、[[Makepkg#コンパイル時間を短縮する]] を参照してください。 |
||
+ | しかし、カーネルはこの機能を自動的に検出しない場合があり、この機能を使用しないかもしれません。 |
||
− | === ファイルシステムのジャーナリングを無効にする === |
||
+ | 問題のブロックデバイスが /dev/sdX であると仮定すると、{{Pkg|sg3_utils}} パッケージのコマンドを使えばそのケースに当てはまっているかどうかを確認できます: |
||
+ | # sg_readcap -l /dev/sdX |
||
− | SSD で ext4 などのジャーナリングファイルシステムを使っている場合、ジャーナルを無効にすることで読み書きを減らすことができます。ただし、ジャーナリングを無効にしたファイルシステムを使用するときの明らかな欠点として、ちゃんとマウントが解除されていない (つまり、電源が落ちたり、カーネルが固まったりする) とデータが消失します。最新の SSD では、ほとんどの場合、あまり読み書きサイクルを増やさないでジャーナリングを有効にすることができると [http://tytso.livejournal.com/61830.html Ted Tso] は主張しています: |
||
+ | このコマンドの出力に "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]" をサポートしていないと推定していることを示しています。 |
||
− | '''{{ic|noatime}} でマウントされた ext4 ファイルシステムに書き込まれるデータの量 (単位はメガバイト)。''' |
||
+ | この場合、デバイスの [https://www.seagate.com/files/staticfiles/support/docs/manual/Interface%20manuals/100293068k.pdf#G4.3076244 "Logical Block Provisioning" の "Vital Product Data" (VPD) ページ]でデータのアンマッピングのためのサポートされている機能を確認する必要があります。以下のコマンドでこれを行うことができます: |
||
− | {| 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 % |
||
− | |} |
||
+ | # sg_vpd -a /dev/sdX |
||
− | ''"この結果は、make clean など、メタデータの変更が多い操作はディスクに書き込むデータ量がほぼ2倍になることを示しています。これは当然の結果です。なぜならメタデータが最終的にディスクに書き込まれる前に、メタデータブロックへの変更はまず全てジャーナルに書き込まれ、それからジャーナルのトランザクションが行われるからです。しかしながら、ファイルシステムのメタデータブロックを変更するだけでなくデータの書き込みも行うような一般的な操作では、違いはかなり少なくなります。"'' |
||
+ | 出力から以下のような行を探してください: |
||
− | {{Note|表にある make clean の例は、この記事の[[#tmpfs でコンパイルする|前のセクション]]で説明している tmpfs でコンパイルするのが何故推奨されているのかを示す典型例でしょう。}} |
||
+ | Unmap command supported (LBPU): 1 |
||
− | == ファイルシステムの選択 == |
||
+ | Write same (16) with unmap bit supported (LBPWS): 0 |
||
+ | Write same (10) with unmap bit supported (LBPWS10): 0 |
||
+ | この例では、デバイスが "UNMAP" コマンドをサポートしていることを示しています。 |
||
− | === Btrfs === |
||
+ | 以下のコマンドの出力を見てください: |
||
− | [[wikipedia:ja:Btrfs|Btrfs]] のサポートは Linux カーネルのメインライン 2.6.29 リリースから含まれています。ext4 の後継として使っているアーリーアダプターもいますが、人によってはまだ日常的な利用には適さないと感じるかもしれません。詳細は [[Btrfs]] の記事を読んで下さい。 |
||
+ | $ cat /sys/block/sdX/device/scsi_disk/*/provisioning_mode |
||
− | === Ext4 === |
||
+ | カーネルがデバイスのデータアンマッピング機能を検出していない場合、このコマンドはおそらく "full" を返します。 |
||
− | [[wikipedia:ja:Ext4|Ext4]] は SSD をサポートしているもうひとつのファイルシステムです。2.6.28 から安定していると考えられており日常的な利用ができるレベルまで成熟しています。ext4 のユーザーは [[fstab]] で {{ic|discard}} マウントオプションを使って (もしくは {{ic|tune2fs -o discard /dev/sdaX}} で) 明示的に TRIM コマンドのサポートを有効にする必要があります。 |
||
+ | "full" の他に、カーネルの SCSI ストレージドライバは現在以下の provisioning_mode 値が登録されています: |
||
− | ext4 に関する詳細情報は[https://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=Documentation/filesystems/ext4.txt カーネルツリーの公式ドキュメント]を見て下さい。 |
||
+ | unmap |
||
− | ===XFS=== |
||
+ | writesame_16 |
||
+ | writesame_10 |
||
+ | writesame_zero |
||
+ | disabled |
||
+ | 上記の例の場合、"provisioning_mode" を "unmap" に設定することで、カーネルにそれを使用するように要求することができます: |
||
− | ext4 や btrfs に加えて、[[wikipedia:ja:XFS|XFS]] も TRIM をサポートしていることを知っているユーザーは多くないでしょう。通常の方法で有効にすることができます。つまり、上述の discard オプションを利用するか、または fstrim コマンドを使うか選択することが可能です。詳細は [http://xfs.org/index.php/FITRIM/discard XFS wiki] を見て下さい。 |
||
+ | # echo "unmap" >/sys/block/sdX/device/scsi_disk/*/provisioning_mode |
||
− | ===JFS=== |
||
+ | このコマンドを実行すると即座に、/dev/sdX 上で "blkdiscard" のようなツールを使ったり、/dev/sdX 上にマウントされているファイルシステム上で "fstrim" を実行したりできるようになるはずです。 |
||
− | Linux カーネルバージョン 3.7 から、完全な TRIM サポートが追加されました。現在、このトピックに関する情報はあまり揃っていませんが、[https://www.phoronix.com/scan.php?page=news_item&px=MTE5ODY Linux ニュースサイト] によって確かに取り上げられています。{{ic|discard}} マウントオプションにより、または fstrim を使う方法で有効にすることが可能です。 |
||
+ | 特定のベンダ/製品の外部デバイスが接続されたときに "provisioning_mode" を自動的に有効化したいならば、"[[udev]]" の機構を使うことで可能です。まず、USB Vendor と Product ID を調べてください: |
||
− | ===他のファイルシステム=== |
||
+ | $ cat /sys/block/sdX/../../../../../../idVendor |
||
− | 他にも [[wikipedia:List_of_flash_file_systems#File systems optimized for flash memory, solid state media|SSD に特化して]]設計されたファイルシステムが存在します。[[F2FS]] などがあります。 |
||
+ | $ 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 は {{ic|lsusb}} を使うことでも取得できます。) |
||
+ | |||
+ | == ファームウェア == |
||
+ | |||
+ | デバイスのベンダーによってサポートされていれば、[[fwupd]] ユーティリティを使ってファームウェアをアップデートすることが推奨されます。 |
||
+ | |||
+ | 現在のファームウェアバージョンを確認するには: |
||
+ | |||
+ | # smartctl -i /dev/''ssd_device'' |
||
=== ADATA === |
=== 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 はハードウェアインターフェイスを扱うようには設計されておらず、不完全なファームウェアアップデートはデバイスを文鎮化させる可能性があります。}} |
||
− | 最新の Linux アップデートユーティリティはファームウェアと一緒に入っており root で実行してください。最初にバイナリファイルに対して適切なパーミッションを設定する必要があるかもしれません。 |
||
− | ===Crucial=== |
+ | === Crucial === |
− | Crucial は ISO イメージを使ってファームウェアをアップデートする方法を提供しています。[ |
+ | Crucial は ISO イメージを使ってファームウェアをアップデートする方法を提供しています。[https://www.crucial.com/usa/en/support-ssd SSD サポートページ]から製品を選んで "Manual Boot File" をダウンロードすることでイメージを入手できます。 |
− | {{Note|Crucial が提供している ISO イメージはハイブリッドでは |
+ | {{Note|Crucial が提供している ISO イメージはハイブリッドではないようです。{{ic|dd}} コマンドを使って [[MBR]] が存在しないデバイスにイメージをコピーした場合、デバイスが起動できなくなります。{{Pkg|syslinux}} をインストールし、{{ic|isohybrid path/to/image.iso}} を実行してください。}} |
− | M4 Crucial モデルを使っている場合、{{ic|smartctl}} でファームウェアのアップグレードが必要かどうかチェックすることが可能です |
+ | M4 Crucial モデルを使っている場合、{{ic|smartctl}} でファームウェアのアップグレードが必要かどうかチェックすることが可能です。 |
{{hc|$ smartctl --all /dev/sd'''X'''| |
{{hc|$ smartctl --all /dev/sd'''X'''| |
||
==> WARNING: This drive may hang after 5184 hours of power-on time: |
==> 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 |
+ | See the following web page for firmware updates: |
− | + | https://www.crucial.com/usa/en/support-ssd |
|
− | http://www.micron.com/products/solid-state-storage/client-ssd#software |
||
}} |
}} |
||
− | 上記の |
+ | 上記の警告が表示された場合は、重要なデータをバックアップしてから'''直ちにアップグレードを行うこと'''が推奨されます。ISO イメージと Grub を使用して Crucial MX100 のファームウェアをアップデートする手順は [https://www.rojtberg.net/1008/updating-crucial-mx100-firmware-with-ubuntu/ こちら] を参照してください。 |
=== Intel === |
=== Intel === |
||
− | Intel は [https://downloadcenter.intel.com/download/ |
+ | Intel は、Windows の [https://downloadcenter.intel.com/download/30380/ Intel® Memory and Storage Tool (GUI)] ソフトウェアに対応していないオペレーティングシステム向けに、Linux ライブシステムをベースとする [https://downloadcenter.intel.com/download/18363 Firmware Update Tool] を配布しています。 |
+ | また、ファームウェアをリフラッシュできる、[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 のユーザガイド]があります。 |
||
− | ===Kingston=== |
||
+ | ファームウェアの状態をチェックすると例えば以下のように表示されます: |
||
− | Kingston は Sandforce コントローラを搭載しているドライブのファームウェアをアップデートする Linux ユーティリティを用意しています。Kingston の [https://www.kingston.com/jp/support/technical/category/ssd SSD のサポートページ] で見つけることができます。使用している SSD のモデルにあわせてページを開いてください。例えば SH100S3 SSD のサポートは [https://www.hyperxgaming.com/jp/support/technical/products?model=sh100s3 HyperX のサポートページ] です。 |
||
+ | |||
+ | {{hc|# 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 が存在しない場合、{{ic|-intelssd 0}} は省略できます。2番目の SSD は {{ic|-intelssd 1}} となります。 |
||
+ | |||
+ | アップデートが利用できる場合は、{{ic|intelmas load -intelssd 0}} を実行することでアップデートできます。上記の PDF ユーザガイドでは、この手順は Linux で2回 (間に電源の切断と再投入を挟んで) 行う必要があると書かれています。すべてのデバイス用の最新のファームウェアは、MAS Tool 自体の一部として配布されており、別途ダウンロードする必要はありません。 |
||
+ | |||
+ | === Kingston === |
||
+ | |||
+ | Sandforce ベースのドライバ向けに KFU ツールが利用できます ({{AUR|kingston_fw_updater}})。 |
||
===Mushkin=== |
===Mushkin=== |
||
371行目: | 341行目: | ||
OCZ は Linux 用の [https://www.ocz.com/us/download/clout Command Line Online Update Tool (CLOUT)] を用意しています。{{AUR|ocz-ssd-utility}}, {{AUR|ocztoolbox}}, {{AUR|oczclout}} パッケージでインストールすることができます。 |
OCZ は Linux 用の [https://www.ocz.com/us/download/clout Command Line Online Update Tool (CLOUT)] を用意しています。{{AUR|ocz-ssd-utility}}, {{AUR|ocztoolbox}}, {{AUR|oczclout}} パッケージでインストールすることができます。 |
||
− | ===Samsung=== |
+ | === Samsung === |
− | Samsung は Magician |
+ | 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 はサポートされていません。 |
{{Note|Samsung はファームウェアアップデートをわかりやすく提供していません。ファームウェアアップデートに関連するページが4つあり、それぞれで別々の方法が示されています。}} |
{{Note|Samsung はファームウェアアップデートをわかりやすく提供していません。ファームウェアアップデートに関連するページが4つあり、それぞれで別々の方法が示されています。}} |
||
− | (Microsoft Windows で Samsung の "Magician" ソフトウェアを使わずに) Linux で作成したライブ USB スティックからファームウェアアップデートを実行したい場合は、[ |
+ | (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 をサポートしていません)。 |
+ | ==== Linux でのアップデート ==== |
||
− | === SanDisk === |
||
+ | SSD のファームウェアは以下に示すように (ブータブルな USB スティックを作らなくても) ネイティブにアップデートできます。まず、[https://www.samsung.com/semiconductor/minisite/ssd/download/tools Samsung downloads ページ]を開き、"Samsung SSD Firmware" セクションへ行き、あなたの SSD 用の最新のファームウェア (ISO イメージであるはずです) をダウンロードしてください。 |
||
− | SanDisk は SanDisk SSD Toolkit でサポートされていないオペレーティングシステムにおいて SSD のファームウェアアップデートをするための '''ISO ファームウェアイメージ'''を作成しています。SSD の''モデル''だけでなく、SSD の''容量''にあわせて適切なファームウェアを選択する必要があります (例: 60GB '''または''' 256GB)。適当な ISO ファームウェアイメージを焼いたら、PC を再起動して新しく作成した CD/DVD ブートディスクで起動してください (USB スティックからでも動作するかもしれません)。 |
||
− | ISO イメージには |
+ | {{Note|一部の ISO イメージには、以下で言及されている {{ic|initrd}} Linux イメージが欠落しています。その場合、代わりに [[#古い SSD]] を見てください。}} |
+ | ISO イメージから {{ic|initrd}} Linux イメージを抽出してください: |
||
− | ファームウェアのアップデートが列挙された一つのページは存在しませんが (サイトがわかりづらい)、以下が関連するリンクです: |
||
+ | $ bsdtar xf ''samsung_ssd_firmware''.iso initrd |
||
− | * SanDisk Extreme SSD の [https://kb.sandisk.com/app/answers/detail/a_id/10127 ファームウェアのリリースノート] と [https://kb.sandisk.com/app/answers/detail/a_id/10476 手動ファームウェアアップデートのバージョン R211]。 |
||
− | * SanDisk Ultra SSD の [https://kb.sandisk.com/app/answers/detail/a_id/10192 ファームウェアのリリースノート] と [https://kb.sandisk.com/app/answers/detail/a_id/10477 手動ファームウェアアップデートのバージョン 365A13F0]。 |
||
+ | {{ic|root/fumagician/}} を抽出してください。このディレクトリには、ファームウェアのアップデートファイルが含まれています: |
||
− | == トラブルシューティング == |
||
+ | $ bsdtar xf initrd root/fumagician |
||
− | SSD の問題は Linux 固有の問題ではないファームウェアのバグである可能性も存在します。SSD に関しては、問題のトラブルシューティングを始める前に、ファームウェアのアップデートが存在しないか確認してみてください: |
||
− | * SSD のファームウェアをアップデートする。[[#ファームウェアのアップデート]] を参照。 |
||
− | * マザーボードの BIOS/UEFI をアップデートする。[[Linux から BIOS を書き換える]]を参照。 |
||
− | + | 最後に、{{ic|root/fumagician/fumagician}} を root 権限で実行し、(ファームウェアが正常にアップデートされたのであれば) システムを[[再起動]]してください。 |
|
+ | 再起動後にファームウェアのバージョンが変わっていない場合は、{{ic|root/fumagician/fumagician 2> log}} を実行して、出力されたログファイルからエラーを探してください。例えば、ログに 'unzip is not available' という記述がある場合は、unzip をインストールするか、initrd から抽出してください。 |
||
− | === NCQ エラーを解消する === |
||
+ | ===== 古い SSD ===== |
||
− | SSD や SATA チップセットによっては Linux Native Command Queueing (NCQ) が正しく動作しないことがあります。dmesg に以下のようなエラーが表示されます: |
||
+ | SSD ファームウェアの ISO イメージのいくつかには、{{ic|initrd}} Linux イメージではなく FreeDOS イメージが含まれています。ゆえに、SSD ファームウェアのアップデートに必要なステップは上記とは異なります。以下の表は、そのような SSD (とそれに関連するパス) のリストです: |
||
− | [ 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) |
||
+ | {| class="wikitable" |
||
− | 起動時に NCQ を無効にするには、[[ブートローダー]]の設定におけるカーネルコマンドラインに {{ic|1=libata.force=noncq}} を追加してください。ポート 1 のディスク 0 の NCQ だけを無効化するには次を使用: {{ic|1=libata.force=1.00:noncq}}。 |
||
+ | ! 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 イメージを抽出してください: |
||
− | また、sysfs を使うことで再起動せずに特定のドライブの NCQ を無効化することもできます: |
||
+ | $ bsdtar xf ''samsung_ssd_firmware''.iso ''freedos_image_path'' |
||
− | {{bc| |
||
− | # echo 1 > /sys/block/sdX/device/queue_depth |
||
− | }} |
||
+ | FreeDOS イメージを {{ic|/mnt/}} にマウントしてください: |
||
− | 問題が解決しなかったり他の問題が発生する場合は、[[バグ報告ガイドライン|バグレポートを作成]]してください。 |
||
+ | # mount ''freedos_image_path'' /mnt |
||
− | === SATA の電源管理関連のエラーを解消する === |
||
+ | Magician SSD 管理ユーティリティから ''Disk Number'' にある SSD のディスク番号を入手してください: |
||
− | SATA Active Link Power Management ([[Wikipedia:Aggressive_Link_Power_Management|ALPM]]) が有効になっている場合にエラーを吐く SSD も存在します (例: Transcend MTS400)。ALPM はデフォルトで無効になっており、省電力デーモンによって有効になります (例: [[TLP]], [[Laptop Mode Tools]])。 |
||
+ | # magician --list |
||
− | 省電力デーモンを使っていて SATA 関連のエラーが表示される場合、バッテリーと AC 電源のプロファイルを {{ic|max_performance}} に設定して ALPM を無効化してみてください。 |
||
+ | |||
+ | ファームウェアパッケージのパスを指定し、指定したディスクに対して SSD ファームウェアをアップデートしてください: |
||
+ | |||
+ | # magician --disk ''disk_num'' --firmware-update --fwpackage-path /mnt/''firmware_package_path'' |
||
+ | |||
+ | 最後に、(root 権限で実行した) {{ic|magician --list}} の出力から ''Firmware'' にあるバージョンを確認し、ファームウェアが正常にアップデートできたか検証してください。ファームウェアが正常にアップデートされたのであれば、システムを再起動してください。 |
||
+ | |||
+ | === SanDisk === |
||
+ | |||
+ | SanDisk は、SanDisk SSD Toolkit でサポートされていないオペレーティングシステムにおいて SSD のファームウェアアップデートをするための ISO ファームウェアイメージを作成しています。 |
||
+ | |||
+ | 適切な ''SSD モデル'' '''だけでなく'''、適切な SSD ''容量'' (例: 60 GB '''または''' 256GB) も合わせて、ファームウェアを選択しなければなりません。ISO ファームウェアイメージを焼いたあと、PC を再起動し、新しく作成した CD/DVD ブートディスクを起動してください (USB スティックでも動作するかもしれません)。 |
||
+ | |||
+ | ISO イメージには、Linux カーネルと initrd が含まれています。それらを {{ic|/boot}} パーティションに抽出し、[[GRUB]] や [[Syslinux]] でそれらを起動して、ファームウェアをアップデートしてください。 |
||
+ | |||
+ | 参照: |
||
+ | |||
+ | * SanDisk Extreme SSD [https://forums.sandisk.com/t/sandisk-extreme-ssd-firmware-download-for-mac-and-linux-and-pc/74022 手動ファームウェアアップデート バージョン R211] |
||
+ | * 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 として実行してください。 |
||
== 参照 == |
== 参照 == |
||
* [https://www.reddit.com/r/archlinux/comments/rkwjm/what_should_i_keep_in_mind_when_installing_on_ssd/ SSD に Arch をインストールすることについての Reddit における討論] |
* [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] |
− | * [ |
+ | * [https://lore.kernel.org/linux-btrfs/5052700D.4020003@gmail.com/ Re: SSD alignment and Btrfs sector size] |
* [https://forums.anandtech.com/threads/erase-block-alignment-misinformation.2266113/ Erase Block (Alignment) Misinformation?] |
* [https://forums.anandtech.com/threads/erase-block-alignment-misinformation.2266113/ Erase Block (Alignment) Misinformation?] |
||
* [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?] |
* [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?] |
||
− | * [ |
+ | * [https://lore.kernel.org/linux-btrfs/jgui4j$th5$1@dough.gmane.org/ Btrfs support for efficient SSD operation (data blocks alignment)] |
+ | |||
− | * [https://serverfault.com/questions/356534/ssd-erase-block-size-lvm-pv-on-raw-device-alignment SSD, Erase Block Size & LVM: PV on raw device, Alignment] |
||
+ | {{TranslationStatus|Solid state drive|2024-03-22|802360}} |
2024年3月22日 (金) 09:48時点における最新版
この記事では、ソリッドステートドライブ (SSD) や他のフラッシュメモリベースのストレージデバイスの取り扱いに関するトピックをカバーしています。
特定の目的のために SSD をパーティショニングしたい場合、フラッシュメモリ向けに最適化されたファイルシステムのリストで検討すると良いかもしれません。
一般的な利用では、自由にファイルシステムを選び、#TRIM を有効化すると良いでしょう。
使用法
TRIM
ファイルの削除がファイルシステムレベルのみで処理される[1]ハードドライブと比較して、SSD は、メモリブロックが解放されて再利用可能になったときにディスクコントローラに通知することで利益を得ます。SSD を構成するフラッシュセルは書き込み操作の度に少しづつ摩耗するため、ディスクコントローラは全てのセルに書き込み操作を分散させるアルゴリズムを使用します: この処理はウェアレベリングと呼ばれます。NVMe の DEALLOCATE や、SAS の UNMAP、ATA_TRIM コマンドが無ければ、空きメモリブロックがなくなると、1つセルに書き込む前にそのセルを削除するためにデータを移動しなければならないため、ディスクコントローラは書き込み操作により多くの時間を消費するようになってしまいます (Wikipedia:ja:ライトアンプリフィケーション を参照): TechSpot のベンチマークでは、SSD をデータで埋める前と後でのパフォーマンスへの影響を表しています。
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 のサポートを確認するには、以下を実行してください:
$ lsblk --discard
そして、DISC-GRAN (discard granularity) と DISC-MAX (discard max bytes) 列の値を確認してください。値が 0 でなければ、TRIM をサポートしていることを意味します。
SATA SSD の場合にのみ、hdparm パッケージは、hdparm -I /dev/sda | grep TRIM
を root ユーザとして実行することにより、TRIM サポートを検出することができます。hdparm は、NVMe SSD をサポートしていません。
定期的な 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#NVMe ソリッドステートドライブ を見てください。
SSD のメモリセルのクリア
時々、SSD のセルを完全にリセットしてデバイスにインストールした時と同じ初めの状態にすることで製造時の書き込みパフォーマンスを取り戻したいと思うことがあるかもしれません。SSD の書き込みパフォーマンスはネイティブの TRIM サポートを使っていても時間経過で落ちていきます。TRIM はファイル削除に対するセーフガードとして働くだけで、増加保存などの代わりにはなりません。
#SATA や #NVMe の場合、ソリッドステートドライブ/メモリセルの消去 に書かれている適切な手順に従うことでリセットすることができます。
セキュリティ
Frozen モード
一部のマザーボードファームウェアは初期化時に ATA SECURITY FREEZE LOCK コマンドを SATA デバイスに発行します。これによりドライブは frozen モードになり、SEC2 状態 (セキュリティ無効、未ロック、frozen 状態) に遷移します。同様に、一部の SSD (と HDD) も工場出荷時にこの状態にすでに設定されています。このことは hdparm と smartctl の出力から確認できます:
# 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]
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 ファームウェアのアップデートができます。
Crucial
Crucial は ISO イメージを使ってファームウェアをアップデートする方法を提供しています。SSD サポートページから製品を選んで "Manual Boot File" をダウンロードすることでイメージを入手できます。
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 はサポートされていません。
(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 イメージを抽出してください:
$ 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
パーティションに抽出し、GRUB や Syslinux でそれらを起動して、ファームウェアをアップデートしてください。
参照:
- SanDisk Extreme SSD 手動ファームウェアアップデート バージョン R211
- SanDisk Ultra SSD 手動ファームウェアアップデート バージョン 365A13F0
- SanDisk Ultra+ SSD 手動ファームウェアアップデート バージョン X2316RL - "H2" モデルと "HP" モデルのうちどちらが使用されているかを確認するには、
smartctl -i dev/disk/by-id/*SanDisk!(*part*)
を root として実行してください。