1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

M.2スロットってなんだ?〜SSD選びで絶対に間違えないための完全ガイド〜

1
Posted at

この記事の対象読者

  • PCを自作しようとしているが、M.2スロットの種類がよくわからない方
  • 「M.2 SSDを買ったのに挿さらない/認識しない」というトラブルを避けたい方
  • SATA SSD、NVMe SSD、PCIe世代の違いを整理したいエンジニア
  • ノートPCのSSD換装を検討している方

この記事で得られること

  • M.2スロットの正体: なぜこんなにややこしいのか、技術的背景を理解
  • キー(切り欠き)の見分け方: B key、M key、B+M keyの違いと互換性
  • サイズの命名規則: 2230、2242、2280などの数字の意味
  • SATA vs NVMe vs PCIe世代: 速度差と選び方の指針
  • 実践的な互換性チェック: 購入前に確認すべきポイント

この記事で扱わないこと

  • M.2 SSDの内部構造(NANDチップ、コントローラーの詳細)
  • エンタープライズ向けのU.2、EDSFF規格
  • RAIDの構成方法

1. M.2スロットとの出会い

NVMe SSD買ったのに、なんで認識しないの?」

PC自作初心者だった頃の私がぶつかった壁だ。ネットで評判の良かったNVMe SSDを買って、意気揚々とマザーボードに挿したら、物理的に挿さらない。切り欠きの位置が合わない。

「え、M.2って全部同じじゃないの?」

違う。M.2は「形状」と「インターフェース」が別々に存在する、非常にややこしい規格なのだ。USBメモリのように「挿せば動く」という単純なものではない。

M.2スロットは、例えるなら 「複数の言語を話せるマルチリンガルな港」 のようなもの。同じ見た目の港でも、対応できる船(デバイス)が違う。
SATA語しか話せない港にNVMe語の船が来ても、コミュニケーションできないのだ。

ここまでで、M.2スロットがどんなものか、なんとなくイメージできただろうか。次は、この記事で使う用語を整理しておこう。


2. 前提知識の確認

本題に入る前に、この記事で登場する用語を確認する。

2.1 フォームファクタとは

フォームファクタは、デバイスの物理的な形状・サイズを定義する規格のこと。M.2は「フォームファクタ」であり、「インターフェース」ではない。これがM.2を理解する上で最も重要なポイントだ。

2.2 インターフェースとは

インターフェースは、データをやり取りする「通信方式」のこと。M.2スロットは以下の複数のインターフェースに対応できる。

インターフェース 最大速度 用途
SATA 3.0 600 MB/s 従来型SSD
PCIe 3.0 x4 約 4,000 MB/s NVMe SSD
PCIe 4.0 x4 約 8,000 MB/s 高速NVMe SSD
PCIe 5.0 x4 約 16,000 MB/s 超高速NVMe SSD
USB 3.0 5 Gbps 一部のデバイス

2.3 プロトコルとは

プロトコルは、データを解釈・処理する「言語」のこと。同じPCIeインターフェースでも、異なるプロトコルが使われる。

プロトコル 説明 対応インターフェース
AHCI HDD時代からの古いプロトコル SATA
NVMe SSD専用に設計された高速プロトコル PCIe

重要: 「NVMe」はプロトコル名であり、インターフェースやフォームファクタではない。「NVMe SSD」は「PCIeインターフェースでNVMeプロトコルを使うSSD」の略称だ。

2.4 レーン(Lane)とは

PCIeのレーンは、データを並列転送するための「車線」のようなもの。レーン数が多いほど、同時に多くのデータを転送できる。

  • x1: 1車線(一方通行)
  • x2: 2車線
  • x4: 4車線(M.2 SSDの標準)
  • x8: 8車線
  • x16: 16車線(グラフィックカード用)

M.2スロットは最大x4レーンをサポートする。

これらの用語が押さえられたら、M.2の背景を見ていこう。


3. M.2が生まれた背景

3.1 誕生の歴史

M.2(エム・ドット・ツー)は、元々 NGFF(Next Generation Form Factor) という名前で2012年に登場した。2013年にM.2に改名された。

M.2の前身は mSATA(Mini-SATA)Mini PCIe だった。これらは主にノートPCで使われていた小型規格だが、いくつかの問題があった。

規格 問題点
mSATA SATAインターフェースのみ(速度限界)
Mini PCIe サイズが固定(柔軟性がない)

3.2 M.2が解決した課題

M.2は以下の課題を解決するために設計された。

1. サイズの柔軟性

mSATAは30mm x 50.95mmの固定サイズだった。M.2は幅22mmを基本としつつ、長さを30mm〜110mmの範囲で選べるようにした。これにより、超薄型ノートPCから高容量エンタープライズ用途まで、同じ規格でカバーできるようになった。

2. 複数インターフェースの統合

