外付けSSDで動かしているラズパイのデータ移行

今回は、現在動かしているラズパイの外付けのSSD(120GB)をHDD(500GB)に移行したので、備忘録として残しておきたいと思います。

# 環境
Raspberry Pi 4 Model B (4GB)
OS ：Raspbian GNU/Linux 10 (buster)
SSD：SanDisk 内蔵 2.5インチ SSD / SSD Plus 120GB
HDD：家に余ってたThinkPadに付いてた古いHDD(500GB)

# 参考
OSは違いますが、やり方としては前回の記事と大体同じです。

[Raspberry Pi 4でCentOS7を外付けSSDで動かす](https://qiita.com/reishisu/items/a0b12e7bcd096db2f292)

# 手順

## 外付けHDDのフォーマット

まずは、任意のOSでRaspberry Pi Imagerをダウンロードして移行先のHDDをフォーマットします。

[Raspberry Pi Downloads - Software for the Raspberry Pi](https://www.raspberrypi.org/downloads/)

## HDDを探す

フォーマットしたHDDをラズパイに繋いで、以下のコマンドで場所を見つけます。

```shell
fdisk -l
```
そしたら、既にSSDがsda1, sda2にマウントされているので、sdbかsdcにあると思います。
私は、sdcにありました。

```shell
(中略)
 
Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1        8192   532479   524288  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      532480 61157375 60624896 28.9G 83 Linux
 
 
Disk /dev/sda: 111.8 GiB, 120040980480 bytes, 234455040 sectors
Disk model: Tech
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2fe51e63
 
Device     Boot    Start       End   Sectors   Size Id Type
/dev/sda1           2048  12582911  12580864     6G 83 Linux
/dev/sda2       12582912 234455039 221872128 105.8G 83 Linux
 
 
Disk /dev/sdc: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Disk model: 00LPVX-08V0TT5
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x00000000
 
Device     Boot Start       End   Sectors   Size Id Type
/dev/sdc1        2048 976773119 976771072 465.8G  b W95 FAT32
```

## パーティションの作成を行う

前回と同様に、先頭から6GBをswap, 6GBから最後までをrootパーティションとします。

以下のコマンドで、パーティションの作成準備を行います。

```shell
parted /dev/sdc
```
そして、以下のコマンドで分割を行います。

```shell
(parted) mktable msdos
警告: いま存在している /dev/sda のディスクラベルは破壊され、このディスクの全データが失われます。続行しますか？
はい(Y)/Yes/いいえ(N)/No? y
(parted) mkpart primary ext4 0% 6G
(parted) mkpart primary ext4 6G 100%
```
分割したら、以下のコマンドでsdcがsdc1とsdc2に別れてることを確認します。

```shell
blkid
```

## swap領域のフォーマット
swapも同様に、以下のコマンドでフォーマットします。

```
mkswap -c /dev/sdc1
```

## ddコマンドでsda2をsdc2にコピー
ifとofの場所を間違えると全部消えることになるので、気をつけて実行しましょう。

```shell
dd if=/dev/sda2 of=/dev/sdc2 bs=300M status=progress
```

## コピーしたパーティションの修復を行う
念のため、以下のコマンドでsdc2パーティションの修復を行います。

```shell
e2fsck -f /dev/sdc2
```

## パーティションの拡張を行う
現状では、sda2でコピーした105GBの範囲しか使えないので、以下のコマンドで拡張します。

```shell
resize2fs /dev/sdc2
```

## UUIDを変更する
ddした直後は、sda2と同じUUIDになってしまっているので、以下のコマンドでsdc1, sdc2のUUIDを更新します。

```shell
tune2fs -U random /dev/sdc1
tune2fs -U random /dev/sdc2
```

## sdc1, sdc2のPARTUUIDを調べる

以下のコマンドで、それぞれのPARTUUIDを調べてメモします。(UUIDではないので注意)

```shell
blkid
```
私の場合だと、こんな感じになります。(sdc1=166038d6-01、sdc2=166038d6-02)

```shell
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="592B-C92C" TYPE="vfat" PARTUUID="b4eedfbc-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="706944a6-7d0f-4a45-9f8c-7fb07375e9f7" TYPE="ext4" PARTUUID="b4eedfbc-02"
/dev/sda1: UUID="9868f215-60fc-4cfb-bda8-acd2ccc51faa" TYPE="swap" PARTUUID="2fe51e63-01"
/dev/sda2: LABEL="rootfs" UUID="2ce08958-9dee-4938-908c-b78ce0138a3e" TYPE="ext4" PARTUUID="2fe51e63-02"
/dev/sdc1: UUID="0ceee9c8-65ad-4384-b6bc-eb6881b5c124" TYPE="swap" PARTUUID="166038d6-01"
/dev/sdc2: LABEL="rootfs" UUID="ab24a9e6-3c3e-463e-a398-c0346f1fcf8e" TYPE="ext4" PARTUUID="166038d6-02"
/dev/mmcblk0: PTUUID="b4eedfbc" PTTYPE="dos"
```

## HDDの変換アダプタの情報を調べる

移行元の変換アダプタを移行先に使いまわして利用するなら、ここは飛ばして大丈夫です！！

どれがベンダIDなのかとかは[前回](https://qiita.com/reishisu/items/a0b12e7bcd096db2f292#satausb%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B)の記事を参照。

```shell
lsusb
```

私のベンダIDとデバイスIDは、 174c:55aaでした。

## /boot/cmdline.txtの編集

移行元の変換アダプタを移行先に使いまわして利用するなら、ここも飛ばして大丈夫です！！

既にある、SSDの変換アダプタのベンダIDとデバイスIDを上で調べた、HDDの変換アダプタに変更します。(usb-storage.quirks=ベンダID:デバイスID:u)

```shell
usb-storage.quirks=174c:55aa:u
```
その続きに、あるrootパーティションをsdc2のPARTUUIDに変更します。

```shell
root=PARTUUID=166038d6-02
```
私の場合は、こんな感じになりました。

```shell
usb-storage.quirks=174c:55aa:u console=ttyAMA0,115200 console=tty1 root=PARTUUID=166038d6-02 rootfstype=ext4 elevator=deadline rootwait
```

## /mnt/etc/fstabの編集

まだ、マウントしてなければsdc2をマウントします。

```shell
mount /dev/sdc2 /mnt
```
そして、/mnt/etc/fstabのswapをsdc1, /をsdc2のPARTUUIDに変更します。
私の場合は、こんな感じになりました。

```shell
proc            /proc           proc    defaults          0       0
PARTUUID=b4eedfbc-01  /boot           vfat    defaults          0       2
PARTUUID=166038d6-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
PARTUUID=166038d6-01  swap swap    defaults,noatime 0 0
```
/bootはmicroSDなので、触らないように注意しましょう。

# 再起動
以上で、移行は完了です。
電源を切った後に、SSDを抜いて、電源を入れてちゃんと動くことを確認しましょう。

私の場合はHDDがボロボロすぎて初回の起動に3分近くかかってしまいました…