TRIMコマンド (ATAコマンドセット:TRIM 、SCSIコマンドセット :UNMAP )は、オペレーティングシステム からソリッドステートドライブ (SSD)の未使用領域を内部的に消去するために用いられるコマンドである[ 1] 。
SSDの登場から間もなくTRIMコマンドが登場した。 SSDへのハードウェア的な操作は、従来のハードディスクドライブとは大きく異なるため、オペレーティングシステムから削除やフォーマットなどの操作を従来通り行った場合に、書き込み操作で予期せず段階的なパフォーマンス低下が発生した[ 2] 。TRIMの実行により、SSDはガベージコレクション をより効率的に処理できる。実行しない場合は、書き込み動作が遅延する可能性がある[ 3] 。
一部のドライブにおいては、工場出荷状態にリセットするツールは、TRIMの導入前から存在していたが、ドライブ上のすべてのデータも削除されるため、使用中に最適化のために使用することは現実的ではない[ 4] 。また、2014年までには多くのSSDに対し、TRIMとは独立して機能する、バックグラウンドガベージコレクションメカニズムが搭載されるようになった。これにより、TRIMをサポートしていないOSでもパフォーマンスが維持できるようになったが、 ライトアンプリフィケーション が発生しやすくなる上、フラッシュセルの寿命を縮める欠点が存在した[ 5] 。
背景
多くのファイルシステム では削除操作を処理する場合、データブロックに「未使用」のフラグを立てる[ 6] [ 7] 。これにより、いずれのストレージメディアでもどの領域が本当に使用中であるかに関わらず、空きスペースとして領域を使用できる。上書き操作とは異なり、削除操作時においては、データを含むセクターへの物理的な書き込みは行われない。一般的なSSDにおいては、未使用の領域のリストを含むファイルシステム構造を処理せず,そのまま書き込み動作を行うため、メディア側では領域が使用可能になったことは認識されない。 これにより、ハードディスク などでは、削除されたファイルを復元するツールが利用できるようになっている [ 8] 。つまり、いずれのメディアの場合でも、未使用領域を使用したという場合でも上書き操作が行われている可能性が存在する。 磁気ディスクの場合、空のセクターへの書き込みと上書き操作に相違はないが、一部のSSDは機能の実装が最低レベルであるため、上書きは完全未使用の領域にデータを書き込む場合に比べて大きなオーバーヘッドを生じ、書き込みパフォーマンスを損なう可能性がある [ 9] 。
SSDは、通常4〜16 kiB 単位でグループ化されたフラッシュメモリのセルにデータを格納し、通常それを128〜512ページのブロックにグループ化する[ 6] 。NANDフラッシュメモリ セルの場合、領域が完全に空の場合にのみ書き込み操作が実行できる。データが残存している可能性がある場合、書き込み操作の前に領域を消去する必要がある。SSDへの書き込み操作はページ単位で実行できるが、ハードウェアの制限により、消去は常にブロック全体に対して実行される[ 10] 。よって、SSDの空の領域への書き込み操作は非常に高速だが、以前に使用された領域を上書きする必要がある場合、遅延が発生する。 再度書き込む前にページ内のセルの消去が必要となるが、消去できるのはブロック全体であるので、上書きすると読み取り-消去-変更-書き込みサイクルが実行される [ 11] 。削除対象のブロックに存在するデータ全体が一旦キャッシュに保存され、ブロック全体を消去し、上書きされた部分がキャッシュに書き込まれる。その後、更新されたブロック全体をフラッシュメディアに書き込む。この現象はライトアンプリフィケーション として知られている[ 12] [ 13] 。
操作
TRIMコマンドを使用すると、オペレーティングシステムは、使用しなくなったページをSSDに通知できる。ファイル削除操作の場合、オペレーティングシステムはファイルのセクターを空き領域としてマークし、TRIMコマンドをSSDに送信する。その後新しいデータを書き込むときににSSDはブロックの内容を保持しないため、書き込み量を少なくすることとなり、書き込みスループットが高くなる。よって、寿命を延ばすことが期待できる。
ただし、SSDによってコマンドの実装方法が異なるため、得られるパフォーマンスが異なる場合がある[ 3] [ 8] 。
TRIMはSSDにLBA 領域を無効としてマークするように指示し、その後に領域の読み取りを行ったとしても意味のあるデータを返さなくなる。非常に短い間、データが依然としてフラッシュメモリ内に存在する可能性があるが、TRIMコマンドが発行されてガベージコレクションが実行された後は、専門家でさえデータを回復できる可能性はほぼないとされている[ 14] 。
実装
オペレーティングシステムでのサポート
TRIMコマンドの発行は、サポートされているオペレーティングシステムでのみ実行される。以下の表は、オペレーティングシステムと、コマンドをサポートする最初のバージョンを示している。さらに、ATA規格にTRIMコマンドが追加されるよりも前に設計された古いSSDでは、ファームウェアの更新が必要となる。更新されていない場合、新しいコマンドは無視される。ただし、すべての古いSSDでTRIMコマンドをサポートするアップデートが準備されているわけではない。
空き領域を正しく理解しているプログラムだけが安全にコマンドを発行できるため、TRIMのサポートは、ファイルシステムドライバーによっても異なる。
RAIDへの問題
2017年1月 (2017-01 ) 現在[update] , TRIMコマンドへのサポートはほとんどすべてのハードウェアRAID においては実装されていない。しかし、ソフトウェアRAID の場合はサポートされている場合がある。
Windows
Windows 10 では、RAIDボリュームの構成時に「ドライブの最適化」のオプションを使用することで、SSDを含むRAIDボリュームでもTRIMをサポートする。
macOS
macOSの標準RAIDドライバーはTRIMをサポートしていない。この問題は、少なくとも10.7からmacOS 10.12.xまでのすべてのバージョンで該当する。
アップル以外製SSDでのTRIMサポートを含むサードパーティのSoftRAID®アプリケーションを使用する場合、TRIMはRAID(0、1、4、5、10)ボリュームでサポートされる。ただし、ターミナルコマンド「sudo trimforce enable」を使用して明示的に有効にする必要がある。
Linux
TRIMは、Linuxカーネル内のdmraid (英語版 ) において、2011年1月以降のリリースで使用可能となった。これは、BIOSによる「偽のハードウェアRAID」へのサポートであり、RAID上にあるファイルシステムからのTRIMリクエストを透過的に処理する[ 45] 。
Linuxの汎用ソフトウェアRAIDシステムであるmdraid (英語版 ) では、システムがファイルシステムでmdtrimユーティリティを定期的に実行するように構成されている場合、RAID 1上でバッチベース(ファイル削除時実行)のTRIMを試験的にサポートしている[ 46] 。Red Hat Enterprise Linux 6.5以降などのLinuxの新しいバージョンでは、mdraidは、単なるバッチジョブとしてではなく、実際にTRIMコマンドをリアルタイムで渡すことをサポートしている[ 47] 。
しかし、Red Hat はソフトウェアRAIDのうち1、4、5、6を使用しないことを推奨しており、理由として、ほとんどのRAID管理ユーティリティ(Linuxにおけるmdadm (英語版 ) など )での初期化時にデバイスのすべてのブロックに書き込み処理を行い、チェックサム(またはRAID 1/10の場合はドライブ間の検証)が適切に動作することを確認するためである。これにより、SSDにおいてはスペア領域以外のすべてのブロックが使用中の場合、パフォーマンスが大幅に低下する[ 48] 。
一方、Red Hatは、TRIM(Linux用語では「破棄」)をサポートしており、LVMユーティリティは作成時にすべてのブロックに対する書き込み処理を行わないため、SSD上のLVM RAIDに対してはRAID 1またはRAID 10を使用することを推奨している[ 47] 。
2010年3月、ユーザー間でIntel Rapid Storage Technology(RST)9.6ドライバーがRAIDボリュームでTRIMをサポートしていると信じられるようになったが、Intelは後にTRIMがAHCI モードとRAIDモードのBIOS設定でサポートされるが,RAIDボリュームの一部として使用される場合はサポートしないことを明らかにした[ 49] 。
2012年8月の時点で、IntelはRapid Storage Technology(RST)11.2ドライバーを搭載した7シリーズのチップセットがMicrosoft Windows 7におけるRAID 0のTRIMをサポートしていることを確認している[ 50] 。Intelは6シリーズチップセットのサポートを確認していないが、RAID 0ボリュームでのTRIMは、変更されたRAIDオプションROMを使用することで、Z68、P67、X79のチップセットで動作することが示されている[ 51] 。6シリーズチップセットで公式にサポートされていない理由として、技術的なものではなく、検証コスト[ 52] ないし消費者にアップグレードを促す目的[ 53] であると推測されている。
X79チップセットを備えたマザーボードにおいてオプションROMを変更しなくても問題ない場合は、製造元がROMスイッチを追加した場合である。BIOSとUEFIの内部にRST ROMとRST-E ROMの両方があれば、RST-E ROMの代わりにRST ROMを使用して、TRIMを機能させることが可能となる[ 54] 。Intelは、ROMと同じバージョンのドライバーを使用することで最高のパフォーマンスが得られると述べている。たとえば、BIOS・UEFIに11.0.0.0mオプションROMがある場合、11.xバージョンのドライバーを使用する必要がある[ 55] 。
サポートされていないファイルシステムでの有効化
ファイルシステムが自動的にTRIMをサポートしない場合でも、一部のユーティリティではTRIMコマンドを手動で送信できる。通常、ユーティリティが使用されていないブロックを判別し、リストをコマンドとしてドライブに渡す。このようなユーティリティは、複数のメーカーが提供している(例: Intel[ 56] 、G.Skill[ 57] )。また、一般的なユーティリティ(例:Linuxのhdparm (英語版 ) v9.17以降の"wiper"[ 58] [ 59] 、mdtrim)としても提供されている。hdparmとmdtrimはいずれも、ファイルシステムに大きなファイルを割り当て、割り当てられている物理的な場所を解決することにより、空きブロックを検索する。
ハードウェアサポート
ATA
TRIMコマンドの仕様[ 60] は、 国際情報技術標準委員会 (INCITS)の技術委員会T13が主導するATアタッチメント (ATA)インターフェイス標準の一部として標準化されている[ 61] 。TRIMは、ドラフトACS-2仕様のDATA SET MANAGEMENTコマンド(opcode 06h)で実装されている[ 62] 。また、ATA規格は、パラレル(IDE、PATA)・シリアル(SATA)の両方でサポートされている。
オリジナルのATA TRIMコマンドの欠点は、キューに入れられないコマンドとして定義されていたため、キューに入れられた読み取りおよび書き込み操作の通常のワークロードと簡単に混在させることができない点であった。 SATA 3.1では、これを修正するためにキューに入れられたTRIMコマンドが導入された[ 63] 。
ATA IDENTIFY DEVICEコマンドから返されるSATAワード69および169により定義される、複数種のTRIMコマンドが存在する。
非決定的TRIM:TRIM後の論理ブロックアドレス (LBA)への読み取りコマンドで、異なるデータを返す場合がある。
確定的TRIM(DRAT):TRIM後のLBAへの読み取りコマンドは、同じデータを返すか、確定的となる。
TRIM後の確定的読み取りゼロ(RZAT):TRIM後のLBAへのすべての読み取りコマンドはゼロを返す。
SATAワード105には、ドライブがサポートできるDATA SET MANAGEMENTコマンドごとの512バイトブロックの最大数を示す追加情報が存在する。 通常、これはデフォルトで8または4 kBとなっているが、多くのドライブでは1として、TRIMのMicrosoft Windowsハードウェア要件に存在する、コマンド完了時間が20ミリ秒または8ミリ秒×LBA範囲エントリ数のいずれか以上かつ600ミリ秒未満でなければならないという条件を満たすようにしている[ 64] 。
個々のLBA範囲はLBA範囲エントリと呼ばれ、8バイトで表現される。LBA自体は、LBA範囲エントリの最初の6バイトで表され、範囲長が残りの2バイトで表されている。範囲長のビットがすべてゼロの場合、LBA範囲エントリはパディングとして破棄される[ 65] 。つまり、1回のTRIM範囲で最大で32 MBの64倍すなわち2GBが指定される。デバイスがSATAワード105で8をサポートしている場合、1回のTRIM(DATA SET MANAGEMENT)コマンドで16 GBをトリムできることとなる。
SCSI
SCSI では、TRIMと同一内容であるUNMAPコマンド、およびUNMAPフラグが設定されたWRITE SAMEコマンド(10および16バリアント)が存在する[ 66] 。
SD/MMC
MultiMediaCard およびSD ERASE(CMD38)コマンドは、ATAでのTRIMコマンドと同様の機能を提供するが、消去されたブロックをその後0または1で上書きする必要がある。eMMC 4.5では、破棄されたブロックの内容が不確定と見なすことができる点でTRIMコマンドにより類似した「破棄」サブオペレーションを定義した。
NVM Express
NVM Express コマンドセットでは、ホストの意図を一連のブロック範囲のストレージデバイスに示めすための汎用のコマンドが存在する。その操作の1つであるdeallocateコマンド はTRIMを実行することと同義である。また、deallocate コマンド実行へのヒントを提供し、ディスクがゼロをトリミングして返すことを可能にするWrite Zeroes コマンドも存在する。
短所
暗号化が使用されている場合、TRIMコマンドを使用すると、使用されているブロックと使用されていないブロックに関する情報が明らかになってしまう[ 67] 。
オリジナルのTRIMコマンドは、 T13小委員会 によって非キューコマンドとして定義されていたため、たとえば各ファイルシステムの削除コマンドの後に送信された場合など、不注意に使用すると、大量の実行ペナルティが発生する可能性がある。非キューコマンドの性質上、デバイスドライバは、未解決のコマンドがすべて完了するのを待機し、TRIMコマンドを発行してから、通常のコマンドを再開する必要がある。SSDのファームウェアによっては、TRIMが完了するまでにかなりの時間がかかってしまい、ガベージコレクション サイクルがトリガーされる場合もある[要出典 ] 。このペナルティは、システムの使用率が最小になるようなバッチジョブをスケジュールすることにより、ファイルの削除ごとにトリミングするのではなく、定期的にバッチTRIMを実行することで最小限に抑えられる。このTRIMの欠点は、Queued TRIMコマンドの導入により、シリアルATA リビジョン3.1で改善した[ 68] [ 69] 。
Queued TRIMへのサポートを誤ってシステムに通知しているか、実装に重大なバグがあるドライブファームウェアにより、いくつかのデバイス、特にMicronとCrucialのM500[ 70] およびSamsungの840および850シリーズなどで深刻なデータ破損を引き起こすとされている[ 71] 。
以下のデバイスは、Linuxカーネルのlibata-core.c でブラックリストに登録されており、非キューTRIMコマンド(ATA_HORKAGE_NO_NCQ_TRIM )の送信を強制される[ 72] 。
Micron/Crucial M500 (すべてのファームウェア)
Micron M510 (ファームウェアバージョン MU01)
Micron/Crucial M550 (ファームウェアバージョン MU01)
Crucial MX100 (ファームウェアバージョン MU01)
Samsung 840/850 シリーズ(すべてのファームウェア)
また、このファイルは、TRIMが発行されたときに誤ったブロックがデータを失う原因となるため、SuperSSpeed S238をTRIMコマンドへのブラックリストに載せている[ 72] [ 73] 。
libata-core.c には、サブシステムのメンテナーがDRATフラグとRZATフラグ(ATA_HORKAGE_ZERO_AFTER_TRIM
)を確実に認識しているSSDを列挙しているホワイトリストもある。 ホワイトリストに登録されているドライブは以下の通りである[ 72] 。
Crucial SSD
Intel SSD 510を除くIntel SSD
Micron SSD
Samsung SSD
Seagate SSD[ 74]
出典
^ “TRIM Overview ” (英語). Intel . 2020年6月9日 閲覧。
^ Shimpi, Anand Lal (2009年3月18日). “The SSD Anthology ”. AnandTech.com . p. 4. 2010年6月19日 閲覧。
^ a b Shimpi, Anand Lal. (18 March 2009). p. 10.
^ Shimpi, Anand Lal. (18 March 2009). p. 11.
^ “Kingston SSDNow V Plus 100 Review ”. AnandTech.com . Anand Lal Shimpi (2010年11月11日). 2010年12月10日 閲覧。
^ a b Savill, John (2009年4月21日). “I heard solid-state disks (SSDs) suffer from a decline in write performance as they're used. Why? ”. WindowsITPro. 30 June 2012時点のオリジナル よりアーカイブ。2010年6月19日 閲覧。
^ Shimpi, Anand Lal. (18 March 2009). p. 7.
^ a b Savill, John (2009年4月22日). “What is the TRIM function for solid-state disks (SSDs) and why is it important? ”. WindowsITPro. 2013年2月9日時点のオリジナル よりアーカイブ。2010年6月19日 閲覧。
^ Malventano (13 February 2009). “Long-term performance analysis of Intel Mainstream SSDs ”. PC Perspective . 10 February 2012 閲覧。
^ Shimpi, Anand Lal. (18 March 2009). p. 5.
^ Shimpi, Anand Lal. (18 March 2009). p. 8.
^ “Write Amplification: Intel's Secret Sauce ”. ExtremeTech.com. 2010年11月6日 閲覧。
^ “Inside the X25-M Controller: Wear Leveling, Write Amplification Control ”. TomsHardware.com (2008年9月8日). 2010年11月6日 閲覧。
^ “Too TRIM? When SSD Data Recovery is Impossible ”. TechGage . TechGage (2010年3月5日). 2018年8月21日 閲覧。
^ “Preliminary TRIM support ”. 2020年7月6日 閲覧。
^ “FreeBSD 8.1-RELEASE Release Notes: Disks and Storage ”. 2010年9月1日 閲覧。
^ “Add kernel side support for BIO_DELETE/TRIM on UFS ”. 2011年2月1日 閲覧。
^ “Added ZFS TRIM support which is enabled by default. ”. 2013年6月5日 閲覧。
^ “FreeBSD 9.2-RELEASE Announcement ”. 2013年10月4日 閲覧。
^ “Base revision 242323 – Add basic BIO_DELETE support to GEOM RAID class for all RAID levels ”. 2012年10月30日 閲覧。
^ “TRIM support in NetBSD ” (2012年10月19日). 2020年7月6日 閲覧。
^ “Block device changes in Linux 2.6.28 ”. 2020年7月6日 閲覧。
^ “Storage changes in Linux 2.6.33 ”. Kernel Newbies. 2010年9月1日 閲覧。
^ “HOWTO: Configure Ext4 to Enable TRIM Support for SSDs on Ubuntu and Other Distributions – Forked by Nicolay ”. 2020年7月6日 閲覧。
^ “Btrfs improvements in Linux 2.6.32 ”. 2020年7月6日 閲覧。
^ “JFS Filesystem can now handle trim ”. 2012年3月28日 閲覧。
^ “Filesystem changes in Linux 3.0 ”. 2020年7月6日 閲覧。
^ Freemyer (2010年). “OpenSUSE forum – SSD detection when creating first time fstab ”. 2020年7月6日 閲覧。
^ “How to enable TRIM? ”. Ask Ubuntu . 11 November 2015 閲覧。
^ “SDB:SSD discard (trim) support ”. 2020年7月6日 閲覧。
^ “Mac OS X 10.6.8 Brings TRIM Support for Apple SSDs, Graphics Improvements ” (2012年2月24日). 2020年7月6日 閲覧。
^ “Macbook Pros ship with active SSD TRIM support ” (2011年3月4日). 2020年7月6日 閲覧。
^ “Yosemite kills third-party SSD support ”. 2020年7月6日 閲覧。
^ “Chameleon SSD Optimizer ”. 2020年7月6日 閲覧。
^ “Cindori Software ”. 2020年7月6日 閲覧。
^ Lee Hutchinson (30 June 2015). “Latest OS X update allows you to enable TRIM for third-party SSDs ”. Ars Technica . Condé Nast. 2015年7月1日 閲覧。
^ “Support and Q&A for Solid-State Drives ”. MSDN (2009年5月9日). 2010年8月12日 閲覧。
^ “Windows 7 Enhancements for Solid-State Drives ”. Microsoft downloads . Microsoft Corporation (2008年11月12日). 2009年7月8日 閲覧。
^ Geoff Gasior (2012) OCZ's RevoDrive 3 X2 240GB solid-state drive
^ Coles (15 April 2010). “SSD Benchmark Tests: SATA IDE vs AHCI Mode – AHCI vs IDE Final Thoughts ”. BenchmarkReviews . 20 August 2013 閲覧。
^ “Fsutil behavior ” (英語). Microsoft Documentation . 17 November 2019 閲覧。
^ “SATA TRIM support in OpenSolaris ” (2010年7月29日). 2020年7月6日 閲覧。
^ “Android 4.3 Update Brings TRIM to All Nexus Devices ” (2013年7月29日). 2013年7月30日 閲覧。
^ "Android 4.3 announced, rolling out to Nexus devices today" .The Verge . 24 July 2013. Retrieved 24 July 2013.
^ “Possible to get SSD TRIM (discard) working on ext4 + LVM + software RAID in Linux? – Server Fault ”. 2011年11月29日 閲覧。
^ “Cyberax/mdtrim – GitHub ”. 2011年11月29日 閲覧。
^ a b “Red Hat Enterprise Linux 6 Storage Administration Guide, Chapter 21. Solid-State Disk Deployment Guidelines ”. 2016年3月9日 閲覧。
^ “Red Hat Enterprise Linux 7 Storage Administration Guide ” (2015年11月11日). 2016年2月29日 閲覧。
^ “Is there TRIM support for RAID configurations? ”. Intel (2010年3月26日). 2010年11月6日 閲覧。
^ “Intel Confirms RAID0 TRIM Support on 7-Series Chipsets ” (2012年8月19日). 2013年1月14日 閲覧。
^ “RAID0 trim and SRT seems possible on 6-series and 5-Series ” (2012年11月18日). 2013年1月14日 閲覧。
^ “TRIM & RAID-0 SSD Arrays Work With Intel 6-Series Motherboards Too ” (2012年11月28日). 2013年1月14日 閲覧。
^ “Intel Brings TRIM to RAID-0 SSD Arrays on 7-Series Motherboards, We Test It ” (2012年8月16日). 2013年1月14日 閲覧。
^ Anand Lal Shimpi. “Intel Brings TRIM to RAID-0 SSD Arrays on 7-Series Motherboards, We Test It ”. 2020年7月6日 閲覧。
^ Doug Crowthers. “TRIM Command Confirmed With RAID 0 on Intel 7 Series ”. Tom's Hardware . 2020年7月6日 閲覧。
^ “Intel SSD Optimizer White Paper ”. Intel Corporation. 30 June 2012時点のオリジナル よりアーカイブ。23 January 2010 閲覧。
^ “wiper.exe for Falcon Series ”. XtremeSystems. 23 January 2010 閲覧。
^ “hdparm-9.17 released, with experimental trim/wiper scripts for SSDs ”. 14 August 2010 閲覧。
^ “hdparm project page ”. sourceforge.net. 14 August 2010 閲覧。
^ “Data Set Management Commands Proposal for ATA8-ACS2 (revision 6) ”. INCITS T13 . INCITS (2007年12月12日). 2009年7月8日 閲覧。 (draft specification T13/e07154r6)
^ “T13 documents referring to TRIM ”. INCITS T13 . INCITS . 2009年7月8日 閲覧。
^ “T13 ATA8 Draft Spec 1697-D ”. INCITS (2010年6月23日). 2010年8月14日 閲覧。
^ “SATA 6Gb/s ”. Serial ATA International Organization. 2012年9月26日 閲覧。
^ “Device.Storage Requirements (Windows) ”. 2016年2月29日 閲覧。
^ “T13/2161-D: Information technology – ATA/ATAPI Command Set – 3 (ACS-3) ”. 2016年2月29日 閲覧。
^ “Note for SCSI UNMAP support in FreeBSD mailing list ”. 2020年7月6日 閲覧。
^ “Milan Broz's blog: TRIM & dm-crypt ... problems? ”. Milan Broz. 2014年10月1日 閲覧。
^ http://www.sata-io.org/technology/6Gbdetails.asp
^ “SATA 3.1 spec brings swap standard, improved TRIM ”. The Tech Report . 2020年7月6日 閲覧。
^ “Bug 71371 – [PATCH]Crucial M500, broken "queued TRIM" support ”. 2020年7月6日 閲覧。
^ “Bug #1449005 "trim does not work with Samsung 840 EVO after firm..." : Bugs : fstrim package : Ubuntu ”. 2020年7月6日 閲覧。
^ a b c torvalds. “linux/libata-core.c at master · torvalds/linux · GitHub ”. GitHub . 2020年7月6日 閲覧。
^ torvalds. “libata: force disable trim for SuperSSpeed S238 · torvalds/linux@cda57b1 ”. GitHub . 2020年7月6日 閲覧。
^ “[1/3] libata: Whitelist SSDs that are known to properly return zeroes after TRIM ”. 2020年7月6日 閲覧。
関連項目
外部リンク