従来は、SATAデバイス用とPCIeデバイス用で別々のコネクタが必要だった。M.2は一つのコネクタで両方をサポートし、さらにUSB 3.0まで対応した。

3. ケーブルレス化

2.5インチSSDはデータケーブル(SATA)と電源ケーブルの2本が必要だった。M.2はマザーボードに直接挿すだけで、ケーブル不要。配線がスッキリし、エアフローも改善される。

3.3 SATA-IO規格での標準化

2013年8月、SATA Revision 3.2規格でM.2がストレージデバイス向けフォームファクタとして正式に標準化された。これにより、メーカー間での互換性が確保された。

背景がわかったところで、基本的な仕組みを見ていこう。


4. 基本概念と仕組み

4.1 M.2のサイズ命名規則

M.2モジュールのサイズは 4〜5桁の数字 で表される。この数字は「幅(mm)+長さ(mm)」を意味する。

【M.2サイズの読み方】

  2280
  ││└┴─ 長さ: 80mm
  └┴─── 幅: 22mm

  22110
  ││└┴┴─ 長さ: 110mm
  └┴──── 幅: 22mm

主要なM.2サイズ一覧

サイズ 寸法 主な用途 NAND容量目安
2230 22mm x 30mm 超薄型ノートPC、Steam Deck、Surface 〜1TB
2242 22mm x 42mm 薄型ノートPC、組み込み機器 〜1TB
2260 22mm x 60mm 一部のノートPC 〜2TB
2280 22mm x 80mm 最も一般的、デスクトップ/ノート 〜4TB
22110 22mm x 110mm エンタープライズ、高容量サーバー 〜8TB

重要: 2280が現在最も普及しているサイズ。特に理由がなければ2280を選ぶのが無難だ。

4.2 キー(切り欠き)の種類

M.2モジュールには キー(Key) と呼ばれる切り欠きがある。これは物理的な「鍵穴」として機能し、対応しないモジュールが挿さらないようになっている。

【M.2キーの位置】

  端子部分を上から見た図

  ┌─────────────────────────────────────┐
  │■■■■■│    │■■■■■■■■■■■■■■■│    │■■■■│
  └─────────────────────────────────────┘
         ↑                            ↑
       B key                        M key
      (位置12-19)                  (位置59-66)

主要なキータイプ

キー 対応インターフェース レーン数 主な用途
B key SATA, PCIe x2 最大2 SATA SSD、一部のNVMe
M key SATA, PCIe x4 最大4 NVMe SSD(高速)
B+M key SATA, PCIe x2 最大2 汎用性重視のSATA SSD

キーの互換性マトリクス

モジュールのキー B keyスロット M keyスロット B+M keyスロット
B key ×
M key × ×
B+M key

実用上のポイント:

  • NVMe SSD(高速) は通常 M key のみ
  • SATA M.2 SSD は通常 B+M key(両方のスロットに挿さる)
  • M keyスロットにB+M keyのSATA SSDは物理的に挿さるが、スロットがSATAに対応していないと認識しない

4.3 ソケットタイプ

マザーボード側のM.2スロットには「ソケットタイプ」がある。

ソケット 対応インターフェース 主な用途
Socket 1 PCIe x1, USB 3.0 Wi-Fi、Bluetooth
Socket 2 SATA, PCIe x2, USB 3.0 SSD、WWAN
Socket 3 SATA, PCIe x4 高速SSD(NVMe)

デスクトップPCのSSD用スロットはほとんどがSocket 3。ただし、SATA対応の有無はマザーボードによって異なる。

4.4 PCIe世代と速度の関係

同じM.2 NVMe SSDでも、PCIeの世代によって最大速度が異なる。

PCIe世代 転送レート x4レーン帯域幅 NVMe SSD実測目安
PCIe 3.0 8 GT/s 約 4 GB/s 〜3,500 MB/s
PCIe 4.0 16 GT/s 約 8 GB/s 〜7,500 MB/s
PCIe 5.0 32 GT/s 約 16 GB/s 〜14,000 MB/s

後方互換性あり: PCIe 5.0対応SSDをPCIe 3.0スロットに挿しても動作する(ただし速度は3.0に制限)。

実際の速度比較

カテゴリ 代表的な製品 シーケンシャル読み取り
SATA SSD Samsung 870 EVO 約 560 MB/s
PCIe 3.0 NVMe Samsung 970 EVO Plus 約 3,500 MB/s
PCIe 4.0 NVMe Samsung 990 PRO 約 7,450 MB/s
PCIe 5.0 NVMe Crucial T700 約 12,400 MB/s

基本概念が理解できたところで、実際に互換性をチェックしてみよう。


5. 実践:M.2 SSD購入前の互換性チェック

5.1 チェックリスト

M.2 SSDを購入する前に、以下の5点を必ず確認しよう。

#!/usr/bin/env python3
"""
M.2 SSD互換性チェックリスト生成ツール
購入前に確認すべきポイントを整理する

使い方: python m2_compatibility_checker.py
"""

