ラズパイにはいろいろな環境を構築して1年ほど安定稼働しています。

何も問題が無いので、いままでバックアップの対策を全く考えていませんでした。

SDカードは寿命があり突然死するので、データが吹っ飛んだことを考えると再構築とか気が重いです・・・

ですのでバックアップをしましょう。

2パターン紹介します(^^)(動作は同じです)

環境

  • Raspberry Pi 3B+
  • OS : Raspbian stretch9.3(lite版なのでデスクトップは無しでCUIのみですが、後からデスクトップを入れました)

バックアップ(クローン)手段 2パターン

バックアップ(クローン)と書きましたが、今回紹介する方法はSDカードを新たにもう一枚用意して、そちらにクローンを作成する方法です。

クローンですので、そのまま差し替えればブートします。

SDカードが死んでも入れ替えればいいので楽ですね(^^)

2パターンというのは、ざっくりGUI(デスクトップ)かCUI(ターミナル)の違いです。

以下2つです。

  • SD Card Copier
    • GUI動作
    • 視覚的にわかりやすい
  • rpi-clone ←私はこれを利用
    • CUI動作
    • cronで定期動作可能

当初はSD Card Copierしか知らず、デスクトップ環境を導入してまでやりましたが、rpi-cloneで同じことができるので、今はrpi-cloneだけ使用しています。

また、毎回GUIでコピーするのはダルいので、毎夜1時にrpi-cloneをcronで定期実行しています。

これでSDカード突然死の恐怖から開放されました!

また、これらのソフトはSDカードの容量はクローン先が小さくても大丈夫です。(もちろん入り切ることが前提ですが)

つまり、クローン元が32GBでも、10GBしか使っていなければ、クローン先SDカード容量は16GBでも良いということです。(使っている部分のクローンを作るため)

Windowsなどで行おうとすると同じ容量でないと弾かれますので、手持ちの幅が広がるメリットですね。

とは言いつつ、私はクローン元も先も32GBで同じ容量にしています。(手持ちであったことと、Home Assistantのデータが今後肥大していく想定だからです)

また、これらは起動中のシステムのクローンを作れるのでラズパイの電源を落とす必要はありません。

それでは、導入など紹介します(^^)

共通して必要なもの

  • クローンを作るSDカード
  • USB接続のSDカードリーダー

クローン先のSDカードはUSB-SDカードリーダーでラズパイにUSB接続するのが楽です。

Amazonなどで探せば、数百円で手に入ると思います。

小型のものが扱いやすいです(^^)

ちなみに私はこれを使ってます。

SD Card Copierでバックアップ(クローン作成)

まず、USB-SDカードリーダでクローン先のSDカードをラズパイに接続します。

SDカードマウントの確認

どこにマウントしたかを確認が必要なので、以下を実行します。

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 29.8G 0 disk 
├─sda1 8:1 1 41.8M 0 part 
└─sda2 8:2 1 29.8G 0 part 
mmcblk0 179:0 0 29.8G 0 disk 
├─mmcblk0p1 179:1 0 41.8M 0 part /boot
└─mmcblk0p2 179:2 0 29.8G 0 part /

/dev/sdaにマウントしたことがわかりました。これは各々の環境で異なりますので確認してみて下さい。

SD Card Copierを起動する

次に、SD Card Copierを開きます。元々デスクトップ環境を導入していれば、デスクトップの左上のラズパイマークから Accessories → SD Card Copier があります。

SD Card Copierが無かったら?

上でも書きましたが、私はlite版のRasbianを入れていた関係上、デスクトップがありませんでしたのでまずデスクトップを導入しました。

しかし、デスクトップだけでは、SD Card Copierが出てきませんでした。(おそらくlite版なので)

そこで、以下を実行し、SD Card Copierを導入しました。

$ sudo apt-get install piclone

実行後は無事SD Card Copierが表示されました。

起動すると、Copy From Device と Copy To Device が選択できますので、選択してstartするだけの楽ちんです。

画像だとcopy元は/dev/mmcblk0(今起動しているシステム)、コピー先が先程$ lsblkで確認した/dev/sda(USB-SDカードリーダで接続したSDカード)となっています。

ちなみに、この画像ではiPadのVNCアプリ VNC Viewerでラズパイに接続しています。

「全部消えるけどいい?」なので、Yesで進みます。

待ちます。

Copying partition 2 of 2…が全然進みませんでしたが、容量が大きいためだと思いますので焦らず待ちます。これが終了したら完了です(^^)

rpi-cloneとcronで毎夜1時に定期バックアップ(クローン作成)

次はrpi-cloneを紹介します(^^)

rpi-cloneの導入

まず、rpi-cloneを導入します。以下を実行して下さい。

$ git clone https://github.com/billw2/rpi-clone.git

rpi-cloneはgithubで公開されていますので、そこからインストールします。(よくあるapt-get instal ・・・・ではインストールできません!)

githubはこちら↓

もし、gitが使えなくて弾かれたら、以下を実行してgitをインストールしてから再度実行します。

$ sudo apt-get install git

カレントディレクトリをrpi-cloneに移動します。

$ cd rpi-clone

/usr/local/sbinにコピーします。

$ sudo cp rpi-clone rpi-clone-setup /usr/local/sbin

一応、SDカードのマウント場所を再度確認します。

/dev/sdaであることがわかりました。

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 29.8G 0 disk 
├─sda1 8:1 1 41.8M 0 part 
└─sda2 8:2 1 29.8G 0 part 
mmcblk0 179:0 0 29.8G 0 disk 
├─mmcblk0p1 179:1 0 41.8M 0 part /boot
└─mmcblk0p2 179:2 0 29.8G 0 part /

