Loading...

2023-12-07(木) 15:00

🥧 Raspberry PiでSDカードにインストールしたUbuntuをHDDにクローンして移行する

RaspberryPiUbuntu
Raspberry Pi用にSDカードにインストールして動かしていたUbuntu 22.04を丸ごと新しく外付けしたHDDにクローンし、さらにそのHDDからブートできるように移行する手順を解説します。

目次

前提と注意事項

以下が前提と注意事項になります。

  • Raspberry Pi 4 Model B 8GB RAM を使用しています。
  • Raspberry Pi 用に使っていた SD カードにインストールしている Ubuntu は 22.04 です。
  • この記事では、遭遇したエラーやなぜそのコマンドを実行したかについて詳しく解説していません。
  • 必ずバックアップを取得してから作業を行ってください。それぞれの環境によって異なる要素が多いため、この記事の作業によって現在動いているものが全く動かなくなる可能性が高いです。
  • この記事では、SD カードのバックアッ作成に macOS を使用しています。

この記事のゴール

SD カードにインストールした Ubuntu22.04 で動いている Raspberry Pi を、HDD にクローンした Ubuntu をブートして移行することがこの記事のゴールです。
なお、同じように USB 接続 SSD でも同じ手順で移行できると思います。

作業の流れ

以下の順番で作業を行います。

  • SD カードのバックアップを作成する
  • rpi-eeprom を使ってブートローダーをアップデートする
  • raspi-config を使ってブートオーダーを変更する
  • HDD にクローンする

SD カードのバックアップを作成する

まずはじめに SD カードにインストールした Ubuntu をバックアップします。ここでは macOS での作業を前提とします。 ターミナルを開いてdiskutil listコマンドを実行して現在のディスク状況を確認します。

ターミナル
diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:             Apple_APFS_ISC Container disk1         524.3 MB   disk0s1
   2:                 Apple_APFS Container disk3         994.7 GB   disk0s2
   3:        Apple_APFS_Recovery Container disk2         5.4 GB     disk0s3
 
/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +994.7 GB   disk3
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            13.4 GB    disk3s1
   2:              APFS Snapshot com.apple.os.update-... 13.4 GB    disk3s1s1
   3:                APFS Volume Preboot                 11.2 GB    disk3s2
   4:                APFS Volume Recovery                1.8 GB     disk3s3
   5:                APFS Volume Data                    935.9 GB   disk3s5
   6:                APFS Volume VM                      24.6 KB    disk3s6
 
/dev/disk4 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        +17.1 GB    disk4
   1:                 Apple_APFS Container disk5         17.1 GB    disk4s1
 
/dev/disk5 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +17.1 GB    disk5
                                 Physical Store disk4s1
   1:                APFS Volume iOS 17.0.1 21A342 Si... 16.6 GB    disk5s1
 
/dev/disk6 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        +1.0 TB     disk6
   1:                        EFI EFI                     209.7 MB   disk6s1
   2:                 Apple_APFS Container disk7         1.0 TB     disk6s2
 
/dev/disk7 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +1.0 TB     disk7
                                 Physical Store disk6s2
   1:                APFS Volume myuserのMacBook P...  952.6 GB   disk7s1
 
/dev/disk8 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *128.2 GB   disk8
   1:             Windows_FAT_32 system-boot             268.4 MB   disk8s1
   2:                      Linux                         127.9 GB   disk8s2
 

上記から、macOS に接続している SD カードのパスを確認します。上記の場合は、/dev/disk8が Raspberry Pi 用に使っていた SD カードになります。 この/dev/disk8ddコマンドを使って丸ごとコピー、バックアップします。

ddコマンドでSDカードの中身をコピーする
$ sudo dd if=/dev/disk8 of=pi_disk_backup status=progress

以下が実行結果です。SD カード内の容量にもよりますが、数 10GB 以上はあると思うのでそれなりに時間がかかります。

ddコマンドでSDカードの中身をコピーする
$ sudo dd if=/dev/disk8 of=raspberrypi_sd_backup status=progress
Password:
dd: pi_disk_backup: No space left on devicerred 1064.006s, 34 MB/s
 