from dataclasses import dataclass
from typing import List, Optional
from enum import Enum


class M2Key(Enum):
    """M.2キータイプ"""
    B = "B key"
    M = "M key"
    B_M = "B+M key"


class Interface(Enum):
    """インターフェース"""
    SATA = "SATA"
    PCIE_3_X4 = "PCIe 3.0 x4"
    PCIE_4_X4 = "PCIe 4.0 x4"
    PCIE_5_X4 = "PCIe 5.0 x4"


@dataclass
class MotherboardSlot:
    """マザーボードのM.2スロット情報"""
    slot_name: str
    supported_sizes: List[str]
    supported_key: M2Key
    supported_interfaces: List[Interface]
    pcie_lanes_source: str  # "CPU" or "Chipset"


@dataclass
class M2SSD:
    """M.2 SSDの仕様"""
    model_name: str
    size: str  # e.g., "2280"
    key_type: M2Key
    interface: Interface
    sequential_read_mb: int
    sequential_write_mb: int


def check_physical_compatibility(slot: MotherboardSlot, ssd: M2SSD) -> tuple[bool, str]:
    """
    物理的な互換性をチェック
    
    Returns:
        (互換性あり, メッセージ)
    """
    # サイズチェック
    if ssd.size not in slot.supported_sizes:
        return False, f"サイズ非対応: SSDは{ssd.size}ですが、スロットは{slot.supported_sizes}のみ対応"
    
    # キーチェック
    key_compatible = False
    if slot.supported_key == M2Key.M:
        key_compatible = ssd.key_type in [M2Key.M, M2Key.B_M]
    elif slot.supported_key == M2Key.B:
        key_compatible = ssd.key_type in [M2Key.B, M2Key.B_M]
    elif slot.supported_key == M2Key.B_M:
        key_compatible = True  # すべてのキータイプに対応
    
    if not key_compatible:
        return False, f"キー非対応: SSDは{ssd.key_type.value}ですが、スロットは{slot.supported_key.value}のみ"
    
    return True, "物理的に挿入可能"


def check_interface_compatibility(slot: MotherboardSlot, ssd: M2SSD) -> tuple[bool, str]:
    """
    インターフェースの互換性をチェック
    
    Returns:
        (互換性あり, メッセージ)
    """
    # SATA SSDの場合
    if ssd.interface == Interface.SATA:
        if Interface.SATA in slot.supported_interfaces:
            return True, "SATA接続で動作します"
        else:
            return False, "このスロットはSATAに対応していません(NVMe専用スロット)"
    
    # NVMe SSDの場合
    pcie_interfaces = [i for i in slot.supported_interfaces if i != Interface.SATA]
    if not pcie_interfaces:
        return False, "このスロットはPCIe/NVMeに対応していません(SATA専用スロット)"
    
    # PCIe世代の確認
    slot_max_gen = max(pcie_interfaces, key=lambda x: x.value)
    
    if ssd.interface.value <= slot_max_gen.value:
        return True, f"最大速度で動作します({ssd.interface.value}"
    else:
        return True, f"速度が制限されます: SSDは{ssd.interface.value}ですが、スロットは{slot_max_gen.value}まで"


def generate_checklist():
    """互換性チェックリストを生成"""
    
    checklist = """
╔══════════════════════════════════════════════════════════════════╗
║           M.2 SSD 購入前 互換性チェックリスト                      ║
╠══════════════════════════════════════════════════════════════════╣
║                                                                  ║
║  □ 1. マザーボード/ノートPCの仕様を確認                           ║
║     ├─ M.2スロットの数                                          ║
║     ├─ 対応サイズ(2230/2242/2260/2280/22110)                   ║
║     ├─ 対応キー(B key / M key / B+M key)                       ║
║     └─ 対応インターフェース(SATA / PCIe 3.0 / 4.0 / 5.0)        ║
║                                                                  ║
║  □ 2. CPUの対応PCIe世代を確認                                    ║
║     ├─ Intel 12世代以降 → PCIe 5.0対応                          ║
║     ├─ Intel 10-11世代 → PCIe 4.0対応                           ║
║     ├─ AMD Ryzen 7000以降 → PCIe 5.0対応                        ║
║     └─ AMD Ryzen 3000-5000 → PCIe 4.0対応                       ║
║                                                                  ║
║  □ 3. PCIeレーンの接続先を確認                                   ║
║     ├─ CPU直結 → 最高速度                                       ║
║     └─ チップセット経由 → 速度低下の可能性                       ║
║                                                                  ║
║  □ 4. 物理的な干渉を確認                                         ║
║     ├─ ヒートシンク付きSSDの高さ                                 ║
║     ├─ グラフィックカードとの干渉                                ║
║     └─ マザーボード付属ヒートシンクの有無                        ║
║                                                                  ║
║  □ 5. 用途に合った速度を選択                                     ║
║     ├─ 一般用途 → PCIe 3.0で十分                                ║
║     ├─ ゲーム → PCIe 4.0推奨                                    ║
║     └─ 動画編集/AI → PCIe 4.0以上推奨                           ║
║                                                                  ║
╚══════════════════════════════════════════════════════════════════╝
"""
    return checklist


