LIVA ZのLinux OSを内蔵SSDに丸ごとお引越し

# はじめに

小型PC LIVA Z (N4200)にインストールしているLinux OSを、拡張スロットに取り付けたSSDに丸ごと引越し出来たので、その手順を本記事にまとめます。

# OS引越しの経緯

LIVA Z (N4200)を2018年2月頃に購入して5年ほど使っています。OSはLinux(Debian)です。

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

デフォルトで利用できるストレージが32GB（規格はeMMC）でかなり少なく、容量をすぐに使い切ってしまった状態でした。そこでSSDの拡張スロット（M.2 TYPE 2242,SATAをサポート）に下記の128GB SSDを購入して容量逼迫を何とか防いできました。

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

ところがそれでも何かと不便が出てきたので「いっそのこと拡張SSDにOSを丸ごと引っ越そう！」と思い立ちます。[こちら](https://qiita.com/showchan33/items/e423467c50950013cdf8)の記事で新しく512GBのSSDを購入して引っ越しを試みましたが、筆者の知識が足りずに見事に失敗...。今回はその失敗から学び(?)、見事にOS引越しに成功しました。

# やりたいこと

現在、以下の3つのストレージがある状態です。
* (1) eMMC 32GB
    * LIVAに最初から付いているストレージ。OSもここに格納
* (2) SSD SATA 128GB (M.2 TYPE 2242) 
    * 拡張スロットに取り付けているSSDストレージ
* (3) SSD PCIe 512GB (M.2 TYPE 2242) 
    * [前回記事](https://qiita.com/showchan33/items/e423467c50950013cdf8)でOSの引越し先として購入したSSD（LIVAの拡張スロットの接続規格はSATAだったが、こちらはPCIeだったため取り付けても認識しないことが判明...）

実際の写真で見ると、(1)~(3)のストレージが以下のように接続されています。今後３つのストレージに言及する場合はこのまま番号つきの名前を使います。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/838d7b6a-c799-be4c-8e79-364f2c6b044d.jpeg">

[前回記事](https://qiita.com/showchan33/items/e423467c50950013cdf8)の最終状態が「(1)eMMC 32GB」と「(3)SSD PCIe 512GB」のディスクに使いたいデータ（およびOS）が格納されている状態なので、今回はそれを「(2)SSD SATA 128GB」に移行していきます。その際、単純に引越しするだけではSSDからOSを起動することができないので、作業過程で**SSDにブートローダーのインストール**を行います。（前回はこの認識が無かったためにOS丸ごと引越しに失敗しました...）

# 作業概要

必要な作業を表にしてみます。（こうして見ると手数が多い...）

| 番号 | 対象ディスク | 作業内容 | 作業時に使うOS |
| --- | --- | --- | --- |
| 1 | (2)SSD SATA 128GB | 既存のファイルシステム削除 | インストール済みのOS |
| 2 | (2)SSD SATA 128GB | パーティションを2つ作成 | インストール済みのOS |
| 3 | (1)~(3)全て | (1)(3)のデータを(2)に移行 | Ubuntu Live USB |
| 4 | (2)SSD SATA 128GB | ブートローダーのインストール | Ubuntu Live USB |
| 5 | (2)SSD SATA 128GB | (2)の``/etc/fstab``のマウントポイントのUUID修正 | Ubuntu Live USB |
| 6 | (2)SSD SATA 128GB | ブートできるかの確認 | 移行先OS |
| 7 | (1)eMMC 32GB | ファイルシステム削除 | 移行先OS |

## 補足

* 「(2)SSD SATA 128GB」に作る2つのパーティションは以下です
    * EFIシステムパーティション
        * ブートローダーをインストールするためのパーティション
        * PC起動時は**UEFIを利用（BIOSではないので注意！）**
    * ルートパーティション
        * ルートディレクトリ(``/``)配下のファイルを格納するパーティション
* データ移行やブートローダーをインストールする作業は、予めUSBハードディスクにインストールしたUbuntu Live USB経由で行います。

それでは各作業の詳細を見ていきます。

# 手順詳細

## 手順1 : 「(2)SSD SATA 128GB」から既存のファイルシステム削除

ファイルシステム削除には``wipefs``コマンドを使います。``lsblk``コマンドで確認すると、128GBのSSDは ``/dev/sda``として認識されており、パーティション分けはしていませんでした。そこで以下のコマンドでファイルシステムを削除します。

```
sudo wipefs -a /dev/sda
```

:::note alert
**上記コマンドは非常に危険なので単純コピペで実行しないでください！** 引数の``/dev/sda``の部分はご自身の環境に合わせて設定いただくようお願いいたします。
:::

## 手順2 : 「(2)SSD SATA 128GB」に2つのパーティションを作成

ファイルシステムの削除が出来たので、「EFIシステムパーティション」と「ルートパーティション」を順番に作っていきます。パーティションを作るツールはいくつかありますが、今回は``parted``を使います。

パーティションを作る前に、パーティション形式をGPTに指定するコマンドを実行します。

:::note info
パーティション形式（正確な呼び名がわからない...）はMBR,GPT等があり、[こちら](https://milestone-of-se.nesuke.com/sv-basic/architecture/mbr-gpt/)記事によると今回使うUEFIではどちらでも対応していそうなので、MBRでもOKなのかもしれません。
:::

```
$ sudo parted /dev/sda
(出力略)
(parted) mklabel gpt
(parted) print
Model: ATA TS128GMTS400S (scsi)
Disk /dev/sda: 128GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start  End  Size  File system  Name  Flags
```

続いて「EFIシステムパーティション」を作ります。
NameとFlagsの指定は任意でいいのかもしれませんが、念のためよく使われているものを設定します。
```
(parted) mkpart "EFI System Partition" fat32 1MiB 512MiB
(parted) set 1 boot on
(parted) set 1 esp on
(parted) print
Model: ATA TS128GMTS400S (scsi)
Disk /dev/sda: 128GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name                  Flags
 1      1049kB  537MB  536MB  fat32        EFI System Partition  boot, esp
```
さらに「ルートパーティション」を作り、最後にquitでpartedから抜けます。
```
(parted) mkpart primary ext4 512MiB 100%
(parted) print
Model: ATA TS128GMTS400S (scsi)
Disk /dev/sda: 128GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name                  Flags
 1      1049kB  537MB  536MB  fat32        EFI System Partition  boot, esp
 2      537MB   128GB  127GB  ext4         primary
(parted) quit
```
パーティションを作っただけでファイルシステムはできていないので、最後に2つのパーティションをフォーマットします。
```
sudo mkfs.fat -F32 /dev/sda1
sudo mkfs -t ext4 /dev/sda2
```

## 手順3 : (1)(3)のデータを「(2)SSD SATA 128GB」に移行

移行先の(2)のSSDは準備できたので、(1)(3)のデータを移行していきます。
移行時に使うOSは本体のOSではなく、予めUSBハードディスクにインストールしたUbuntu Live USBから起動したUbuntu OSを利用します。Ubuntu Live USBのインストールと起動の方法に関しては[こちらの記事](https://qiita.com/showchan33/items/e423467c50950013cdf8#%E7%A7%BB%E8%A1%8C%E4%BD%9C%E6%A5%AD%E7%94%A8%E3%81%AEubuntuos%E3%82%92%E6%BA%96%E5%82%99)等をご参照ください。

Ubuntu起動後``lsblk``コマンドで確認すると、各デバイスが次のように認識されていました。

### 移行元
* /dev/mmcblk0p2 : (1) eMMC 32GB
    * OSの/直下のデータを格納
* /dev/sdc : (3) SSD 512GB
    * 容量が大きいディレクトリを別途格納し、bindマウントして使っている
### 移行先
* /dev/sdb : (2) SSD 128GB
    * 移行のための準備済み

[前回記事](https://qiita.com/showchan33/items/e423467c50950013cdf8#%E5%90%84%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%8B%E3%82%89%E6%96%B0%E3%81%97%E3%81%84ssd%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%A7%BB%E8%A1%8C)から移行元と移行先が変わっただけでやっていることは同じですが、以下の手順で移行していきます。


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

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

``/``直下のデータはそのままコピー
```
rsync -ahv /mnt/src1/ /mnt/dst/
```
bindマウントして使っていたディレクトリは以下コマンドでマウント元とマウント先の対応を確認して、一つ一つrsyncします。ここではもともと拡張SSDのボリュームは ``/mnt/ssd`` にマウントされていたものとします。
```
# cat /mnt/src1/etc/fstab | grep bind
/mnt/ssd/home /home none defaults,bind 0 0
/mnt/ssd/opt /opt none defaults,bind 0 0
/mnt/ssd/var /var none defaults,bind 0 0
```
確認したら``/home``,``/opt``,``/var``がbindマウントされていたため、rsyncで各々コピーします。
```
rsync -ahv /mnt/src2/home/ /mnt/dst/home/
rsync -ahv /mnt/src2/opt/ /mnt/dst/opt/
rsync -ahv /mnt/src2/var/ /mnt/dst/var/
```

これで``/``配下の全データを「(2) SSD 128GB」に移行できました。

## 手順4 : ブートローダーのインストール

続いて「(2) SSD 128GB」に、GRUBのブートローダーをインストールします。

### ``/mnt/dst``にchrootする

インストールの際に、現状``/mnt/dst``でマウントされている移行先ディスクのディレクトリをルート``/``に変更する必要があります。後ほど出てきますが``chroot``コマンドを使うとこれを実現できます。
その前の準備として、本体側の一部ディレクトリを ``/mnt/dst``にbindマウントしておく必要があります。これはGRUBの各コマンドでブートローダーをインストールする際に、``/dev``ディレクトリを介してデバイスにアクセスする必要がある、等の事情によるものです（ChatGPTからの回答ですが...）。

```
mount --bind /dev /mnt/dst/dev
mount --bind /dev/pts /mnt/dst/dev/pts
mount --bind /proc /mnt/dst/proc
mount --bind /sys /mnt/dst/sys
mount --bind /run /mnt/dst/run # 不要かもしれない → 必要！（23/08/05確認）
```

:::note info
``/run`` ディレクトリは[こちらの記事](https://guminote.sakura.ne.jp/archives/316)だとbindマウントされていましたが、[別の情報](https://askubuntu.com/questions/1262733/install-grub-on-mounted-filesystem)だとマウントされていなかったため、要不要が判断できていない状態です。
**23/08/05追記**
試しに ``/run``へbindマウントしなかったところ``update-grub``に失敗したのでマウントしていた方が良さそうです。[参考情報](https://www.claudiokuenzler.com/blog/1029/warning-device-dev-not-initialized-in-udev-database-chroot-rescue-mode)
:::

bindマウントできたら、``chroot``コマンドで``/mnt/dst``が``/``になるようにします。

```
chroot /mnt/dst
```
### GRUBのコマンドでブートローダーをインストール

準備が整ったので、ブートローダーをインストールします。
**23/08/05追記 ``/boot/efi``を「EFIシステムパーティション」に事前にマウントする記述が抜けており追記しましたm(_ _)m**
```
# mount /dev/sdb1 /boot/efi
# grub-install --efi-directory=/boot/efi
Installing for x86_64-efi platform.
Installation finished. No error reported.
```
続いて``update-grub``でカーネルをブートローダーに紐づけます。出力から``/boot``ディレクトリに格納されているカーネルを認識しているのがわかります。
```
# update-grub
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-5.4.246-0504246-generic
Found initrd image: /boot/initrd.img-5.4.246-0504246-generic
Found linux image: /boot/vmlinuz-4.19.0-25-amd64
Found initrd image: /boot/initrd.img-4.19.0-25-amd64
Found linux image: /boot/vmlinuz-4.19.0-24-amd64
Found initrd image: /boot/initrd.img-4.19.0-24-amd64
Found linux image: /boot/vmlinuz-4.19.0-20-amd64
Found initrd image: /boot/initrd.img-4.19.0-20-amd64
Found linux image: /boot/vmlinuz-4.9.0-8-amd64
Found initrd image: /boot/initrd.img-4.9.0-8-amd64
Found linux image: /boot/vmlinuz-4.9.0-3-amd64
Found initrd image: /boot/initrd.img-4.9.0-3-amd64
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Found Debian GNU/Linux 10 (buster) on /dev/mmcblk0p2
done
```
インストールが終わったら、``/mnt/dst``にchrootしている状態から抜けます。
```
umount /boot/efi
exit
```

## 手順5 : ``/etc/fstab``のマウントポイントのUUID修正

「(2) SSD 128GB」に移行すると、パーティションのUUIDが移行前とは別のものが付与されます。新しく付与されたUUIDを確認し、マウントポイントを定義した``/etc/fstab``を更新します。
移行先のSSDは``/dev/sdb``として認識されているため、次のコマンドでUUIDを確認します。

EFIシステムパーティション
```
# blkid /dev/sdb1
/dev/sdb1: UUID="xxxx-yyyy" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID=...
```
ルートパーティション
```
# blkid /dev/sdb2
/dev/sdb2: UUID="xxxxxxxx-yyyy-..." TYPE="ext4" PARTLABEL="primary" PARTUUID=...
```

``/mnt/dst/etc/fstab``で、``/boot/efi``と``/``のマウントポイントを記載している行に、上記コマンドで出力されたUUIDを反映します。

:::note warn
**移行先(``/mnt/dst``)のfstabを編集する必要があるのでご注意ください！**
:::

```text:/mnt/dst/etc/fstab
...
# ↓反映
UUID=xxxxxxxx-yyyy-... /               ext4    errors=remount-ro 0       1
...
# ↓反映
UUID=xxxx-yyyy  /boot/efi       vfat    umask=0077      0       1
...
```

以上で Ubuntu Live USBでの作業は完了です。
マウント解除など後片付けしてからシャットダウンします。
```
umount /mnt/dst/dev
umount /mnt/dst/dev/pts
umount /mnt/dst/proc
umount /mnt/dst/sys
umount /mnt/dst/run
umount /mnt/dst
umount /mnt/src2
umount /mnt/src1
rmdir /mnt/src1 /mnt/src2 /mnt/dst
shutdown now
```

## 手順6 : 移行先ディスクでブートできるかの確認

PCの電源を入れ、Deleteキーを押しBIOS画面を呼び出します。ブートのメニューを見ると、現状は図のようにハードディスクからのブートが無効になっているはずなので、ハードディスクからブートできるように設定を変更します。

<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/f5c47fc9-0fb6-6b44-dd8a-e7dbf043ab70.jpeg">

その後終了タブに移動して「変更を保存して終了」を選択して再起動させた後、再度Deleteキー連打してBIOS画面に入ります。
再び終了タブに移動して一番下の「ブートオーバーライド」を見て、下のように「P1: TS128GMTS400S」と記載されたOSが追加されているのを確認します。

（なぜか2つ表示されているのは謎...。LIVAにはブートセクタらしきパーティションが2つあるため？また1番目と4番目に"ubuntu"と"Debian"と書かれているのも謎ですが、こちらは移行前のOSを表しており通常は同じ名前になるはずです）

<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/da6ad48e-3fc0-1bcf-efc0-e3f9b7b1f749.jpeg">

こちらを選択してOSが起動したら成功です！

起動後に以下のように、OS含めて移行後のディスクに格納されて動いていることを確認できます。
```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev             5.8G     0  5.8G    0% /dev
tmpfs            1.2G  117M  1.1G   10% /run
/dev/sda2        117G   66G   46G   60% /
tmpfs            5.8G     0  5.8G    0% /dev/shm
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            5.8G     0  5.8G    0% /sys/fs/cgroup
/dev/sda1        510M  5.8M  505M    2% /boot/efi
tmpfs            1.2G  3.5M  1.2G    1% /run/user/1000
```

## 手順7 : 「(1)eMMC 32GB」のファイルシステム削除

上記の状態だと再起動した場合に移行前のOSが起動されてしまうため、移行前のディスクのファイルシステムを削除します。
移行前ディスクで「EFIシステムパーティション」は ``/dev/mmcblk0p1``、「ルートパーティション」は``/dev/mmcblk0p2``に相当していたので、下記コマンドで消していきます。（ちゃんと記録を取っていなくてうろ覚えなので間違っている可能性はあります）

```
sudo wipefs -a /dev/mmcblk0p1
sudo wipefs -a /dev/mmcblk0p2
```

:::note alert
**``wipefs``コマンドは非常に危険なので慎重に実行してください！**
:::

```
$ sudo parted /dev/mmcblk0
GNU Parted 3.2
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) rm 1
(parted) rm 2
(parted) quit
```

この後再起動し、何も操作せずに移行後のOSが起動すれば完了です！
```
sudo reboot now
```