70175625+0 records in
70175624+0 records out
35929919488 bytes transferred in 1064.175993 secs (33763137 bytes/sec)

上記を実行すると、現在のディレクトリにraspberrypi_sd_backupという名前で SD カードのコピーが作成されます。
もし万が一この後の作業で SD カードが壊れてしまった場合は、このコピーから復旧することができます。

rpi-eeprom を使ってブートローダーをアップデートする

これ以降は Raspberry Pi での作業になります。SD カードを Raspberry Pi に戻して通常通り SD カードから起動します。 起動後、aptコマンドを使ってrpi-eepromをインストールします。rpi-eepromは RaspberryPi 公式のツールで、ブートローダーをアップデートするためのものです。

ターミナル
$ sudo apt install rpi-eeprom

インストール後、以下でブートローダーをアップデートします。

ターミナル
$ sudo rpi-eeprom-update
BOOTLOADER: up to date
   CURRENT: 2023  1 11 水曜日 17:40:52 UTC (1673458852)
    LATEST: 2022  1 25 火曜日 14:30:41 UTC (1643121041)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader/default)
            Use raspi-config to change the release.
 
  VL805_FW: Using bootloader EEPROM
     VL805: up to date
   CURRENT: 000138c0
    LATEST: 000138c0

上記のようにBOOTLOADER: up to dateとなっている場合は最新のためアップデートしなくて OK です。
もし以下のようにBOOTLOADER: update availableとなっている場合は、利用可能なアップデートがあります。

ターミナル
$ sudo rpi-eeprom-update
BOOTLOADER: update available
   CURRENT: 2023  1 11 水曜日 17:40:52 UTC (1673458852)
    LATEST: 2022  1 25 火曜日 14:30:41 UTC (1643121041)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader/default)
            Use raspi-config to change the release.
 
  VL805_FW: Using bootloader EEPROM
     VL805: up to date
   CURRENT: 000138c0
    LATEST: 000138c0

BOOTLOADER: update availableとなっている場合は、以下を実行してブートローダーをアップデートします。

ターミナル
$ sudo rpi-eeprom-update -a

再度sudo rpi-eeprom-updateを実行してBOOTLOADER: up to dateとなることを確認してください。 以下がrpi-eepromの公式リポジトリです。

rpi-eeprom

This repository contains the scripts and pre-compiled binaries used to create the rpi-eeprom package which is used to update the Raspberry Pi 4 and Raspberry Pi 5 bootloaders EEPROM images.

github.com

raspi-config を使ってブートオーダーを変更する

Raspberry Pi が SD カードではなく、USB 接続した外付けの HDD から起動できるようにするためにブートオーダーを変更します。 そのためにraspi-configをインストールします。

ターミナル
$ sudo apt install raspi-config

このインストールにはそれなりに時間がかかります。 インストールが完了したら、以下でraspi-configを実行します。

ターミナル
$ sudo raspi-config

上記を実行すると、以下のような画面がターミナル内に表示されます。

raspi-configのdefault-userの指定

上記はraspi-configのデフォルトユーザーの指定です。それぞれのユーザー名が表示されていると思いますので特に問題なければそのままで Enter します。 続いて以下のように表示されるので、6 Advanced Optionsを選択して Enter を押下します。

raspi-configのadvanced-optionsの指定

次はA6 Boot Orderを選択して Enterを押下します。

raspi-configのboot-orderの指定

B2 USB Bootを選択して Enter

raspi-configのusb-bootの指定

以下のように表示されるのでOKで Enter します。

raspi-configでUSBがデフォルトになったことを確認する

以下のように最初の画面に戻るので、矢印キーで移動してFinishを選択して Enter を押下して終了します。

Finishで終了

最後に以下のように再起動するか確認されるため、Yesのまま Enter を押下して再起動してください。

再起動する

以上で USB 接続のドライブから起動できるようになり、ブートオーダーの変更が完了しました。

No EEPROM bin file found for version が出る場合

前節の手順で、B2 USB Bootを選択した場合に以下のようにNo EEPROM bin file found for version 2023-01-11というエラーが表示される場合があります。

No EEPROM bin file found for version 2023-01-11

OKを選択して Enter を押下すると以下も表示されると思います。