def main():
    # サンプル: マザーボードスロットの定義
    motherboard_slot = MotherboardSlot(
        slot_name="M2_1",
        supported_sizes=["2242", "2260", "2280"],
        supported_key=M2Key.M,
        supported_interfaces=[Interface.PCIE_4_X4],  # NVMe専用スロット
        pcie_lanes_source="CPU"
    )
    
    # サンプル: SSDの定義
    test_ssds = [
        M2SSD("Samsung 870 EVO (M.2)", "2280", M2Key.B_M, Interface.SATA, 560, 530),
        M2SSD("Samsung 990 PRO", "2280", M2Key.M, Interface.PCIE_4_X4, 7450, 6900),
        M2SSD("WD Black SN770", "2280", M2Key.M, Interface.PCIE_4_X4, 5150, 4900),
    ]
    
    print(generate_checklist())
    print("\n" + "=" * 70)
    print(f"スロット: {motherboard_slot.slot_name}")
    print(f"  対応サイズ: {motherboard_slot.supported_sizes}")
    print(f"  対応キー: {motherboard_slot.supported_key.value}")
    print(f"  対応インターフェース: {[i.value for i in motherboard_slot.supported_interfaces]}")
    print("=" * 70)
    
    for ssd in test_ssds:
        print(f"\n{ssd.model_name}")
        print(f"  サイズ: {ssd.size}, キー: {ssd.key_type.value}, インターフェース: {ssd.interface.value}")
        
        physical_ok, physical_msg = check_physical_compatibility(motherboard_slot, ssd)
        interface_ok, interface_msg = check_interface_compatibility(motherboard_slot, ssd)
        
        status = "○ 使用可能" if (physical_ok and interface_ok) else "× 使用不可"
        print(f"  結果: {status}")
        print(f"    物理互換性: {physical_msg}")
        print(f"    インターフェース: {interface_msg}")


if __name__ == "__main__":
    main()

5.2 環境別の構成ガイド

開発環境用(config.yaml)

# config.yaml - 開発環境(デスクトップPC)向け推奨構成
environment: development

# 用途: コーディング、コンパイル、仮想環境
storage_config:
  # システムドライブ(OS + 開発ツール)
  system_drive:
    role: "OS + IDE + Docker"
    recommended_type: "NVMe PCIe 4.0"
    recommended_size: "2280"
    capacity: "1TB"
    reason: "IDEの起動速度、Dockerイメージのロード速度に影響"
  
  # データドライブ(プロジェクト、ソースコード)
  data_drive:
    role: "Projects + Source Code + Git repos"
    recommended_type: "NVMe PCIe 3.0 or 4.0"
    recommended_size: "2280"
    capacity: "1TB-2TB"
    reason: "git操作、ビルド時のI/Oに影響"
  
  # バックアップドライブ(オプション)
  backup_drive:
    role: "Time Machine / Backups"
    recommended_type: "SATA SSD or HDD"
    reason: "コスト効率重視、速度は不要"

# 重視するポイント
priorities:
  - "ランダム読み書き性能(4K IOPS)"
  - "持続的書き込み性能(キャッシュ切れ後)"
  - "DRAMキャッシュ搭載"

本番環境用(config.production.yaml)

# config.production.yaml - 本番サーバー向け推奨構成
environment: production

# 用途: Webサーバー、データベース、ログ収集
storage_config:
  # OSドライブ
  os_drive:
    role: "OS + System logs"
    recommended_type: "NVMe PCIe 4.0 Enterprise"
    recommended_size: "2280"
    capacity: "480GB-960GB"
    endurance: "1+ DWPD"  # Drive Writes Per Day
    reason: "高いランダムI/O、ログ書き込み耐性"
  
  # データベースドライブ
  database_drive:
    role: "PostgreSQL / MySQL data"
    recommended_type: "NVMe PCIe 4.0 Enterprise"
    recommended_size: "2280 or 22110"
    capacity: "1TB-4TB"
    endurance: "3+ DWPD"
    features:
      - "Power Loss Protection (PLP)"
      - "End-to-End Data Protection"
    reason: "データ整合性、高IOPS、耐久性が最重要"
  
  # ログ/キャッシュドライブ
  cache_drive:
    role: "Redis / Memcached / Logs"
    recommended_type: "NVMe PCIe 3.0+"
    capacity: "240GB-480GB"
    reason: "書き込み量が多いがデータは揮発的"

# エンタープライズSSDの選定基準
selection_criteria:
  - "TBW(Total Bytes Written)の高さ"
  - "DWPD(Drive Writes Per Day)"
  - "Power Loss Protection対応"
  - "ファームウェアの安定性(リリースノート確認)"

