Raspberry Pi のバックアップ(2)

 このサーバに USB ハブをつなげ、そのハブにカードリーダを 4 個付けました。それぞれのカードリーダに内蔵させている MicroSD と同じ容量の MicroSD を付けました。そして、一つは月次、一つは週次、残りの2つは日次をローテーションさせてバックアップしようと思います。

USB2.0 カードリーダ

 Raspberry Pi 3B に付けるので、USB 2.0 対応のカードリーダです。他のRaspberry Pi でも使おうと思ったので 10 個買いました。Amazon で 1 個 326 円でした。

Transcend の MicroSD

 同じくAmazon で Transcend の 32GB の MicroSD も 10 個買いました。1 個 899 円でした。

MicroSD を刺す向き
奥まで刺したところ

  黄色いポッチは MicroSD のイジェクトです。

USB ハブ

 USB 2.0 のハブも 3 個買いました。1 個 498 円です。

 他にも HDMI コンバータや、GPiCASE, Raspberry Pi 4B(8GB) とかいろいろ買いました。後で記事にします。

 まず、4 つ全部、手動でコピーします。デバイスは sda 〜 sdd となります。バックアップ日次がわかるように /etc/backup_mark に日時を出力しておきます。

$ sudo bash -c "date > /etc/backup_mark"
$ sudo rpi-clone sda

Booted disk: mmcblk0 31.6GB                Destination disk: sda 32.0GB
---------------------------------------------------------------------------
Part      Size    FS     Label           Part   Size    FS     Label
1 /boot   256.0M  fat32  --              1       29.8G  fat32  --
2 root     29.2G  ext4   rootfs                                  
---------------------------------------------------------------------------
== Initialize: IMAGE partition table - partition number mismatch: 2 -> 1 ==
1 /boot               (48.0M used)   : MKFS  SYNC to sda1
2 root                (3.8G 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): Daily1

Initializing
  Imaging past partition 1 start.
  => dd if=/dev/mmcblk0 of=/dev/sda bs=1M count=8 ...
  Resizing destination disk last partition ...
    Resize success.
  Changing destination Disk ID ...
  => mkfs -t vfat -F 32  /dev/sda1 ...
  => mkfs -t ext4 -L Daily1 /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
  => rsync /boot/ /mnt/clone/boot  ...

Editing /mnt/clone/boot/cmdline.txt PARTUUID to use ea91591e
Editing /mnt/clone/etc/fstab PARTUUID to use ea91591e
===============================
Done with clone to /dev/sda
   Start - 15:50:08    End - 15:55:54    Elapsed Time - 5:46

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

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

 9分くらいで終わりました。残りも同様にコピーします。

$ sudo rpi-clone sdb
・
・
$ sudo rpi-clone sdc
・
・
$ sudo rpi-clone sdd
・
・

 後は、ローテーションさせる SHELL スクリプトを作成して、cron に登録します。

 /root/bin/backup に保存して実行権を付けました。

#!/bin/bash

PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:$PATH

# Definition of disk identifier
id_monthly="0xa3d1a5d4"
id_weekly="0x000e3211"
id_daily1="0xea91591e"
id_daily2="0x766a0e36"

device=
clone=rpi-clone
# get date
day=$(date +%d)
week=$(date +%w)
n=$(expr ${week} % 2)

# check backup devices
for check in /dev/sd?
do
    if [ -b ${check} ]; then
        id=$(fdisk -l ${check} | grep "Disk identifier:")
        id=${id##*: }
        if [ "${id}" == "${id_monthly}" ]; then
            dev_monthly=${check}
        elif [ "${id}" == "${id_weekly}" ]; then
            dev_weekly=${check}
        elif [ "${id}" == "${id_daily1}" ]; then
            dev_daily1=${check}
        elif [ "${id}" == "${id_daily2}" ]; then
            dev_daily2=${check}
        fi
    fi
done

# day = 1  : monthly backup
# week = 0 : weekly backup
# n = 0    : daily1 backup
# other    : daily2 backup
if [ "${day}" -eq 1 -a "${dev_monthly}" != "" ]; then
    device=${dev_monthly##*/}
elif [ "${week}" -eq 0 -a "${dev_weekly}" != "" ]; then
    device=${dev_weekly##*/}
elif [ "${n}" -eq 0 -a "${dev_daily1}" != "" ]; then
    device=${dev_daily1##*/}
elif [ "${dev_daily2}" != "" ]; then
    device=${dev_daily2##*/}
fi

if [ "${device}" != "" ]; then
    echo "Backup to ${device}."
    date > /etc/backup_mark
    time ${clone} ${device} -q
else
    echo "Backup device not found."
fi

 毎月 1 日に月次バックアップを、そうでなければ日曜に週次バックアップを、それ以外は 2 枚に交互にバックアップします。

 バックアップ先は、間違わないように、Disk identifier を使ってバックアップ先を決めています。id_monthly 〜 id_daily2 まで、実際の Disk identifier を設定します。

 Disk identifier は fdisk -l で表示することができます。

$ fdisk -l /dev/sdc
Disk /dev/sdc: 30.2 GiB, 32457621504 bytes, 63393792 sectors
Disk model: USB Flash Disk  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc3072e18

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdc1  *       32 63393791 63393760 30.2G  c W95 FAT32 (LBA)

 対象の Disk identifier が見つからない場合は、何もしません。

 毎日午前 3 時にバックアップするするように cron に登録します。

$ sudo crontab -e
0 3 * * * /root/bin/backup

 バックアップした MicroSD をRaspberry Pi に内蔵させて起動するところまで確認できました。サーバのバックアップはこれでいいでしょう。

Raspberry Pi

Posted by sirius