2267 文字
11 分

Mac mini M4 の容量不足を Thunderbolt 4 接続の M.2 NVMe で解決した(内蔵 SSD と同等の速度)

概要#

  • LLM で複数プロジェクトを並行開発していたら、Mac mini M4 の内蔵 SSD(256GB)が 99% 埋まった。。。
  • 内蔵 SSD の換装も検討したが、世界的に部品の入荷待ちで断念
  • Thunderbolt 4(40Gbps)なら M.2 NVMe を外付けしても内蔵と同等の速度が出るらしいので試した
  • 結果:ほぼ内蔵と遜色ないスピード。トータル約 3 万円(1TB)

背景 — ディスク使用率 99%#

ベンチマーク画像のヘッダを見るとわかりますが、内蔵の Macintosh HD99% used。完全にレッドゾーン。

LLM で複数プロジェクトを動かしていると、依存ライブラリ・モデル・キャッシュ・コンテナイメージがどんどん積み上がって、256GB はあっという間に枯渇します。Mac mini M4 を買った時点では「256GB で十分でしょ」と思っていたんですが、見通しが甘かった。

本来なら内蔵 SSD を換装するのが一番きれいなんですが、Mac mini M4 の SSD モジュールは世界的に入荷待ち。仕方ないので外付けで対処することにしました。

なぜ Thunderbolt 4 + M.2 なのか#

外付けストレージというと USB の SSD ケースが定番ですが、開発用途では速度がボトルネックになる。Thunderbolt 4 は 40Gbps(実効でだいたい 3000〜3500MB/s 前後)出るので、Gen4 の M.2 NVMe を入れれば内蔵 SSD に近い体感になるはず、というのが今回の狙いです。

ボトルネックが Thunderbolt 4 の帯域なので、SSD 側を Gen5 にしても意味がない。Gen4 で十分で、その分コストを寿命(チップ品質)に振りました。

買ったもの#

Thunderbolt 4 対応 M.2 NVMe ケース#

Amazon商品

Amazon商品

🛒 Amazonで購入

M.2 NVMe SSD(Gen4・1TB)#

開発用途で読み書きが激しいので、寿命優先で SLC チップのものを選択。Gen5 は高いし、どうせ Thunderbolt 4 がボトルネックなので Gen4 で十分。

選んだのは ADATA LEGEND 860(SLEG-860-1TCS / M.2 2280 / Gen4)。

Amazon商品

Amazon商品

🛒 Amazonで購入

ADATA LEGEND 860 1TB(M.2 2280, SLEG-860-1TCS)のパッケージ

熱伝導シリコンパッド(任意)#

ケースに必要なサーマルパッドはひととおり付属しているので、別途購入する必要はありません。今回は念のため厚みや位置を微調整したくて手元に置いておきましたが、結果として標準のパッドだけで温度的には問題ありませんでした。

汎用品で予備が欲しい人向けの参考リンク:

Amazon商品

Amazon商品

🛒 Amazonで購入

トータルでだいたい 3 万円ぐらい。SLC を選んだぶん、ちょっと高くついた感じです。

組み立て#

外付けケースに M.2 SSD を組み込んでいきます。

買った筐体#

Thunderbolt 4 対応 M.2 NVMe ケースの外観

蓋を開けたところ#

裏面のネジを外して上蓋を開けると、M.2 スロットとサーマルパッドが見える構造。

ケースの蓋を開けて M.2 スロットが見える状態

M.2 SSD を装着#

スロットに斜めから差し込んで、ネジで固定するだけ。シンプル。

M.2 SSD をスロットに装着した状態

熱伝導シリコンパッドを貼り付け#

放熱のために、SSD のチップ面に熱伝導シリコンパッドを貼る。これで上蓋のヒートシンクへ熱が伝わるようになります。

なお このパッドはケースに付属していたもので、別途買う必要はありません。袋にひと通り揃って入っているので、開封して使うだけ。

SSD の上に熱伝導シリコンパッドを貼り付けた状態

設置#

蓋を閉めて、Mac mini の Thunderbolt 4 ポートに繋ぐだけ。

Mac mini M4 の背面に Thunderbolt 4 で M.2 NVMe ケースを接続した状態

ベンチマーク#

AmorphousDiskMark で内蔵 SSD と外付け M.2 NVMe を比較。

内蔵 SSD(APPLE SSD AP0256Z / Apple M4)#

Mac mini M4 内蔵 SSD のベンチマーク結果

外付け M.2 NVMe(SLEG-860-1TCS / Thunderbolt 4 接続)#

Thunderbolt 4 接続の外付け M.2 NVMe のベンチマーク結果

比較グラフ(対数スケール)#

Mac mini M4 内蔵 SSD と外付け M.2 NVMe のベンチマーク比較グラフ

比較表(MB/s)#

テスト内蔵 Read内蔵 Write外付け Read外付け Write
SEQ1M QD83537.385950.953401.003203.53
SEQ1M QD12224.555087.252753.982902.15
RND4K QD64709.8792.84867.12330.90
RND4K QD163.9330.3476.7148.25

所感#

  • シーケンシャル Read は内蔵とほぼ同じ(3537 vs 3401 MB/s)
  • シーケンシャル Write は内蔵が圧倒的に速い(5950 vs 3203 MB/s)が、これは Apple Silicon の内蔵 SSD が異常に速いだけで、外付けの 3203 MB/s も Gen4 SSD として十分な数値
  • 面白いのは ランダムアクセスは外付けのほうが全項目で速いこと。RND4K QD1 Write は内蔵 30.34 → 外付け 48.25 と 1.5 倍以上。SEQ1M QD1 Read も外付け 2753 vs 内蔵 2224
  • 体感では内蔵と区別がつかない