There was an error running option B2 USB Boot

このような場合は、再度sudo raspi-configを実行し、6 Advanced Optionsを選択して Enter を押下します。 続いてA7 Bootloader Versionを選択して Enter を押下します。

raspi-configのbootloader-versionの指定

E1 Latest Use the latest version boot ROM softwareを選択して Enter を押下します。

raspi-configのE1 Latest Use the latest version boot ROM softwareの指定

以下のように表示されるので、Yesを選択して Enter を押下します。

最新版のboot-rom選択完了

以下のように表示されて完了します。

boot romのリセット完了

raspi-configの最初の画面に戻るのでFinishを選択して Enter を押下し、再起動の確認が出たらYesで再起動してください。
再起動後、改めてraspi-configを実行して前節の作業を行ってみください。今度はNo EEPROM bin file found for versionが表示されずに完了できると思います。

HDD にクローンする

ブートオーダーを変更して再起動後、Raspberry Pi で以下を実行してクローン用のツールであるrpi-cloneを準備します。
以下のコマンドは、rpi-cloneの公式リポジトリにある手順に従っています。詳しくは公式リポジトリを見てみてください。

ターミナル
$ git clone https://github.com/billw2/rpi-clone.git
$ cd rpi-clone
$ sudo cp rpi-clone /usr/local/sbin/sys-clone
$ sudo cp rpi-clone-setup /usr/local/sbin/sys-clone-setup

続いてクローンする前にlsblkを使って外付けの HDD が認識されているか確認します。

ターミナル
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0     4K  1 loop /snap/bare/5
loop1         7:1    0  59.2M  1 loop /snap/core20/1977
loop2         7:2    0  59.3M  1 loop /snap/core20/2019
loop3         7:3    0  68.5M  1 loop /snap/core22/861
loop4         7:4    0  68.5M  1 loop /snap/core22/867
loop5         7:5    0 228.2M  1 loop /snap/firefox/3357
loop6         7:6    0 230.8M  1 loop /snap/firefox/3415
loop7         7:7    0   334M  1 loop /snap/gnome-3-38-2004/141
loop8         7:8    0   334M  1 loop /snap/gnome-3-38-2004/145
loop9         7:9    0 465.4M  1 loop /snap/gnome-42-2204/133
loop10        7:10   0 475.1M  1 loop /snap/gnome-42-2204/143
loop11        7:11   0  91.7M  1 loop /snap/gtk-common-themes/1535
loop12        7:12   0  44.4M  1 loop /snap/snap-store/639
loop13        7:13   0  35.5M  1 loop /snap/snapd/20102
loop14        7:14   0  11.7M  1 loop /snap/snap-store/963
loop15        7:15   0  35.5M  1 loop /snap/snapd/20298
loop16        7:16   0   292K  1 loop /snap/snapd-desktop-integration/50
loop17        7:17   0   416K  1 loop /snap/snapd-desktop-integration/85
sda           8:0    0 465.8G  0 disk
├─sda1        8:1    0   260M  0 part
├─sda2        8:2    0    16M  0 part
├─sda3        8:3    0 464.8G  0 part
└─sda4        8:4    0   675M  0 part
mmcblk0     179:0    0 119.4G  0 disk
├─mmcblk0p1 179:1    0   256M  0 part /boot/firmware
└─mmcblk0p2 179:2    0 119.1G  0 part /var/snap/firefox/common/host-hunspell
 

上記のように、私の環境だとsdaに 500GB の HDD が認識されています。Raspberry Pi に USB 接続している HDD ディスクです。 以下のようにsys-cloneコマンドを使ってsdaにクローンを実行します。

ターミナル
$ sudo sys-clone sda

以下が実行結果です。

ターミナル
$ sudo sys-clone sda
 
Booted disk: mmcblk0 128.2GB               Destination disk: sda 500.1GB
---------------------------------------------------------------------------
Part               Size    FS     Label           Part   Size    FS     Label
1 /boot/firmware   256.0M  fat32  --              1      260.0M  fat32  --
2 root             119.1G  ext4   writable        2       16.0M  --     --
                                                  3      464.8G  --     --
                                                  4      675.0M  ntfs   --
