树莓派本地备份

一、前言

想要在家庭/小型办公室内做简单、可靠的文件备份?用一台低功耗的单板机(Raspberry Pi)+ rsync 做备份服务器,再用一个轻量级的 SQLite 日志 与小脚本记录备份状态,就能完成一个可落地、易维护的方案。本文目标:简单、可复制、立刻可用。

树莓派本地备份

二、适用场景与准备

  • 适合:个人资料、代码仓库、照片等非超大体量数据的定期备份。
  • 硬件:Raspberry Pi 3/4(或任意 Debian/Ubuntu 系统机)+ 外接硬盘(USB)或大容量 SD 卡。
  • 软件:Raspbian/Ubuntu、rsync、python3、sqlite3、systemd(已随系统)。
  • 网络:局域网互通(备份客户端能 SSH 到 Pi),可选路由器端口映射以支持远程备份(注意安全)。

树莓派本地备份

三、总体思路(3 步)

  1. 将外接硬盘挂载到 Pi(作为备份存储)。
  2. 在客户端通过 rsync 推送到 Pi 的指定目录(或 Pi 主动拉)。
  3. 使用 Python+SQLite 记录每次备份元信息(时间、大小、状态),并用 systemd/cron 定时任务自动运行。

树莓派本地备份

树莓派本地备份

四、详细步骤(可直接复制执行)

1)在 Pi 上准备存储

插入外接硬盘,查找设备名:

lsblk

假设设备为 /dev/sda1,创建挂载点并挂载:

sudo mkdir -p /srv/backup

sudo mount /dev/sda1 /srv/backup

# 添加到 /etc/fstab 以开机自动挂载(替换 UUID)

sudo blkid /dev/sda1

# 编辑 /etc/fstab,加入:

# UUID=你的UUID /srv/backup ext4 defaults,noatime 0 2

2)安装必须软件

sudo apt update

sudo apt install rsync python3 python3-pip sqlite3 -y

3)创建备份目录与权限

sudo mkdir -p /srv/backup/repos

sudo chown pi:pi /srv/backup -R # 假设使用 pi 用户

4)在 Pi 上创建 SQLite 日志表 & Python 记录器

创建目录 /opt/backup 并写入脚本:

sudo mkdir -p /opt/backup

sudo chown pi:pi /opt/backup

新建 backup_logger.py:

#!/usr/bin/env python3

# /opt/backup/backup_logger.py

import sqlite3, sys, time, os

DB = '/srv/backup/backup_log.db'

def init_db():

conn=sqlite3.connect(DB)

c=conn.cursor()

c.execute('''CREATE TABLE IF NOT EXISTS backups

(id INTEGER PRIMARY KEY AUTOINCREMENT,

host TEXT, path TEXT, ts INTEGER, size INTEGER, status TEXT, msg TEXT)''')

conn.commit()

conn.close()

def log(host, path, size, status, msg=''):

conn=sqlite3.connect(DB)

c=conn.cursor()

c.execute('INSERT INTO backups (host,path,ts,size,status,msg) VALUES (?,?,?,?,?,?)',

(host, path, int(time.time()), size, status, msg))

conn.commit()

conn.close()

if __name__ == '__main__':

init_db()

# 用法示例: python3 backup_logger.py host path size status “msg”

if len(sys.argv)>=5:

host, path, size, status = sys.argv[1:5]

msg = sys.argv[5] if len(sys.argv)>5 else ''

log(host, path, int(size), status, msg)

赋可执行权限:

chmod +x /opt/backup/backup_logger.py

5)在客户端(或 Pi)写 rsync 备份脚本

示例:客户端推送到 Pi(假设客户端为 PC,Pi IP 为 192.168.1.10)

在客户端写 push_backup.sh:

#!/bin/bash

SRC=”/home/user/project”

DEST=”pi@192.168.1.10:/srv/backup/repos/project_$(date +%F_%H%M%S)”

ssh pi@192.168.1.10 “mkdir -p $DEST”

rsync -avz –delete “$SRC/” “pi@192.168.1.10:$DEST/”

RC=$?

# 获取目录大小(字节)

SIZE=$(ssh pi@192.168.1.10 “du -sb $DEST | cut -f1”)

# 记录到 sqlite(调用 Pi 上的脚本)

ssh pi@192.168.1.10 “python3 /opt/backup/backup_logger.py $(hostname) $DEST $SIZE $( [ $RC -eq 0 ] && echo OK || echo FAIL ) 'rsync RC=$RC'”

exit $RC

注意:提议在客户端与 Pi 之间设置 SSH key 免密码登录以便自动化:

# 在客户端

ssh-keygen -t ed25519

ssh-copy-id pi@192.168.1.10

6)在客户端用 cron 定时(例:每天凌晨 2 点)

crontab -e

# 添加

0 2 * * * /path/to/push_backup.sh >> /var/log/push_backup.log 2>&1

7)在 Pi 上查看备份日志

sqlite3 /srv/backup/backup_log.db “SELECT id,host,datetime(ts,'localtime'),size,status,msg FROM backups ORDER BY ts DESC LIMIT 20;”

8)恢复示例

从特定备份目录恢复:

# 在目标机器上

rsync -avz pi@192.168.1.10:/srv/backup/repos/project_2025-12-01_020000/ /home/user/project_restore/

五、常见问题与优化提议

  • 磁盘自动挂载失败:确保 /etc/fstab 中用 UUID 而不是设备名。
  • SSH 频繁密码输入:设置 SSH key。
  • 网络不稳定时数据不完整:可增加 –partial –timeout=60 等 rsync 参数并设置重试机制。
  • 日志增长太快:定期轮转或写脚本清理超过 N 天的备份目录,并在 SQLite 中记录清理操作。
  • 示例清理(保留最近 14 天):

find /srv/backup/repos -maxdepth 1 -type d -mtime +14 -exec rm -rf {} ;

六、总结

这个方案把硬件(Pi + 硬盘)、网络(SSH/rsync)、数据库(SQLite 日志)和编程(简单的 Python 脚本)结合起来,形成一个简单、可复制、易维护的本地备份系统。按上面步骤可以在几小时内搭建完成并投入使用。

需要我把这些脚本打包成一个可下载的 Git 仓库,或为你生成一张“备份拓扑示意图(可直接保存)”吗?

© 版权声明

相关文章

暂无评论

none
暂无评论...