【RaspberryPi】ddコマンドより高速!更にCLI上でSDカードのバックアップを簡単に行う

USBメモリからのブートを試しているときに、X環境のSD Card Copierを使用していましたが、流石にそのためだけにX環境にするものちょっとどうだろと思っていました。コンソールから使えるといいのにな~と。それならddコマンドをつかえばいいじゃんというのが一般論なのですが、以前一度コマンドの使い方を間違えてしまって、メモリを破壊してしまったことがありそれ以降ddコマンド恐怖症になってしまいました。

そこで色々検索していると、以下のエントリに良さそうな情報が!

qiita.com

f:id:ueponx:20200602202155p:plain

rpi-cloneというアプリケーションがあってRaspberryPiのSDカードのイメージを指定したブロックデバイスにコピーしてくれるというものです。GitHubのページは以下になります。使い方も簡単なので便利そう。

github.com

rpi-cloneをインストールする

GitHubのページにも記載がありますが、以下のようにすればインストールができます。

$ git clone https://github.com/billw2/rpi-clone.git
$ cd rpi-clone
$ sudo cp rpi-clone rpi-clone-setup /usr/local/sbin

基本的にはアプリケーションのファイルをコピーするだけなのでそこまで大きな負担もない感じですね。

rpi-cloneの使用方法

rpi-cloneは引数にコピー先のブロックデバイスを指定することになります。使用するUSBストレージを確認するには以下のようにlsblkコマンドで確認を行います。

$ lsblk

lsblk 実行結果

 $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1   15G  0 disk 
├─sda1        8:1    1  256M  0 part 
└─sda2        8:2    1 14.7G  0 part 
mmcblk0     179:0    0 14.5G  0 disk 
├─mmcblk0p1 179:1    0  256M  0 part /boot
└─mmcblk0p2 179:2    0 14.2G  0 part /

この例では/dev/sdaとしてUSBストレージが認識されているのでrpi-cloneにも/dev/sdaを指定することになります。実行時の指定は/dev/sda/dev/を除いたsdaを指定します。

rpi-cloneはroot権限が必要になるのでsudoと組み合わせて実行を行ってください。

rpi-clone 実行結果

$ sudo rpi-clone sda

Booted disk: mmcblk0 15.5GB                Destination disk: sda 16.0GB
---------------------------------------------------------------------------
Part      Size    FS     Label           Part   Size    FS     Label
1 /boot   256.0M  fat32  --              1      256.0M  fat32  --
2 root     14.2G  ext4   rootfs          2       14.7G  ext4   rootfs
---------------------------------------------------------------------------
== SYNC mmcblk0 file systems to sda ==
/boot                 (50.5M used)   : SYNC to sda1 (256.0M size)
/                     (2.9G used)    : SYNC to sda2 (14.7G size)
---------------------------------------------------------------------------
Run setup script       : no.
Verbose mode           : no.
-----------------------:

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
  => rsync /boot/ /mnt/clone/boot  ...

Editing /mnt/clone/boot/cmdline.txt PARTUUID to use ea7d04d6
Editing /mnt/clone/etc/fstab PARTUUID to use ea7d04d6
===============================
Done with clone to /dev/sda
   Start - 18:53:27    End - 18:56:39    Elapsed Time - 3:12

Cloned partitions are mounted on /mnt/clone for inspection or customizing. 

Hit Enter when ready to unmount the /dev/sda partitions ...
  unmounting /mnt/clone/boot
  unmounting /mnt/clone
===============================

実行すると、書き込み先のファイルが消えるので再度確認があります。処理がOKであればyesとして問題ありません。 実行時の出力を見る限りrsyncコマンドを使用してSDカードメモリ内のファイルのバックアップを行っているようです。この感じだと、差異のあるファイル分しか書き込みを行わないので、時間の短縮ができます。また、パーティション処理も個別に行っているのでサイズ違いのメディアでも問題なくバックアップができるのもメリットです。

実行が終わるとUSBストレージデバイスはアンマウントされ、バックアップが完了です。rsyncによる同期なのでファイル内容に差異が少ない場合にはスキップされ、さらに使用したのがUSB3.0対応のUSBメモリなので高速に終わりました。全く違う場合には時間はかかりますのでご注意ください。

なおRaspberryPi3B(3B+)はバックアップしたUSBでそのまま起動可能ですが、RaspberryPi 4BはUSB起動はできません。USB起動が正式対応されればrpi-clone側が対応する可能性は高そうですね

おわりに

これでX環境でなくてもSDカードのバックアップが短時間でとれるようになりました。昔はイメージファイルでバックアップをとっていましたがこちらのほうが微妙にSDカードのサイズが違っていても楽にバックアップができるので便利です。もう少しバックアップをマメにやってみようかな。

関連

uepon.hatenadiary.com

uepon.hatenadiary.com