一日一技 | 让树莓派发挥余热:如何搭建持续在线的 Time Machine 备份

Matrix 首页推荐

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。

文章代表作者个人观点,少数派仅对标题和排版略作修改。


家里有个 Raspberry Pi 4B 只装了 HomeBridge 来接入家电感觉有点浪费,加上前一段时间折腾体验 macOS Monterey 预览版 用到了 Time Machine 作备份时想到要是可以像 iCloud 云备份一样可以无感自动备份就好了,所以就有了这篇文章。

得益于 ARM 芯片的低功耗加持目前我的树莓派跑了 Docker 版本的 HomeBridgefrp以及几个定时脚本加上担任无线时间机器,目前这些任务负载并不大,树莓派的性能也足够覆盖多数使用场景。顺便一提关于树莓派温度,由于我个人倾向于减少噪音所以没有选择风扇而是选择了被动散热方案,使用一段时间观察日常温度在 50℃ 左右,参考之前用的是树莓派官方的塑料外壳日常温度在 60℃ 左右。

准备阶段

其实早在几年前就用 Raspberry Pi 3B+ 折腾过无线 Time Machine但是无奈 USB 2.0 接口一个全量备份需要几天,还远达不到可用。Raspberry Pi 4B 的千兆 LAN 口以及 USB 接口的升级使得理论速度可以达到千兆带宽的家庭局域网水平,用来做无线备份也算可以一试了。

需要设备材料:

  • Raspberry Pi 4B 搭载 Raspberry Pi OS(其他 OS 的也可以)
  • TF 卡(做系统盘)
  • 千兆路由器
  • CAT6 网线
  • 一个硬盘搭配硬盘盒/移动硬盘(线材也要选择 USB 3.1 Gen 1 带宽为 5 Gbit/s 版本)

硬盘格式化分区

如果熟悉挂载硬盘的操作可以直接跳过这部分,直接看配置 Time Machine

首先插上硬盘通过 sudo fdisk -l 查看以下硬盘状态:

sudo fdisk -l

可以看出这里的是 NTFS 格式的硬盘,我这里要根据 /dev/sdb 把硬盘格式化为 ext4 格式:sudo mkfs.ext4 /dev/sdb

手动挂载硬盘

格式化完成后,重新通过sudo fdisk -l查看以下硬盘状态,此时我们可以把硬盘挂载到指定目录下: sudo mount Device名称 自定义的指定目录 

举例: sudo mount /dev/sdb /media/pi/backup 

记得先创建一下 storage 文件夹sudo mkdir /media/pi/backup 再次查看硬盘状态df -h,此时/dev/sdb已经挂载上去了。

df -h

以上就是手动挂载的方式,但是迫于断电重启的问题,每次挂载有点麻烦,所以设置启动时自动挂载硬盘是个不错的办法。

自动挂载硬盘

在系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。 所以我们只需在/etc/fstab加入我们硬盘信息即可。首先编辑文件:sudo vi /etc/fstab 

/etc/fstab中加入 UUID 指定目录 硬盘文件系统格式 defaults,nofail 0 0

其中 nofail 的作用为当挂载硬盘失败时不会影响系统的启动,当你不知道硬盘文件系统格式时,可以通过sudo blkid查看硬盘的 UUID 和 TYPE。

sudo blkid

举例: UUID="3f63fe7c-1173-4423-ad02-6bf92e15c2b7" /media/pi/backup ext4 defaults,nofail 0 0

配置 Time Machine

配置用户

首先新增 linux 的系统用户(这里用 timemachine 举例):

sudo adduser timemachine

将前面挂载磁盘权限修改为timemachine用户:

sudo chown -R timemachine: /media/pi/backup

安装 SMB

首先更新一下软件:

sudo apt-get update && sudo apt-get upgrade

安装 Samba

sudo apt-get install samba

配置 SMB

添加 smmba 用户并设置密码:

sudo smbpasswd -a timemachine

编辑 Samba 的配置文件:

sudo vi /etc/samba/smb.conf

/etc/samba/smb.conf文件的全局配置段应增加如下设置以禁用 SMB1 协议和支持 macOS 系统的拓展属性:

[global]
		#Apple extensions ("AAPL") run under SMB2/3 protocol, make that the minimum (probably shouldn't be running SMB1 anyway...) 
    min protocol = SMB2
    #支持macOS系统的拓展属性
    ea support = yes

 

其次,作为备份的共享文件夹设置应设置支持 Time Machine,/etc/samba/smb.conf文件追加以下配置:

[TimeMachine]
    comment = TimeMachine Backup
    # 填入硬盘挂载路径
    path = /media/pi/backup
    browseable = yes
    public = no
    writable = yes
    create mask = 0700
    # 用户名按需修改为前面创建的
    valid users = timemachine
    # 加载模块以支持AAPL拓展,注意顺序很重要!
    vfs objects = catia fruit streams_xattr
    # 支持AAPL
    fruit:aapl = yes
    # 存储macOS的元数据
    fruit:metadata = stream
    # 设置服务器在finder中的图标
    fruit:model = MacSamba
    # 设置支持Time Machine
    fruit:time machine = yes
    # 文件清理相关配置
    fruit:posix_rename = yes
    fruit:veto_appledouble = no
    fruit:wipe_intentionally_left_blank_rfork = yes
    fruit:delete_empty_adfiles = yes

配置好后重启 samba 服务让设置生效:

sudo systemctl restart smbd

配置广播服务

Raspberry Pi OS 默认安装和启用了 Avahi 服务,Avahi 服务会自动提供服务广播。因 Time Machine 只能选择系统自动发现的硬盘,所以树莓派需要广播让 macOS 发现支持 Time Machine 的备份硬盘存在。如果你的系统未安装 Avahi,使用该命令可安装:

sudo apt install avahi 

启动并且设置 Avahi 服务自动启动:

sudo systemctl enable avahi-daemon && sudo systemctl start avahi-daemon

接下来配置 Time Machine。打开系统设置,找到 Time Machine(时光机器),解锁后点击「选择磁盘」,如果配置无误且在同一个局域网的话,会看到共享的 TimeMachine 硬盘:

macOS端设置

打开系统设置选择时间机器,然后选择磁盘就会发现刚创建好的,然后输入前面设置的用户名 timemachine 以及对应的密码然后连接即可。

 

使用感受

首次 330G 的全量备份大概花了 10 个小时,抛开第一次全量备份外每天的增量备份在 10G 左右备份时间也都在半小时内,所以不会占用太长时间。实际使用了一周的后,最便捷的就是只要连上家中 Wi-Fi 就会开始备份,同时也不用担心备份一半就要出门会导致备份损坏的情况。对我个人习惯来说下班回家之后会把电脑外接显示器使用,此时就会开始备份。相比于硬盘备份实在方便很多,通常来说很难做到坚持每天回家接上硬盘点击备份,这个更像一个部署在局域网的 iCloud 云备份。当然这个也和每个人的使用习惯相关,假如你下班回家之后连电脑都懒得从包里拿出的话,那么定期备份一次才是更加适合你的选择。

Time Machine 备份策略在你硬盘足够大的情况下是可以追溯 24 小时的每小时备份,即使没有连接到 Time Machine 也会在本地磁盘1中存储快照。这种机制下可以很方便追溯 24 小时内的版本,对于误删或者误操作覆盖等情况都可以快速找回。

参考资料

© 本文著作权归作者所有,并授权少数派独家使用,未经少数派许可,不得转载使用。