はじめに
ラズパイのSDカードが破損して起動しないトラブルを経験したので、バックアップをしてみました。その方法をまとめます。以下の記事を参考にしました。ペロペロ坊主さん https://zenn.dev/peroperofangzhu ありがとうございました。
Raspberry Pi 4BでUSB to USBクローン
前提条件
ハードウェア:Raspberry Pi 5
OS:最新の Raspberry Pi OS(Bookworm)
元 SD カード:オリジナルのブート済み SD
コピー先 SD / USB:29GB SD、ブート用にコピー作業
使用ツール:rpi-clone v0.4.x
作業環境:元 SD は Pi に挿入、コピー先 SD は USB 接続
注意点:
rpi-clone はパーティションコピー + 基本ファイル同期のみ。
USB ブート用に cmdline.txt と fstab の PARTUUID 修正が必須
(fstab は、手作業しなくても修正済みだった)
rpi-clone のインストール
以下の手順でインストールします。
sudo apt update
sudo apt install -y git
git clone https://github.com/billw2/rpi-clone.git
cd rpi-clone
sudo cp rpi-clone rpi-clone-setup /usr/local/sbin/
sudo apt install -y rsync dosfstools
コピー先SDの確認
以下で、コピー先のSDカードの情報を確認します。
lsblk -o NAME,SIZE,MODEL,MOUNTPOINT
以下が表示されます。mmcblk0 は現在起動しているラズパイのSDカードです。/ や /boot があります。sda はコピー先の SDカードです。サイズ違いOKです。
NAME SIZE MODEL MOUNTPOINT
loop0 2G
sda 29.1G STORAGE DEVICE
└─sda1 29.1G /media/pi/BC33-D781
mmcblk0 116.4G
├─mmcblk0p1 512M /boot/firmware
└─mmcblk0p2 115.9G / zram0 2G [SWAP]
クローン開始
rpi-clone を管理者で起動します。sda はコピー先のSDカードです。-f は強制モードで、コピー先ディスクを完全に消去して上書きします。
sudo rpi-clone sda -f
以下が表示されるので、yes を入力します。
内容は、コピー先の sda1 がマウントされているため、rpi-clone がアンマウントしていいかを確認しています。
Destination disk partition /dev/sda1 is mounted on /media/pi/BC33-D781. The clone cannot proceed unless it is unmounted. Do you want to unmount /media/pi/BC33-D781? (yes/no):
色々表示され、コピー先の sda を初期化してクローンを作っていいかをきかれるので、yes を入れます。
次に、コピー先にラベルをつけるか聞かれます。今回はつけないので、Enter を押下します。
ラベルつけたければ、16文字以内で入力します。
...
Initialize and clone to the destination disk sda? (yes/no): yes
Optional destination ext type file system label (16 chars max):
以下のように表示が続きます。途中の
Editing /mnt/clone/etc/fstab PARTUUID to use a22681fa
で、fstab は PARTUUID が新たな値に書き換えられていることがわかります。
最後に Enter 押下の指示がでます。そうすると、sda がアンマウントされます。
(ただし、ファイルマネージャー上はマウントされているようにみえます)
Initializing
Imaging past partition 1 start.
=> dd if=/dev/mmcblk0 of=/dev/sda bs=1M count=12 ...
Resizing destination disk last partition ...
Resize success.
Changing destination Disk ID ...
=> mkfs -t vfat -F 32 /dev/sda1 ...
=> mkfs -t ext4 /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 ...
Editing /mnt/clone/etc/fstab PARTUUID to use a22681fa
===============================
Done with clone to /dev/sda
Start - 09:19:22 End - 09:30:06 Elapsed Time - 10:44
Cloned partitions are mounted on /mnt/clone for inspection or customizing.
Hit Enter when ready to unmount the /dev/sda partitions ...
クローン終了後の手作業
アンマウントされた、/dev/sda1 および /mnt/clone-boot 、/mnt/clone-rootをマウントします。
sudo mount /dev/sda1 /mnt/clone-boot
しかし、/mnt/clone-boot という名のディレクトリであるマウントポイントが存在しないと表示されました。
mount: /mnt/clone-boot: mount point does not exist.t dmesg(1) may have more information after failed mount system call.
そこで、自分で作りました。そうしたら、マウントできました。
sudo mkdir -p /mnt/clone-boot
sudo mount /dev/sda1 /mnt/clone-boot
同様に、clone-root もやりました。
sudo mkdir -p /mnt/clone-root
sudo mount /dev/sda2 /mnt/clone-root
その結果、中身をみることができました。
ls /mnt/clone-boot
中身は以下の通りです。しかし、clone-boot にあるべき kernel8.img や cmdline.txt がありません。
そのため、このままでは起動できません。
clone-boot clone-root
そこで、元のSDカードからコピーします。以下の方法で、/mnt/clone-boot/ に必要なファイル群の kernel8.img、cmdline.txt、config.txt などが入ります。
sudo cp -r /boot/firmware/* /mnt/clone-boot/
sudo cp -r /boot/firmware/overlays /mnt/clone-boot/
確認します。kernel8.img、cmdline.txt、config.txt その他が入っていました。
ls /mnt/clone-boot
次に、/mnt/clone-boot/cmdline.txt の PARTUUID を a22681fa-02 に書き換えます。
sudo geany /mnt/clone-boot/cmdline.txt
config.txt は修正不要でしたが、確認だけします。
cat /mnt/clone-boot/config.txt
次に、clone-root の中身を確認します。
ls /mnt/clone-root
以下のように正常です。
bin dev home lost+found mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
参考記事では、/mnt/clone-root/etc/fstab を編集して、PARTUUID を a22681fa-01, a22681fa-02 に書き換えるとありましたが、すでに書き換わっていました。なので、確認だけです。
cat /mnt/clone-root/etc/fstab
修正すべき PARTUUID はクローン時に表示されますが、見落としていたら以下のように確認できます。
/dev/sda1 の PARTUUID は以下で確認できます(a22681fa-01)。
sudo blkid /dev/sda1
/dev/sda1: UUID="B144-2BF7" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="a22681fa-01"
/dev/sda2 の PARTUUID は以下で確認できます(a22681fa-02)。
sudo blkid /dev/sda2
/dev/sda2: UUID="86354c08-52c1-40e8-b0aa-8ddd22cb4941" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="a22681fa-02"
以上で作業は終了なので、コピー先のSDをアンマウントします。
sudo umount /mnt/clone-boot
sudo umount /mnt/clone-root
後は通常通りにシャットダウンして、コピー先のSDをラズパイに装着して起動するだけです。
起動後の確認をします。
lsblk
以下が表示されるはずです。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 2G 0 loop
mmcblk0 179:0 0 29.1G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 28.6G 0 part /
zram0 254:0 0 2G 0 disk [SWAP]
パーティションサイズと使用率を確認します。
df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 1.6G 15M 1.6G 1% /run
/dev/mmcblk0p2 28G 12G 15G 45%/
tmpfs df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 1.6G 15M 1.6G 1% /run
/dev/mmcblk0p2 28G 12G 15G 45% /
tmpfs 4.0G 16M 4.0G 1% /dev/shm
tmpfs 5.0M 80K 5.0M 2% /run/lock
tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
tmpfs 4.0G 256K 4.0G 1% /tmp
/dev/mmcblk0p1 511M 79M 433M 16% /boot/firmware
tmpfs 806M 320K 806M 1% /run/user/1000
tmpfs 1.0M 0 1.0M 0% /run/credentials/getty@tty1.service
おわりに
元のSDを壊さないように、慎重に作業しました。手作業箇所もポイントがわかれば、問題なさそうです。