テスト環境用(config.test.yaml)

# config.test.yaml - CI/CD・テスト環境向け推奨構成
environment: test

# 用途: 自動テスト、ビルド、一時的なデータ
storage_config:
  # 単一ドライブ構成(コスト重視)
  all_in_one:
    role: "OS + Build artifacts + Test data"
    recommended_type: "NVMe PCIe 3.0"  # コスト重視
    recommended_size: "2280"
    capacity: "512GB-1TB"
    reason: "テスト環境はコスト効率重視、データ永続性は不要"

# テスト環境の特性
characteristics:
  - "頻繁な書き換え(ビルド成果物)"
  - "データの永続性は不要"
  - "コスト効率が最優先"
  
# 推奨しない構成
avoid:
  - "高価なエンタープライズSSD"
  - "過剰な容量"
  - "PCIe 5.0(オーバースペック)"

5.3 よくあるエラーと対処法

症状 考えられる原因 対処法
SSDが物理的に挿さらない キータイプの不一致 SSDとスロットのキーを確認。M key SSDはB keyスロットに挿さらない
挿さるが認識しない インターフェースの不一致 SATA SSDをNVMe専用スロットに挿していないか確認
認識するが速度が出ない PCIe世代の制限 CPU/マザーボードの対応世代を確認。チップセット経由だと遅い場合も
BIOSで認識するがOSで見えない ドライバー不足 NVMeドライバーをインストール(Windows 7以前など)
起動ドライブとして使えない UEFI/Legacy設定 BIOSでUEFIモードを有効化、CSM無効化を試す
熱でスロットリングする 冷却不足 ヒートシンク装着、エアフロー改善

5.4 OS別のM.2 SSD確認コマンド

# Linux: M.2 NVMe SSDの確認
sudo nvme list
# 出力例:
# /dev/nvme0n1  Samsung 990 PRO 1TB  S6Z2NF0W123456  1.95 TB

# Linux: M.2 SATA SSDの確認(lsblkで確認)
lsblk -d -o NAME,ROTA,TRAN,SIZE,MODEL
# ROTA=0 かつ TRAN=sata なら SATA SSD

# Windows (PowerShell): 物理ディスク一覧
Get-PhysicalDisk | Select-Object FriendlyName, MediaType, BusType, Size

# Windows (PowerShell): NVMeドライブの詳細
Get-Disk | Where-Object {$_.BusType -eq 'NVMe'} | Format-List *

# macOS: ディスク情報
diskutil info /dev/disk0 | grep -E "Protocol|Device|Media"
system_profiler SPNVMeDataType  # NVMe専用

5.5 環境診断スクリプト

#!/usr/bin/env python3
"""
M.2スロット環境診断スクリプト
システムのストレージ構成を確認する

実行方法:
    Linux: sudo python check_m2_env.py
    Windows: python check_m2_env.py (管理者権限推奨)
"""

import subprocess
import platform
import sys
import re
from typing import Dict, List, Optional


def run_command(cmd: List[str]) -> Optional[str]:
    """コマンドを実行して出力を取得"""
    try:
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=10)
        return result.stdout
    except (FileNotFoundError, subprocess.TimeoutExpired):
        return None


def check_linux_nvme() -> List[Dict]:
    """LinuxでNVMe SSDを確認"""
    drives = []
    
    # nvme list コマンド
    output = run_command(['nvme', 'list', '-o', 'json'])
    if output:
        import json
        try:
            data = json.loads(output)
            for device in data.get('Devices', []):
                drives.append({
                    'device': device.get('DevicePath', 'Unknown'),
                    'model': device.get('ModelNumber', 'Unknown'),
                    'size': device.get('PhysicalSize', 0),
                    'type': 'NVMe'
                })
        except json.JSONDecodeError:
            pass
    
    return drives


def check_linux_sata() -> List[Dict]:
    """LinuxでSATA SSDを確認"""
    drives = []
    
    output = run_command(['lsblk', '-d', '-o', 'NAME,ROTA,TRAN,SIZE,MODEL', '-J'])
    if output:
        import json
        try:
            data = json.loads(output)
            for device in data.get('blockdevices', []):
                if device.get('rota') == '0' and device.get('tran') == 'sata':
                    drives.append({
                        'device': f"/dev/{device.get('name', 'Unknown')}",
                        'model': device.get('model', 'Unknown'),
                        'size': device.get('size', 'Unknown'),
                        'type': 'SATA SSD'
                    })
        except json.JSONDecodeError:
            pass
    
    return drives


