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

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

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


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

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 に内蔵させて起動するところまで確認できました。サーバのバックアップはこれでいいでしょう。
ディスカッション
コメント一覧
まだ、コメントがありません