前言

树莓派小车基于linux开发,在linux上安装了很多定制软件,为了方便大家备份系统,特地制作本教程。本教程不必翻译,内部人员知道就行了。

为什么要备份raspberry pi SD卡?

我们基于linux开发的产品相信今后会越来越多,不同产品用需要的软件不尽相同,虽然每个产品最后都会有教程,按照教程可以完成各类软件安装。天地万物总是相对的,有的人勤奋,有的人懒惰。对于懒人让他按照教程去安装软件,他会觉得很麻烦,如果在安装软件过程中不小心shell命令敲错了(这是大概率事件),导致报错,安装不成功,更不巧的是这个客人对于linux不熟悉,不知道如何解决问题,最后找到客服说你这东西不work…,就这样我们不明就里地背了个锅。所以,为了避免这种尴尬,我们将安装了软件,能够正常运行的系统备份成镜像文件(img格式),在出货的时候就把这个镜像文件烧录到SD卡中,客人无需进行繁琐的软件安装步骤;同时,如果系统更新或者我们的软件升级,我们只需把升级后的系统重新备份一下,放在网站上,让客人自己去下载烧录即可。(跟3.5”屏一样的操作)

如果客人不想用我们提供的镜像也没有关系,他可以在他自己系统上按照教程安装各软件,出了问题无法解决再烧录我们的镜像。

备份SD卡需要准备什么

  1. raspberry pi3 B/B+/1块(装了Linux的PC更好)
  2. 安装好Raspbian系统 SD卡(大于32G)/1张
  3. 安装好系统、软件的16G SD(需要备份的卡)/1张
  4. 读卡器/1个
  5. U盘(大于5G)/1个

将32G安装了Raspbian系统的SD卡插到pi中并启动,将Pi连接上网络。也可以用安装了linux的PC机取代Pi+SD卡组合,这样会快一些。将安装好软件需要备份的16G SD插在读卡器中,把读卡器插在Pi USB口上或电脑USB口上。

如何备份

备份系统方法有很多,各有优劣。比如用dd命令备份、Windows下用Win32DiskImager软件备份以及下面要用的方法。前两种虽然简单,但是备份出来的文件特别大,不利于网络上传、下载,而且耗时很长。这里介绍的方法虽然比较麻杂,但是备份出来的文件是与原卡实际使用空间一样的大小。

首先介绍下raspberry pi的文件系统,树莓派官方发布的raspbian系统基于Debian开发的,主要分为两个区:启动分区和根分区。启动分区挂载在/boot上,fat32格式,存放系统启动必要文件。例如kernel、driver、firmware、启动脚本;根分区挂载在 / 下,ext4格式,主要存放安装软件和库文件、系统配置、用户数据等。所以备份一个系统只需要备份这两个分区就可以了,大致有5个步骤:

  1. 创建空白img文件
  2. 把img当作一个磁盘分区和格式化
  3. 挂载各个分区
  4. 将文件备份至各个分区
  5. umount各个分区

下面将详细介绍整个备份过程。(有点长,要淡定~)

  1. 创建空白img文件
  2. 把img当作一个磁盘分区和格式化
  3. 挂载各个分区
  4. 将文件备份至各个分区
  5. umount各个分区

下面将详细介绍整个备份过程。(有点长,要淡定~)

创建空白img文件

首先安装必需的工具软件:

如果报错,请先更新一下源

建立工作目录

插入插有需要备份SD卡的读卡器到USB口后,确定需备份SD卡对应的设备名

一般会输出如下图的信息:

如上所示 /dev/sda 为需要备份的SD卡, /dev/sda1 为 /boot, /dev/sda2 为 /

挂载需备份SD卡(源SD卡)

查看源SD卡已用空间大小

如上可以看出/dev/sda已用空间大约4.2G,其中,/boot 区占用21M,/ 占用4.2G。建立一个空白的img文件,因为源SD卡已用空间大约4.2G,建立一个比源SD卡已用空间大1.15倍的空白img文件,新建一个4800M的空白img文件应该可以了(安全起见,设定5000M会更好,时间会长一些)

这个过程大约需要5分钟完成,不要捉急!

完成后,确认一下img文件是否已经生成,且文件大小是否正确

给img文件分区

分区的起始扇区数都是8的倍数,以保证4k对齐。

检查分区是否成功