def check_windows() -> List[Dict]:
    """WindowsでSSDを確認"""
    drives = []
    
    # PowerShellコマンド
    ps_cmd = 'Get-PhysicalDisk | Select-Object FriendlyName, MediaType, BusType, Size | ConvertTo-Json'
    output = run_command(['powershell', '-Command', ps_cmd])
    
    if output:
        import json
        try:
            # 単一ドライブの場合はリストに変換
            data = json.loads(output)
            if isinstance(data, dict):
                data = [data]
            
            for disk in data:
                if disk.get('MediaType') == 'SSD' or disk.get('MediaType') == 4:
                    bus_type = disk.get('BusType', 'Unknown')
                    if bus_type == 17 or bus_type == 'NVMe':
                        drive_type = 'NVMe'
                    elif bus_type == 11 or bus_type == 'SATA':
                        drive_type = 'SATA SSD'
                    else:
                        drive_type = f"SSD ({bus_type})"
                    
                    drives.append({
                        'device': disk.get('FriendlyName', 'Unknown'),
                        'model': disk.get('FriendlyName', 'Unknown'),
                        'size': disk.get('Size', 0),
                        'type': drive_type
                    })
        except json.JSONDecodeError:
            pass
    
    return drives


def format_size(size_bytes: int) -> str:
    """バイト数を人間が読みやすい形式に変換"""
    if size_bytes == 0:
        return "Unknown"
    
    for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
        if abs(size_bytes) < 1024.0:
            return f"{size_bytes:.2f} {unit}"
        size_bytes /= 1024.0
    
    return f"{size_bytes:.2f} PB"


def main():
    print("=" * 60)
    print("M.2スロット環境診断ツール")
    print("=" * 60)
    
    os_name = platform.system()
    print(f"\nOS: {os_name} {platform.release()}")
    print(f"Python: {sys.version.split()[0]}")
    
    drives = []
    
    if os_name == "Linux":
        print("\n【NVMe SSD】")
        nvme_drives = check_linux_nvme()
        if nvme_drives:
            for d in nvme_drives:
                print(f"  {d['device']}: {d['model']} ({format_size(d['size'])})")
        else:
            print("  NVMe SSDは検出されませんでした")
        
        print("\n【SATA SSD】")
        sata_drives = check_linux_sata()
        if sata_drives:
            for d in sata_drives:
                print(f"  {d['device']}: {d['model']} ({d['size']})")
        else:
            print("  SATA SSDは検出されませんでした")
        
        drives = nvme_drives + sata_drives
        
    elif os_name == "Windows":
        print("\n【検出されたSSD】")
        drives = check_windows()
        if drives:
            for d in drives:
                size_str = format_size(d['size']) if isinstance(d['size'], int) else d['size']
                print(f"  [{d['type']}] {d['model']} ({size_str})")
        else:
            print("  SSDは検出されませんでした")
            print("  ※ 管理者権限で実行すると検出できる場合があります")
    
    elif os_name == "Darwin":  # macOS
        print("\nmacOSでは system_profiler SPNVMeDataType を実行してください")
    
    print("\n" + "=" * 60)
    print("【推奨アクション】")
    
    if not drives:
        print("  - ストレージが検出されませんでした")
        print("  - 管理者/root権限で再実行してください")
    else:
        nvme_count = len([d for d in drives if d['type'] == 'NVMe'])
        sata_count = len([d for d in drives if 'SATA' in d['type']])
        
        if nvme_count > 0:
            print(f"  - NVMe SSD: {nvme_count}台検出")
            print("    → smartctlでS.M.A.R.T.情報を確認することを推奨")
        
        if sata_count > 0:
            print(f"  - SATA SSD: {sata_count}台検出")
            print("    → NVMe SSDへの換装を検討(速度向上)")


if __name__ == "__main__":
    main()

5.6 Docker設定(テスト用)

# Dockerfile - M.2 SSD互換性チェッカー
FROM python:3.11-slim

RUN apt-get update && \
    apt-get install -y nvme-cli smartmontools && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY m2_compatibility_checker.py .
COPY check_m2_env.py .

CMD ["python", "m2_compatibility_checker.py"]
# docker-compose.yml
version: '3.8'
services:
  m2-checker:
    build: .
    privileged: true  # NVMe CLIに必要
    volumes:
      - /dev:/dev:ro

実装方法がわかったので、次は具体的なユースケースを見ていこう。


6. ユースケース別ガイド

6.1 ユースケース1: 自作PC(ゲーミング/クリエイター)

想定読者: 初めてPCを自作する方、ゲームや動画編集をする方

推奨構成:

  • システムドライブ: PCIe 4.0 NVMe 1TB(2280)
  • ゲーム/データドライブ: PCIe 4.0 NVMe 2TB(2280)

購入前チェックポイント:

#!/usr/bin/env python3
"""
自作PC向け: M.2 SSD選定ガイド
"""

