SteveHawk's Blog

树莓派自动备份

如果不做魔改的话,树莓派的系统是运行在一张 SD 卡上的。众所周知,SD 卡的耐用程度是非常差劲,用来运行操作系统这样大量读写的任务对数据安全是相当大的威胁。因此,给树莓派进行定期的全盘备份是一个很必要的事情了。

由于把树莓派当作 NAS 而外接了一块硬盘,因此这块硬盘自然成为了备份存储的位置。核心思想就是使用 dd 指令直接把整个 SD 卡的内容拷贝到一个镜像文件中。参考了以下两个项目/帖子,完成了我的备份脚本。

Using dd to backup a PI SD - Raspberry Pi Forums

kallsbo/BASH-RaspberryPI-System-Backup: Bash script for automatic imaging backup of a raspberry pi system while it’s running

代码如下。

 1#!/bin/bash
 2#
 3# Automate Raspberry Pi Backups
 4# https://github.com/kallsbo/BASH-RaspberryPI-System-Backup
 5# https://www.raspberrypi.org/forums/viewtopic.php?t=46911
 6#
 7# Usage: system_backup.sh {path} {days of retention}
 8#
 9# Below you can set the default values if no command line args are sent.
10# The script will name the backup files {$HOSTNAME}.{YYYYmmdd}.img.gz
11# When the script deletes backups older then the specified retention
12# it will only delete files with it's own $HOSTNAME.
13
14# Redirect output
15exec >> /path/to/logfile/backup.log
16exec 2>&1
17
18echo "=============== Start Raspi Backup ==============="
19echo $(date "+%Y-%m-%d %H:%M:%S") UTC
20echo
21
22# Declare vars and set standard values
23backup_path=/path/to/backup/folder
24retention_days=30
25
26# Check that we are root!
27if [[ ! $(whoami) =~ "root" ]]; then
28echo ""
29echo "**********************************"
30echo "*** This needs to run as root! ***"
31echo "**********************************"
32echo ""
33exit
34fi
35
36# Check to see if we got command line args
37if [ ! -z $1 ]; then
38   backup_path=$1
39fi
40
41if [ ! -z $2 ]; then
42   retention_days=$2
43fi
44
45# Create trigger to force file system consistency check if image is restored
46touch /boot/forcefsck
47
48# Perform backup
49dd bs=4M if=/dev/mmcblk0 | gzip > $backup_path/$HOSTNAME.$(date +%Y%m%d).img.gz
50# Restore
51# gzip -dc $backup_path/$HOSTNAME.{YYYYmmdd}.img.gz | dd bs=4M of=/dev/mmcblk0
52
53# Remove fsck trigger
54rm /boot/forcefsck
55
56# Delete old backups
57find $backup_path/$HOSTNAME.*.img.gz -mtime +$retention_days -type f -delete
58
59echo
60echo $(date "+%Y-%m-%d %H:%M:%S") UTC
61echo "=================== Finished ====================="
62echo

创建脚本后,可以把它加入 Crontab 定时运行备份。

由于需要用 root 权限运行脚本,因此使用 sudo crontab -e 添加 root 用户的运行任务:

30 4 * * 5 /home/pi/utils/backup.sh

这样它就会在每周五凌晨 4:30 自动进行 SD 卡全盘备份啦!


#tech notes
本文总字数 569
本文阅读量
本站访客量

↪ reply by email