备份和恢复树莓派TF卡

本文介绍如何备份和恢复树莓派 tf 卡镜像的方法:

  • 制作树莓派 tf 卡镜像,是最容易的备份办法
  • 使用 dd 制作的镜像,是和 tf 卡容量一样大的,实际上并没有使用那么多字节数
  • 需要一种即能镜像 tf 卡,又能只备份实际消耗磁盘空间的做法
  • 这样处理后的备份数据,如何恢复到 tf 卡中

本文操作环境

  • MacBook Pro / macOS
  • 树莓派 Zero W
  • 一张 32GB 的 tf 卡

对 tf 卡做镜像#

给树莓派系统做镜像,说明你已经有一个可以运行的树莓派了。

取下树莓派的 tf 卡,插入到电脑上。

找到设备名并卸载它#

需要知道 tf 卡在操作系统中对应的名字。

通过命令查看设备名 diskutil list,比如是 disk2

那么卸载 tf 卡的命令:diskutil unmountDisk /dev/disk2

制作 tf 卡镜像文件#

可以使用系统自带的 dd 命令:

1
sudo dd if=/dev/disk2 of=生成的镜像文件路径 bs=1m`

dd 命令会逐个字节的将 tf 卡数据,存储在镜像文件中。

因为受到 tf 卡的读写限制,镜像文件的生成速度在我这里大约只有 6.5MB/s

当 tf 卡比较大时过程会很漫长,而且命令不返回任何信息,只有等待。

如果希望在做镜像时得到比较友好的反馈,可以使用第三方工具 dc3dd

dc3dd 安装:brew install dc3dd

使用 dc3dd 命令做镜像:

1
sudo dc3dd if=/dev/disk2 of=生成的镜像文件路径

缩小镜像的大小#

确定怎么做#

在网上搜了一些解决方法和建议。

基本思路是:

  • 先做镜像,这一步是跑不了的
  • 再通过 fdisk 等命令找到使用的最后一个扇段
  • 使用 truncate 命令截掉没用的字节部分
  • 使用 truncate 过的镜像恢复树莓派,需要在rasp-config做下扩展操作

在操作过程中,又发现了两个很有用的链接

打算用 PiShrink,但这个脚本只支持在 Linux 下运行。

正好查到 reddit 的帖子:PiShrink for Mac with Docker

  • 作者创建了一个 docker 项目,thhan/Docker-PiShrink
  • 思路是
    • 创建一个 docker 容器,在这个 Linux 容器中安装pishrink命令
    • 需要压缩的镜像放在容器的目录下
    • 登录容器,在容器中使用pishrink命令

后面执行了一下,没有问题。

执行步骤#

你需要先安装 docker,我已经安装了 docker。

先 clone 项目 git clone https://github.com/thhan/Docker-PiShrink

然后将已经生成的镜像文件移动或复制到该项目目录下。

Docker-PiShrink 目录下,执行./docker.sh,将执行:

  • 下载容器镜像
  • 启动容器
  • 登录到容器中

执行:

1
pishrink 镜像文件路径

过程很快,因为没有 tf 卡这个瓶颈了。

我的 32GB 卡镜像数据,镜像文件大约 30GB,压缩后为 1.9GB。

还可以进一步压缩:

1
tar -czvf 压缩文件路径.gz 镜像文件路径.img

我的情况是 gz 压缩后,从 1.9GB 进一步压缩到 714MB。

恢复镜像#

插入 tf 卡,作为镜像恢复的目标。

卸载 tf 卡:diskutil unmountDisk /dev/disk4

使用 dc3dd:

1
sudo dc3dd if=镜像文件路径 of=/dev/disk4

此时的速度更慢,约 1.6MB/s,因为 tf 卡的写入速度比读取速度(做镜像时)更慢。

恢复后的系统,需要等待较长时间才可访问。

另外,使用 pishrink 压缩后的镜像,并不需要在raspi-config中做Expand Filesystem,因为脚本帮助自动做了。