def gaming_pc_guide():
    """ゲーミングPC向けのSSD選定"""
    
    print("""
    ╔══════════════════════════════════════════════════════════════╗
    ║           ゲーミング/クリエイターPC向け M.2 SSD選定           ║
    ╠══════════════════════════════════════════════════════════════╣
    ║                                                              ║
    ║  【Step 1】マザーボードのM.2スロットを確認                    ║
    ║  ─────────────────────────────────────────────               ║
    ║  □ M.2スロットの数(通常2〜3個)                              ║
    ║  □ CPU直結スロットはどれか(マニュアル参照)                   ║
    ║  □ PCIe 4.0 / 5.0 対応か                                    ║
    ║  □ ヒートシンク付属か                                        ║
    ║                                                              ║
    ║  【Step 2】グラフィックカードとの干渉を確認                   ║
    ║  ─────────────────────────────────────────────               ║
    ║  □ GPUの下にM.2スロットがあるか                               ║
    ║  □ ヒートシンク付きSSDの高さは問題ないか                       ║
    ║  □ GPU装着後もSSD交換可能か                                   ║
    ║                                                              ║
    ║  【Step 3】用途に合ったSSDを選択                              ║
    ║  ─────────────────────────────────────────────               ║
    ║  ゲーム中心    → PCIe 4.0で十分(PS5互換も◎)                ║
    ║  4K動画編集   → PCIe 4.0以上推奨                             ║
    ║  3Dレンダリング → PCIe 5.0検討                                ║
    ║                                                              ║
    ║  【推奨製品例】                                                ║
    ║  ─────────────────────────────────────────────               ║
    ║  コスパ重視: WD Black SN770 (PCIe 4.0, DRAMレス)             ║
    ║  バランス型: Samsung 990 PRO (PCIe 4.0, DRAM搭載)            ║
    ║  最高性能: Crucial T700 (PCIe 5.0)                          ║
    ║                                                              ║
    ╚══════════════════════════════════════════════════════════════╝
    """)


if __name__ == "__main__":
    gaming_pc_guide()

6.2 ユースケース2: ノートPC換装

想定読者: ノートPCのSSDを交換したい方、容量不足に悩む方

注意点: ノートPCは機種によって制約が多い

#!/usr/bin/env python3
"""
ノートPC向け: M.2 SSD換装ガイド
"""

def laptop_upgrade_guide():
    """ノートPC換装時の注意点"""
    
    print("""
    ╔══════════════════════════════════════════════════════════════╗
    ║              ノートPC M.2 SSD換装ガイド                       ║
    ╠══════════════════════════════════════════════════════════════╣
    ║                                                              ║
    ║  【事前確認】絶対に確認すべきこと                             ║
    ║  ─────────────────────────────────────────────               ║
    ║  □ 分解可能か(保証が切れる可能性)                           ║
    ║  □ M.2スロットがあるか(はんだ付けの場合は交換不可)          ║
    ║  □ 対応サイズ(2230/2242/2280)                              ║
    ║  □ 対応インターフェース(SATA専用/NVMe対応)                  ║
    ║                                                              ║
    ║  【機種別の傾向】                                             ║
    ║  ─────────────────────────────────────────────               ║
    ║  ThinkPad      → 2280対応が多い、交換しやすい                ║
    ║  MacBook       → はんだ付け(交換不可、2016年以降)           ║
    ║  Surface Pro   → 2230のみ対応が多い                          ║
    ║  Steam Deck    → 2230のみ対応                                ║
    ║  Dell XPS      → 機種により2230/2280                         ║
    ║  HP Spectre    → 薄型モデルは2242が多い                      ║
    ║                                                              ║
    ║  【換装手順】                                                 ║
    ║  ─────────────────────────────────────────────               ║
    ║  1. バッテリーを完全放電(安全のため)                        ║
    ║  2. 既存SSDのクローンを作成                                  ║
    ║  3. 静電気対策をして作業                                     ║
    ║  4. 新SSDを装着、ネジを適切なトルクで締める                   ║
    ║  5. BIOS/UEFIで認識を確認                                    ║
    ║  6. OSをクローンから復元 or 新規インストール                  ║
    ║                                                              ║
    ║  【よくある失敗】                                             ║
    ║  ─────────────────────────────────────────────               ║
    ║  × 2280を買ったが2230しか入らなかった                        ║
    ║  × NVMe SSDを買ったがSATA専用スロットだった                   ║
    ║  × ヒートシンク付きSSDで蓋が閉まらない                       ║
    ║  × クローンせずに換装して環境を失った                        ║
    ║                                                              ║
    ╚══════════════════════════════════════════════════════════════╝
    """)


if __name__ == "__main__":
    laptop_upgrade_guide()

6.3 ユースケース3: サーバー/NAS増設

想定読者: 自宅サーバーやNASを運用している方、データセンターエンジニア

考慮すべきポイント: 耐久性、発熱、冗長性

#!/usr/bin/env python3
"""
サーバー/NAS向け: M.2 SSD選定ガイド
"""