ということで、開発の作業ディレクトリを丸ごと外付けに移しても困らなそうです。

温度と SMART 情報#

M.2 の筐体を触るとほんのり温かい。常時体温よりは温かいので一応計測。

$ smartctl -a /dev/disk6 | grep -i Temp | grep -v -i threshold | grep -v -i time
Temperature: 35 Celsius
Temperature Sensor 1: 40 Celsius
Temperature Sensor 2: 55 Celsius

センサー 2 が 55℃ とちょっと高めですが、Gen4 NVMe としては許容範囲。Warning Temperature Threshold が 86℃、Critical が 93℃ なので、まだ十分マージンはあります。

2 週間後の SMART ログ全文#

導入から 2 週間後の smartctl -a /dev/disk6 の出力。

=== START OF INFORMATION SECTION ===
Model Number: SLEG-860-1TCS
Serial Number: 2P3229ANQNFG
Firmware Version: X1105E00
PCI Vendor/Subsystem ID: 0x1cc1
Total NVM Capacity: 1,024,209,543,168 [1.02 TB]
NVMe Version: 2.0
Warning Comp. Temp. Threshold: 86 Celsius
Critical Comp. Temp. Threshold: 93 Celsius
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02, NSID 0xffffffff)
Critical Warning: 0x00
Temperature: 39 Celsius
Available Spare: 100%
Available Spare Threshold: 10%
Percentage Used: 0%
Data Units Read: 1,080,412 [553 GB]
Data Units Written: 3,314,686 [1.69 TB]
Host Read Commands: 20,994,074
Host Write Commands: 27,511,057
Controller Busy Time: 290
Power Cycles: 45
Power On Hours: 544
Unsafe Shutdowns: 16
Media and Data Integrity Errors: 0
Error Information Log Entries: 0
Warning Comp. Temperature Time: 0
Critical Comp. Temperature Time: 0
Temperature Sensor 1: 39 Celsius
Temperature Sensor 2: 54 Celsius

ポイント:

  • Percentage Used: 0% — 書き込み寿命の消費は 2 週間でほぼゼロ
  • Available Spare: 100% — 代替セクタの予備領域もまったく減っていない
  • Data Units Written: 1.69 TB — 2 週間で 1.69TB 書き込み(後述の .colimabun-cache などが効いている)
  • Power On Hours: 544 — 常時起動状態に近い(544 時間 ≒ 22.7 日。設置時刻からの累計)
  • Unsafe Shutdowns: 16 — Mac の再起動・スリープ時にこのカウントは増えがち。問題はなし
  • Media and Data Integrity Errors: 0 — エラーゼロ

長寿命チップを選んだ甲斐あって、書き込み量に対して寿命消費はほぼ目に見えません。長時間の重い書き込みを続けるなら追加のヒートシンクや冷却を考えても良さそうですが、現状は無調整で安定しています。

2 週間運用してみて#

導入から 2 週間ほど経ったので、実際の使用状況を duf で確認。

duf で見た外付け NVMe を含むマウント状況

外付け NVMe(/Volumes/nvme、999.9GB)にはまだ余裕がある一方、内蔵の Macintosh HD は依然 60% 台。退避がうまく効いている感じです。

退避の方針はシンプルで、容量を食う系のキャッシュ・コンテナ・ソースツリーをまるごと外付けに置いて、元の場所からシンボリックリンクを貼るだけ。

Terminal window
❯❯❯ eza -al /Volumes/nvme/matsu/
drwxr-xr-x@ - matsu 2026/04/26 10:10 .aube-store
drwxr-xr-x@ - matsu 2026/04/27 13:05 .bun-cache
drwxr-xr-x@ - matsu 2026/04/16 00:29 .colima
drwxr-xr-x@ - matsu 2026/03/25 15:21 ghq
Terminal window
❯❯❯ \du -hs /Volumes/nvme/matsu/{.*,*}
362M /Volumes/nvme/matsu/.aube-store
503M /Volumes/nvme/matsu/.bun-cache
72G /Volumes/nvme/matsu/.colima
39G /Volumes/nvme/matsu/ghq

中身を見ると、

  • .colima72GB(Docker 用 Linux VM のディスクイメージ)
  • ghq39GB(クローンしているリポジトリ群)
  • .bun-cache.aube-store で 1GB 弱

合計で 110GB 超を内蔵から外付けに逃がしている計算。これがまるごと内蔵に乗っていたら 256GB ではどうやっても足りないので、退避の効果は明確です。

体感としても、colima の起動も git clone も外付けで普通に速い。Thunderbolt 4 の帯域だと開発ワークロードでは内蔵との差は感じません。

まとめ#

  • Mac mini M4 の内蔵 SSD が満杯になっても、Thunderbolt 4 + M.2 NVMe で内蔵に近い性能の追加ストレージを確保できる
  • コスト:約 3 万円 / 1TB(ケース + Gen4 SLC SSD)
  • 内蔵換装の入荷を待つよりこっちのほうが現実的。やって正解
  • 2 週間運用しても安定。.colimaghq を逃がすだけで内蔵に十分な余裕ができた

余談#

そもそも Mac mini M4 を買うときに 256GB を選んだのが間違いでした。Apple の SSD アップグレード料金が高いので渋ったわけですが、開発機としては最低でも 1TB 欲しい。

ただ、結果的には外付けでも十分使える速度が出ることがわかったので、**「とりあえず最小構成で買って、足りなくなったら Thunderbolt 4 で外付け」**という戦略はけっこう有りかもしれません。内蔵を盛るより、後から付け外しできる外付けのほうが用途変更にも強いし。

参考までに、当時のメモはこちら: https://x.com/matsubokkuri/status/2044363980114694188

この記事が役に立ったら
GitHub Sponsorsで応援できます

コメント