在parted程序中,输入print free命令可以显示分区内容,输入quit退出。

挂载img文件到系统

img文件对应的loop device的设置

下面的命令中相应输入/dev/loop0,如果如果上一步得到的不是 loop0 请做相应调整(以及以后的各个步骤里的loop0都要改变)

此时loop device就设置好了,loop0p1对应的是img文件分区上的 /boot,loop0p2对应的是 /(根)

img文件中的两个分区格式化

挂载目标img文件loop device

备份/boot

首先备份/boot,/boot目录下文件不多也不大,可以直接用cp命令拷贝即可

备份  / 文件系统

由于 / 文件系统文件多且大,不宜用cp命令直接拷贝,容易出错。这里我们先用tar命令把 / 文件系统打包,再把tar包解包到指定目录。

首先,对目标挂载点设置合适的权限,并清空

然后用tar命令把需要备份SD卡的根文件系统打包

注意:上面第二条命令最后还有个  “.”,不要忘记敲了

打包过程中可能会出现一些 socket ignored 错误,请忽略这些细节。由于文件多且大此过程可能需要比较长的时间(大概10分钟),在PC上会快一些。

上述打包过程结束后,接着将tar包解开到目标img文件的根文件系统

解包是打包的逆过程,打包需要时间,同样解包也需要时间。此过程可能需要比较长的时间,在PC上会快一些。

解包过程结束后,回到上层目录,并删除backup.tar文件

相应修改PARTUUID设定

这时候整个备份就已经完成了。不过此时的img文件即使写入到空白SD卡里面也是无法启动的,因为Raspbian启动要对应分区的PARTUUID,所以我们还要修改目标img文件里的cmdline.txt和fatab两个文件,这两个文件路径位于:

首先查看img文件对应的loop device的两个分区的PARTUUID

这里可以看到/boot对应的是bda1c25e-01, / 对应的是bda1c25e-02.注意这个编码要以实际情况为准哈,你不能按照我的来!

修改 cmdline.txt 文件

将上图中方框处的编码改为上一步中得到的/ 对应的编码,即bda1c25e-02,保存退出。

修改 fstab 文件

将方框处分别改为 /boot 和 / 的编码,即bda1c25e-01 和bda1c25e-02

卸载并删除挂载点

卸载各个挂载的分区

删除loop device

删除挂载点目录

最后剩下img文件

拔出插在USB口上读卡器。至此,备份的工作已经完成了。可以将制作好的img文件烧录到空白的SD卡中,这样系统就可以启动了。但是问题是如何把制作好的镜像烧录到SD卡呢?要解决这个问题也有很多方法。可以直接在linux上用dd命令烧录;也可以把img文件拷贝到U盘在Windows下用Win32DiskImager工具烧录,这里我们采用后者。

要将img文件在windows下烧录,就先要解决一个问题:如何把制作的img文件拷贝到U盘等磁盘设备?要解决这个问题也很简单,可以先把img文件打包压缩,再拷贝到U盘等设备,最后在windows下烧录。既然方案已确定那就动手吧!

安装解压缩工具

压缩img文件

由于img文件比较大,我在pi3上压缩制作的img文件(4.5G)耗时近  一个小时!!!!个小时!!!小时!!时!

所以,PC有装linux(ubuntu 或Debian等)系统的,还是用PC吧!

拷贝到U盘

将U盘(容量大于5G)插到Pi USB口上,Pi会自动将U盘挂载在/media/pi目录下,可以打开图形化的文件管理器像windows下一样用Ctrl C和Ctrl V一样复制粘贴即可,我就不多说了。

拔掉U盘,把U盘里面的img文件存放到windows电脑硬盘上,在windows下如何烧录相信大家都知道,我就多说了。

把制作好的镜像烧录到新的16G SD卡,系统启动动后,在终端输入

发现16G的卡空间只有不到5G!!

这是因为在制作镜像的时候是按照源SD卡实际使用空间制作的,源SD卡实际空间不到5G,所以16G的卡只有不到5G的存储空间。为了能充分利用卡的存储空间,在首次启动的时候用下面命令将存储空间扩展一下就可以了。

选择 Advanced options –> Expand Filesystem 即可。

到这里所有操作都整完了,相信看到这里你内心是忧伤的,操作一遍更是有“此生不想有第二次”的想法,反正我是有!