def server_guide():
    """サーバー向けのSSD選定"""
    
    print("""
    ╔══════════════════════════════════════════════════════════════╗
    ║             サーバー/NAS向け M.2 SSD選定ガイド                ║
    ╠══════════════════════════════════════════════════════════════╣
    ║                                                              ║
    ║  【コンシューマ vs エンタープライズ】                         ║
    ║  ─────────────────────────────────────────────               ║
    ║                                                              ║
    ║  コンシューマSSD(例: Samsung 990 PRO)                       ║
    ║    ├─ DWPD: 0.3〜0.6(1日あたり書き換え回数)                 ║
    ║    ├─ TBW: 600TB(1TB モデル)                               ║
    ║    ├─ 電源断保護: なし                                       ║
    ║    └─ 用途: 軽量ワークロード、キャッシュ、読み取り中心        ║
    ║                                                              ║
    ║  エンタープライズSSD(例: Samsung PM9A3)                     ║
    ║    ├─ DWPD: 1〜3(1日あたり書き換え回数)                     ║
    ║    ├─ TBW: 数千TB                                            ║
    ║    ├─ 電源断保護: あり(PLP)                                 ║
    ║    └─ 用途: データベース、高頻度書き込み                      ║
    ║                                                              ║
    ║  【NASでのM.2活用パターン】                                   ║
    ║  ─────────────────────────────────────────────               ║
    ║  1. SSDキャッシュ(読み取り高速化)                           ║
    ║     → コンシューマSSDでOK、読み取りメイン                    ║
    ║                                                              ║
    ║  2. SSDキャッシュ(読み書き高速化)                           ║
    ║     → エンタープライズSSD推奨、書き込み耐性必要              ║
    ║                                                              ║
    ║  3. SSDのみのストレージプール                                 ║
    ║     → エンタープライズSSD + RAID構成必須                     ║
    ║                                                              ║
    ║  【発熱対策】                                                 ║
    ║  ─────────────────────────────────────────────               ║
    ║  □ NASケース内のエアフローを確保                              ║
    ║  □ ヒートシンク装着(高さ制限に注意)                         ║
    ║  □ 24時間稼働なら温度監視必須                                 ║
    ║                                                              ║
    ╚══════════════════════════════════════════════════════════════╝
    """)
    
    # エンタープライズSSDの選定基準
    print("""
    【エンタープライズSSD選定基準】
    
    | 項目 | 最低要件 | 推奨 |
    |-----|---------|------|
    | DWPD | 1以上 | 3以上 |
    | PLP(電源断保護) | あり | あり |
    | 耐久性認証 | JEDEC | JESD218A |
    | ファームウェア | 安定版 | 長期サポート |
    """)


if __name__ == "__main__":
    server_guide()

ユースケースを把握できたところで、この先の学習パスを確認しよう。


7. 学習ロードマップ

この記事を読んだ後、次のステップとして以下をおすすめする。

初級者向け(まずはここから)

  1. 自分のPCのM.2スロットを確認する

    • マザーボードのマニュアルを読む
    • 実際にPCを開けてスロットを確認
  2. CrystalDiskInfoでSSDの状態を確認

    • CrystalDiskInfoをインストール
    • 現在のSSDの健康状態、接続方式を確認

中級者向け(実践に進む)

  1. ベンチマークで性能を測定

    • CrystalDiskMarkでシーケンシャル/ランダム速度を測定
    • 自分のSSDがカタログスペック通りの速度か確認
  2. S.M.A.R.T.情報の読み方を学ぶ

上級者向け(さらに深く)

  1. PCI Express規格を深堀り

  2. NVMe規格の内部構造を理解


8. まとめ

この記事では、M.2スロットについて以下を解説した:

  1. M.2はフォームファクタ: 「形状」と「インターフェース」は別概念
  2. キー(切り欠き)の重要性: B key、M key、B+M keyで互換性が決まる
  3. サイズの命名規則: 2280 = 幅22mm x 長さ80mm
  4. SATA vs NVMe: 同じM.2でも速度が10倍以上違う
  5. PCIe世代: 3.0 → 4.0 → 5.0で倍々に高速化

私の所感

M.2は「統一規格」を目指して作られたはずなのに、結果的に非常にややこしい規格になってしまった。SATA/PCIe/キー/サイズ/世代...覚えることが多すぎる。

しかし、一度理解してしまえば怖くない。購入前に以下の5点を確認すれば、ほぼ間違いは防げる:

  1. スロットの対応サイズ(2280か2230か)
  2. スロットのキータイプ(M keyかB+M keyか)
  3. スロットの対応インターフェース(SATA対応か、NVMe専用か)
  4. CPUのPCIe対応世代(Gen3/4/5)
  5. 物理的な干渉(ヒートシンク高さ、GPUとの位置関係)

特に「NVMe SSDをSATA専用スロットに挿して認識しない」というトラブルが非常に多い。物理的に挿さってしまうB+M key SSDと、NVMe専用のM keyスロットの組み合わせには注意しよう。


参考文献

関連記事

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?