---------------------------------------------------------------------------
== Initialize: IMAGE partition table - FS types conflict ==
1 /boot/firmware      (139.0M used)  : MKFS  SYNC to sda1
2 root                (71.5G used)   : RESIZE  MKFS  SYNC to sda2
---------------------------------------------------------------------------
Run setup script       : no.
Verbose mode           : no.
-----------------------:
** WARNING **          : All destination disk sda data will be overwritten!
-----------------------:
 
Initialize and clone to the destination disk sda?  (yes/no):

sys-cloneを実行すると、 Initialize and clone to the destination disk sda? (yes/no):と聞かれるので、yesと入力して Enter を押下します。 さらに今度は Optional destination ext type file system label (16 chars max):と聞かれるので、writableと入力して Enter を押下します。 ちなみに、ここのwritableは上記の 7 行目に表示されているファイルシステムがext4のパーティションのラベルと同じ値にしてください。
以下のように処理が開始されます。

ターミナル
$ sudo sys-clone sda
 
Booted disk: mmcblk0 128.2GB               Destination disk: sda 500.1GB
---------------------------------------------------------------------------
Part               Size    FS     Label           Part   Size    FS     Label
1 /boot/firmware   256.0M  fat32  --              1      260.0M  fat32  --
2 root             119.1G  ext4   writable        2       16.0M  --     --
                                                  3      464.8G  --     --
                                                  4      675.0M  ntfs   --
---------------------------------------------------------------------------
== Initialize: IMAGE partition table - FS types conflict ==
1 /boot/firmware      (139.0M used)  : MKFS  SYNC to sda1
2 root                (71.5G used)   : RESIZE  MKFS  SYNC to sda2
---------------------------------------------------------------------------
Run setup script       : no.
Verbose mode           : no.
-----------------------:
** WARNING **          : All destination disk sda data will be overwritten!
-----------------------:
 
Initialize and clone to the destination disk sda?  (yes/no): yes
Optional destination ext type file system label (16 chars max): writable
 
Initializing
  Imaging past partition 1 start.
  => dd if=/dev/mmcblk0 of=/dev/sda bs=1M count=5 ...
  Resizing destination disk last partition ...
    Resize success.
  Changing destination Disk ID ...
  => mkfs -t vfat -F 32  /dev/sda1 ...
  => mkfs -t ext4 -L writable /dev/sda2 ...
 

容量にもよりますが、完了までに1時間から数時間かかると思います。

最終的に以下のようにCloned partitions are mounted on /mnt/clone for inspection or customizing.と表示されて完了します。
最後に、Hit Enter when ready to unmount the /dev/sda partitions ...と表示されているので、適当なキーを押下して終了します。

ターミナル
Initializing
  Imaging past partition 1 start.
  => dd if=/dev/mmcblk0 of=/dev/sda bs=1M count=5 ...
  Resizing destination disk last partition ...
    Resize success.
  Changing destination Disk ID ...
  => mkfs -t vfat -F 32  /dev/sda1 ...
  => mkfs -t ext4 -L writable /dev/sda2 ...
 
Syncing file systems (can take a long time)
Syncing mounted partitions:
  Mounting /dev/sda2 on /mnt/clone
  => rsync // /mnt/clone with-root-excludes ...
  Mounting /dev/sda1 on /mnt/clone/boot/firmware
  => rsync /boot/firmware/ /mnt/clone/boot/firmware  ...
 
===============================
Done with clone to /dev/sda
   Start - 23:08:35    End - 23:56:02    Elapsed Time - 47:27
 
Cloned partitions are mounted on /mnt/clone for inspection or customizing.
 
Hit Enter when ready to unmount the /dev/sda partitions ...
 

以下のように表示されて完了します。

ターミナル
Hit Enter when ready to unmount the /dev/sda partitions ...
  unmounting /mnt/clone/boot/firmware
  unmounting /mnt/clone
===============================

以上でクローンが完了です。Raspberry Pi をシャットダウンし、SD カードを抜いた状態で起動してみてください。問題なく起動できれば完了です。

まとめ

Raspberry Pi で SD カードにインストールした Ubuntu を HDD にクローンして移行する手順を解説しました。