M.2の内蔵SSDを換装しようとしたが接続規格を間違えて失敗した話

# はじめに

この記事は、PCに内蔵されているM.2 TypeのSSDを**接続規格を意識せずに**換装しようとして失敗した話です。
結論から言うと「**SSDにはSATAとPCIeの2つの接続規格があり**、購入の際には自分の環境に合ったものを注意して選ぶ必要がある」ということです。

※もともとやりたかったのが「OSを丸ごとSSDに移行」だったので、途中主題からだいぶ外れた話も入ってきて筆者の備忘録のようになっていますがお許し願います。

# 内蔵SSDを換装したくなったきっかけ

自宅のPCの一つにLIVA Z (N4200)を使っています。2018年2月頃に購入しました。OSはLinux(Debian)を入れています。

https://www.links.co.jp/item/liva-z-n4200/

このPCはデフォルトで32GBのeMMCストレージを使えますがその容量ではすぐに足りない状況に...。幸いなことに「M.2 Type 2242のSSD（接続規格はSATA）」を取り付け可能な増設スロットがついていたので、以下の128GBのSSDを買って対応しました。（購入したのは2018年4月で当時7,980円）

https://kakaku.com/item/K0001018675/spec/

当時購入したSSDはLIVAに以下のように取り付けられています。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/44fc262f-c765-daa8-d43f-613526b8329b.jpeg">
増設した128GBのSSDに一部データを移行し、一時は本体32GBの容量逼迫状態は回避できていました。ところが追加でパッケージをインストールしたりDockerコンテナやKubernetesのPodを沢山作ったりすると、本体側のストレージはすぐに残り1GBを切ってしまいます...。その都度、容量を喰っている部分（``/var/lib/docker``とか``/var/lib/containerd``とか...）を[こちら](https://qiita.com/masato/items/e967e531e75101796c30)の記事を参考にして増設SSDに移し、bindマウントして何とか凌いできました。

だけどしばらく時間が経つとまた別のディレクトリの容量が肥大化するため、そこを増設SSDに移行してbindマウントが必要に...。「このやり方を続けるとbindマウントのパスが虫喰いのようにできてしまってあんまり良くないんじゃないかなあ」と思い始めました。

そこで「いっそのことOS全部M.2 Typeの増設SSD側に移しちゃえ！」という発想に至ります。このタイミングで、SSDも容量の大きいものを新たに買うことにしました。

やりたいことは以下のように、2つのストレージを新しく買うM.2 TypeのSSDの一つに集約することです。
```
本体32GBストレージ(eMMC)      ====> 新規購入SSD(M.2 Type 2242)
128GB SSD(M.2 Type 2242)  ====> 同上
```

:::note warn
「OSを丸ごと別のディスクに移す」のも実は上手くいかなかったりする（事実、筆者が現時点でうまくいっていない...）ので、実際に試すときは十分に調査の上で慎重に行ってください。
:::

# SSDとSSDケースの購入

構想実現に向けて、SSD本体および移行のために一時的に使うSSDのケースを以下のように購入しました。

#### SSD

型番 : TS512GMTE400S
概要 : M.2 Type 2242で512GBのSSD
購入価格 : 6,980円

https://kakaku.com/item/K0001511342/spec/

#### SSDケース

名称 : UGREEN M.2 SSD 外付けケース M.2 NVME/PCIE
概要 : M.2 TypeのSSDを外付けするためのケース
購入価格 : 2,339円

https://www.amazon.co.jp/UGREEN-10Gbps%E9%AB%98%E9%80%9F%E8%BB%A2%E9%80%81%E9%80%9F%E5%BA%A6-%E3%83%8F%E3%83%BC%E3%83%89%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%B1%E3%83%BC%E3%82%B9-2%E6%9C%AC%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E4%BB%98%E3%81%8D-%E4%BF%9D%E8%AD%B7%E3%83%A9%E3%83%90%E3%83%BC%E4%BB%98%E3%81%8D/dp/B09T97Z7DM/ref=asc_df_B09T97Z7DM/?tag=jpgo-22&linkCode=df0&hvadid=589002935012&hvpos=&hvnetw=g&hvrand=8481479800419558602&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009281&hvtargid=pla-1656640041031&psc=1

購入時点では全く気づいていませんでしたが両方とも**接続規格PCIeに対応**したもので、ここは運良く規格が合っていました。

# データ移行手順

若干省略して書いているので、この種の作業を初めてやる方には不足した内容になっている可能性があるのをご容赦ください。

## 新しいSSDが使えるようにするための準備

#### SSDケースに新規SSDをセットし、移行対象のLinux PCにUSB接続する

下図のようにSSDをSSDケースに挿し込んだ後、ケースの中に入れてPCにUSB接続します。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/adea6f1b-0122-8847-317c-641f5cc9ad0d.jpeg">
接続したらこんな感じになります。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/1333fc30-279a-978f-c66f-d0fd33524cdf.jpeg">

#### 接続後にデバイスとして認識されているかどうかを確認

``lsblk``で接続デバイスを確認可能です。繰り返しになりますが**新規購入したSSDとSSDケースが接続規格PCIeに対応したものだった**ので、問題なくデバイスを認識できています。

```
$ lsblk | grep ^sdb
sdb      8:48   0   477G  0 disk
```

#### デバイスをマウントできるようにフォーマット

移行前のファイルシステムがext4なので、それに合わせて``mkfs``コマンドでフォーマットします。
```
sudo mkfs -t ext4 /dev/sdb
```

このデバイスを``/etc/fstab``経由でマウントするにはボリュームのUUIDを利用するのが好ましいため、``blkid``で確認して忘れないようにメモしておきます。

```
$ sudo blkid /dev/sdb
/dev/sdb: UUID="xxxxxxxx-..." TYPE="ext4"
```

:::note warn
「OSを丸ごと引越し」するためには``parted``コマンドなどで「ブート用のパーティション」と「ルートディレクトリのパーティション」を別に作る必要があったのですが、筆者の知識不足でパーティションを作っていませんでした。「OS丸ごと引越し構想」はこの時点で脆くも崩れ始めます...。
:::


## 移行作業用のUbuntuOSを準備

移行対象OSがブートされている状態だとOSの丸ごと移行は不可能で、「移行作業用のUbuntuOS(Ubuntu Live USB)」をUSBハードディスク経由で起動して行う必要があります。

### Ubuntu Live USB作成に関する参考情報
* Ubuntuのisoファイルの取得
    * https://jp.ubuntu.com/download
* isoファイルからUbuntu Live USBを作成
    * https://www.archlinux.site/2018/03/linuxisoubuntulive-usb.html
    * 筆者は以下のコマンドで作成しました（``/dev/sdX``はUSBハードディスクがPCから認識されているデバイス名を記載）
        ```
        sudo dd if=ubuntu-22.04.2-desktop-amd64.iso \
                of=/dev/sdX bs=4M status=progress
        ```

## Ubuntu Live USB経由でOSを起動

移行作業はUbuntu Live USB経由でOSを起動させて行いたいのでその準備をします。
まずは移行対象PCの電源を切って、Ubuntu Live USBをインストールしたUSBハードディスクを接続します。再び電源を入れたらすかさず、BIOS画面に移行するためのキーを連打します。（LIVAの場合はDeleteキーがそれでした）

BIOS画面が表示されたらブートの順番を設定するメニューを探して、Ubuntu Live USBを接続したUSBハードディスクがOSとして起動するように設定を変更します。筆者の場合「ブートオプション#1」に「ハードディスク」が登録されていたので、下図のようにそこを無効にしたらUbuntu Live USBが起動するようになりました。

<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/e47cde90-8e71-9e12-fc7e-c616605ce7e0.jpeg">

Ubuntu起動後にGUIが表示され「Ubuntuを試す」「Ubuntuをインストール」の選択を求められますが、<font color="red">**必ず「Ubuntuを試す」を選択してください！**</font>

### 参考サイト

https://dailylife.pman-bros.com/ubuntu-usb-boot/


## 各ディスクから新しいSSDにデータを移行

Ubuntuを立ち上げ後``lsblk``コマンドで確認したら、各デバイスが次のように認識されていました。

#### 移行元
* /dev/mmcblk0p2 : eMMC 32GB
    * OSの``/``直下のデータを格納
* /dev/sdb : SSD 128GB
    * 容量が大きいディレクトリ（``/var/lib/docker``, ``/var/lib/containerd``等）を別途格納し、bindマウントして使っている

#### 移行先

* /dev/sdc : SSD 512GB
    * 新規購入したSSD。ext4にフォーマット済

上記のファイルにアクセスできるように、まずは各々マウントします。
```
$ sudo su -
# mkdir /mnt/src1 /mnt/src2 /mnt/dst
# mount /dev/mmcblk0p2 /mnt/src1
# mount /dev/sdb /mnt/src2
# mount /dev/sdc /mnt/dst
```

あとはrsyncでひたすらコピーしていきます。

``/``直下のデータはそのままコピー
```
# rsync -ahv /mnt/src1/ /mnt/dst/
```
bindマウントして使っていたディレクトリは以下コマンドでマウント元とマウント先の対応を確認して、一つ一つrsyncします。ここではもともと拡張SSDのボリュームは ``/mnt/ssd`` にマウントされていたものとします。
```
# cat /mnt/src1/etc/fstab | grep bind
/mnt/ssd/var/lib/docker /var/lib/docker none defaults,bind 0 0
/mnt/ssd/var/lib/containerd /var/lib/containerd none defaults,bind 0 0
...
```
一つ一つrsyncするコマンドは以下です。bind数が多いと実行コマンド数も増えるので若干ダルい部分です...。
```
# rsync -ahv /mnt/src2/var/lib/docker/ /mnt/dst/var/lib/docker/
# rsync -ahv /mnt/src2/var/lib/containerd/ /mnt/dst/var/lib/containerd/
...
```

これで``/``配下の全データを新規購入したSSDに移行できました。

最後に念のため移行用に作成したディレクトリを消して、Ubuntuをシャットダウンします。
```
# umount /mnt/dst
# umount /mnt/src2
# umount /mnt/src1
# rmdir /mnt/src1 /mnt/src2 /mnt/dst
# shutdown now
```

# SSDを換装するも失敗

上記手順で移行が完了したSSDをSSDケースから取り出して、LIVAのSSD拡張スロットに挿し込みます（もともと入っていたSSDは事前に取り出しておきます）。ご参考ですが、下図のように新しいSSDがセットされます。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/351d18a2-fb22-06f0-0f3f-1ee4abdf417f.jpeg">
この状態で、もう一度Ubuntu Live USB経由で起動して挿し込んだSSDが認識されるかを確認してみると、**なんと認識されないではないですか。ショック...**
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/0dd86deb-b44a-7d50-beed-7431c0050453.jpeg">
この時は原因がわからなかったのですが、[LIVA Z(N4200)の仕様](https://www.links.co.jp/item/liva-z-n4200-64g/)を見ると「M.2 2242 **SATA** 6Gb/s(**SATA**3.0)対応の拡張スロット」と書いてあります。だけどこの時に挿し込んだSSDの接続規格は**PCIe**でした。SATAは何となく聞いたことあったのですが、PCIeのような別の接続規格はがあるなんて露知らず、完全に失敗です...

結局今は苦肉の策で、新しく買ったSSDをSSDケース経由で外付けでつないで、今までと同じようにディスク容量の大きい領域は外付けSSDからbindマウントして使っています。使っているSSDの容量が128GBから512GBに増えたのはいいですが、今まで使っていたSSDは引き続き内蔵の拡張ユニットに居座り、新しいSSDは外付けでないと認識しないという不本意な結末となりました。いつかリベンジしたいw（[こちら](https://qiita.com/showchan33/items/0900a41bd1f1cb1c27cb)にリベンジした記事を書きました）
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/1333fc30-279a-978f-c66f-d0fd33524cdf.jpeg">

# まとめ

SSDにOSを丸ごとお引越ししたくて色々試みましたが、以下の認識に欠けていて見事に失敗してしまいました。

* **OSとして起動させたいディスクにはブート用のパーティションを作る必要あり**
    * OSを一からインストールする場合はこの辺勝手にやってくれるのであんまり気にしなくていいのですが、自分でカスタマイズしようとすると一気に敷居が上がる印象です
* **SSDの接続規格はSATAとPCIeの2つがあり購入時は注意すべし**
    * サイズの規格（mSATA, M.2など）があるのは気にしていたのですが、接続規格も複数あるのは盲点でした

本記事が何かのご参考になれば幸いです。