rpi-cloneでクローン作成を開始する

準備ができましたので、クローン作成を開始します。以下を実行して下さい。

何度も言ってしまいますが、sdaかどうかはご自身の環境で確認して下さい。

$ sudo rpi-clone sda

実行すると、「Ok to proceed with the clone?」=クローンを進めていい? と聞かれますので yes で進めます。

Booted disk: mmcblk0 32.0GB                Destination disk: sda 32.0GB

---------------------------------------------------------------------------
Part Size FS Label Part Size FS Label
1 /boot 41.5M fat32 -- 1 41.5M fat16 --
2 root 29.8G ext4 rootfs 2 29.8G ext4 rootfs
---------------------------------------------------------------------------
== SYNC mmcblk0 file systems to sda ==
/boot (21.5M used) : SYNC to sda1 (41.5M size)
/ (7.6G used) : SYNC to sda2 (29.8G 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 ...

sda2が終わると続いてsda1のクローンを作成します。

また暫く待つと、クローンが終わりますので、unmountを促すメッセージが出ます。

enterを押してunmountしたら完了です(^^)

Mounting /dev/sda1 on /mnt/clone/boot

=> rsync /boot/ /mnt/clone/boot ...

Editing /mnt/clone/boot/cmdline.txt PARTUUID to use 0a08c3a0
Editing /mnt/clone/etc/fstab PARTUUID to use 0a08c3a0
===============================
Done with clone to /dev/sda
Start - 21:07:42 End - 21:16:29 Elapsed Time - 8:47

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
===============================

私の環境では32GB(使用容量が実質7.6GBくらい)で9分くらい(上記のElapsed Time 8:47)かかりました。

試しにもう一度行いました。

差分バックアップなので、2回目は短時間で済むと思ったのですが、同じく9分くらいで変わりませんでした。

cronで毎夜1時に定期実行する

動作確認ができたので、今度はcronに登録して定期実行してみます。

cronについては、以前再起動することについて記事を書いてますので合わせてご確認いただければ理解が深まると思います。

crontabへの登録

私は毎夜1時に実行しているので、同じように設定してみます。

crontabを開きます。

$ sudo crontab -e

以下を記載します。

00 3 * * * /sbin/reboot
00 1 * * * sudo bash rpi-clone sda -q

私の場合は再起動もcronで実行しているので、rebootが書いてありますが、rpi-cloneに関しては下の行だけで大丈夫です。

実行する項目が複数ある場合は、上記のように複数行に渡って記載すればOKです。

rpi-cloneには、先程にはなかったオプション -q が付いています。

これはquiet modeで、実行に関して何も通知を出さないというオプションです。(yesなどを求められない)

定期実行するのに、yesの入力待ちで止まっていたら困りますからね。

他にもオプションはありますが、-u , -U あたりが -q と似ています。

他のオプションは $ sudo rpi-clone で確認できます(^^)

$ sudo rpi-clone

.
.
. 
-u - unattended clone if not initializing. No confirmations asked,
but abort if disk needs initializing or on error.
-U - unattended even if initializing. No confirmations asked,
but abort only on errors.
-q - quiet mode, no output unless errors or initializing. Implies -u.
.
.
.

-qオプションの場合は、no output unless initializingとありますので、もしかしたら初回だったら弾かれてしまうかもしれません。私の場合、すでに手動でrpi-cloneを実行してからのcron登録なので、初回ではないので問題なかったのかもしれません。(ごめんなさい、未確認です)

crontabの確認

crontabに登録できたかチェックしてみます。以下を実行します。

$ sudo crontab -l

ちなみに、sudo をつけないと以下のように「無いよ」と言われます。

$ crontab -l

no crontab for ***

これはcrontabはユーザごとに作成されるためです。sudoで実行すればroot権限でcrontabが作成されます。「無いよ」と言われたらチェックしてみて下さい(^^)

動作ログ確認

さて、ちゃんとバックアップが作成されたか確認してみます。

毎夜なので、すぐに確認はできませんが、数日分をまとめて確認してみました。

rpi-clone.log

rpi-cloneは以下にlogを吐いてくれます。catで確認してみます。

$ cat /var/log/rpi-clone.log

logを見ると、毎夜実行されているようです。1時ではなく1時10分くらいなのは、クローンが終わった時間を示しているのだと思います。※pihost3はhost名なのでそれぞれの環境で違います。

これは手動で実行したlogも残ります。

2020-01-09 01:10  pihost3 rpi-clone : clone to sda (rootfs)

2020-01-10 01:09 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-11 01:08 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-12 01:10 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-13 01:10 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-14 01:09 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-15 01:09 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-16 01:09 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-17 01:09 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-18 01:09 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-19 01:08 pihost3 rpi-clone : clone to sda (rootfs)
2020-01-20 01:11 pihost3 rpi-clone : clone to sda (rootfs)

cron.log

一応、cronもちゃんと動いているかcronのlogも確認してみます(cronが動いていることは明白ですがね笑)

rpi-clon.logと同じく、/var/log下にあります。catで確認してみます。

$ cat /var/log/cron.log

.
.
.
Jan 20 01:00:01 pihost3 CRON[16462]: (root) CMD (sudo bash rpi-clone sda -q)
.
.
.

1/20 1時0分1秒に記載があるのでcronで実行されてそうですね。

cronの動作も確認できました(^^)

これで、より安心してラズパイを運用できます。

以上です(^^)

参考サイト