SDカードで動かしていたラズパイWebサーバをSSD(USBブート)に移行したときのメモ。以前にも同じようなことを書いていて、今回はデータコピーの方法が違うだけ。今回の手順のほうが楽かな。
Ubuntu での手順となっていますが、 Raspberry Pi OS でもほぼ同等の方法で実行できるかと思います。素人作業なので参考にする場合は自己責任でお願いいたします。
試した環境
Raspberry Pi 4 4GB Ubuntu 20.10
移行元: SDカード シリコンパワー microSD 64GB
移行先: ポータブルSSD: SanDisk SSD 480GB
移行前のディスクの情報を確認する
lsblk コマンドで現在のデバイスを確認します。
コンテナが動いているので、ループバックデバイス loopXX がたくさん見えてますが、mmcblk0 がSDカードです。
# 現在のブロックデバイスの状況
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 88.1M 1 loop /snap/core/11996
loop1 7:1 0 37.5M 1 loop /snap/snapd/14296
loop2 7:2 0 41.3M 1 loop /snap/certbot/1671
loop3 7:3 0 49M 1 loop /snap/core18/2252
loop4 7:4 0 57.4M 1 loop /snap/core20/1244
loop5 7:5 0 65.7M 1 loop /snap/lxd/22151
loop6 7:6 0 88.1M 1 loop /snap/core/11803
loop7 7:7 0 49M 1 loop /snap/core18/2248
loop8 7:8 0 40.4M 1 loop /snap/certbot/1583
loop10 7:10 0 36.5M 1 loop /snap/snapd/14063
loop11 7:11 0 57.5M 1 loop /snap/core20/1274
loop12 7:12 0 65.9M 1 loop /snap/lxd/22116
mmcblk0 179:0 0 58.9G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 58.7G 0 part /
# ループバックデバイスを非表示にするには -e 7 をつけて実行する
$ lsblk -e 7
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 58.9G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 58.7G 0 part /
移行先のディスクの情報を確認する
ラズパイにSSDを接続してもう一度確認。sda というデバイスが増えているのがわかります。(※一度ラズパイを動かすのに使ったSSDなので、パーティションが切られていますが、これらのデータは上書きされます。)
$ lsblk -e 7
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 447.1G 0 disk
├─sda1 8:1 0 256M 0 part
└─sda2 8:2 0 446.9G 0 part
mmcblk0 179:0 0 58.9G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 58.7G 0 part /
rpi-clone をいれて データをコピーする
SDカードからSSDにデータをコピーします。データのコピーには rpi-clone を使いました。公式の手順に従いインストールします。
$ git clone https://github.com/billw2/rpi-clone.git
$ cd rpi-clone
$ sudo cp rpi-clone rpi-clone-setup /usr/local/sbin
インストールしたらクローンを実行します。事前にデーモン等は止めておきましょう。
引数には 移行先 sda (SSD) を指定します。逆のパターン、SSDからSDカードにコピーする場合は、引数には mmcblk0 を指定します。
$ sudo rpi-clone sda
Booted disk: mmcblk0 63.3GB Destination disk: sda 480.1GB
---------------------------------------------------------------------------
Part Size FS Label Part Size FS Label
1 /boot/firmware 256.0M fat32 -- 1 256.0M fat32 --
2 root 58.7G ext4 writable 2 446.9G ext4 writable
---------------------------------------------------------------------------
== SYNC mmcblk0 file systems to sda ==
/boot/firmware (153.5M used) : SYNC to sda1 (256.0M size)
/ (10.0G used) : SYNC to sda2 (446.9G size)
---------------------------------------------------------------------------
Run setup script : no.
Verbose mode : no.
-----------------------:
# 実行してよいか? yes を入力
Ok to proceed with the clone? (yes/no): yes
# 実行中・・・
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 - 15:34:37 End - 15:45:35 Elapsed Time - 10:58
Cloned partitions are mounted on /mnt/clone for inspection or customizing.
# Enterキーを押して、sda をアンマウントして終了。
Hit Enter when ready to unmount the /dev/sda partitions ...
unmounting /mnt/clone/boot/firmware
unmounting /mnt/clone
===============================
SSDから起動するように設定する
念の為、ファームウェアのバージョン、ブートローダーの設定を確認します。
Ubuntu には、デフォルトで rpi-eeprom-update が入っていないので、コマンドがない場合は、インストールします。
# rpi-eeprom-update でファームウェアのバージョンを確認する。
# 古いファームウェアだとUSBドライブからのブートに対応していないものがある。
# rpi-eeprom-update コマンドがない場合は sudo apt install -y rpi-eeprom でインストールする
$ sudo rpi-eeprom-update
BCM2711 detected
Dedicated VL805 EEPROM detected
BOOTLOADER: up-to-date
CURRENT: 2020年 9月 3日 木曜日 12:11:43 UTC (1599135103)
LATEST: 2020年 9月 3日 木曜日 12:11:43 UTC (1599135103)
FW DIR: /lib/firmware/raspberrypi/bootloader/default
VL805: up-to-date
CURRENT: 000138a1
LATEST: 000138a1
rpi-eeprom-config コマンドで、SSD からブートするようになっているかを確認します。
# BOOT_ORDER の設定値を確認する
$ rpi-eeprom-config
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
TFTP_IP=
TFTP_PREFIX=0
BOOT_ORDER=0x1
SD_BOOT_MAX_RETRIES=3
NET_BOOT_MAX_RETRIES=5
[none]
FREEZE_VERSION=0
BOOT_ORDER=0x1 なので、この設定ではSDカードからしか起動しません。
公式サイトの設定値を参考にしました。SDカードが刺さっていても、USBドライブから優先的に起動させる場合は、0xf14(Try USB first, followed by SD then repeat) とすれば良さそうです。SDカードを優先させる場合は、0xf41 と設定します。
# BOOT_ORDER の値を変更する
$ env EDITOR=vi sudo -E rpi-eeprom-config --edit
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
TFTP_IP=
TFTP_PREFIX=0
BOOT_ORDER=0xf14 # この値を変更して保存。
SD_BOOT_MAX_RETRIES=3
NET_BOOT_MAX_RETRIES=5
[none]
FREEZE_VERSION=0
# 保存したらリブート
$ sudo reboot
再起動すると、USBドライブから起動するようになります。0xf41を設定した場合は、シャットダウン→SDカードを外して起動という手順になります。
Dockerで動かしていたWordpressやメールサーバーの移行も問題なく行えているようです。
コンテナの移行が面倒だったので、SDカードのまま動かしていましたが、この手順で簡単に移行できました🍣🐟
コメント