情景:
在树莓派上进行开发的时候经常遇到各种超出预料而又无法解决的问题需要重装系统,问题是重装系统之后一大堆的设置和常用的软件包实在让人头疼,之前一直在研究如何完美备份SD卡的方法可是一直总会出现各种各样的问题,今天专门开个文章记录一下
准备工作 (可选)
如果你的读卡器可以使用USB3.0,可以将其插进USB3.0的接口以提升速度
你需要了解你即将备份的SD卡中空间的占用的情况,并且将 rootfs
(即系统所在分区) 分区调整到合适的大小
In Linux
使用 gparted
软件调整SD卡分区:
我用的是 Deepin
貌似自带 gparted
的包,所以直接在控制台输入sudo gparted
即可打开gparted的界面
* 如果未安装软件的 Debian 系发行版可以通过APT仓库下载安装sudo apt-get install gparted
在右上角选中自己的SD卡,然后观察SD卡的使用情况
可以看到 rootfs
分区只用了 2.18 Gib 接下来我们调整他的分区到合适的大小
分别右键两个分区,点击卸载之后我们才能对其进行操作
可以看到卸载之后分区前的两个锁图标已经不见,意味着这时候你可以对磁盘进行操作
我们将 rootfs
分区的大小调整至 3Gib (只要比实际使用稍大点就行了)
确定之后应用一下对磁盘的更改即可!!!注意不要对boot分区进行任何操作!!!
!!!注意不要对boot分区进行任何操作!!!
!!!注意不要对boot分区进行任何操作!!!
!!!注意不要对boot分区进行任何操作!!!
In Windows
在开始之前你需要一个 Diskgenuis
软件 官网
下载适合你系统的版本即可
打开 diskgenuis 软件
你需要做的很简单,只需要调整rootfs分区到合适的大小即可
- 插入SD卡后在左边选择SD卡,然后点击rootfs分区,可以看到只用了2.2G的空间,我们将其调整到3GB左右(可以根据实际情况自行调整,建议比已用空间大点)
- 右键rootfs分区,选择
调整分区大小
输入或拖动到你所需的大小 - 点击开始之后软件会自动进行调整,如果在调整的过程中没有报错,那么恭喜你可以使用Windows下的
方式一
进行备份. - 不知道为什么在Diskgenuis调整大小会出现错误,但是在Linux下却不会
* 可以看到,在磁盘前的4MB空间是空闲的,这可能就是一直导致备份出现错误的原因
在Linux下备份 (推荐)
使用 Linux 的 DD
命令可以轻松的备份系统
假定你已经完成了分区的调整 (理论上不分区也可以,但是为了保险起见我还是分区了)
在控制台输入 sudo fdisk -l
查看SD卡挂载的位置
可以看到我的SD卡的全盘路径在 /dev'/sdc
记住这个目录,接下来我们对其进行操作
sudo dd if=/dev/sdc of=Pi_System.img bs=4096 count=852992
-- if : 输入的[文件\目录] 路径
-- of : 输出的[文件\目录] 路径 实际上使用 .iso 的格式应该也可以,如果不添加后缀,则默认拷贝到文件夹下
-- bs : 拷贝时一次读入的字节数(缓冲区大小) 实测使用更大的数值可以提升拷贝速度 (个人认为4096为最佳)
-- count : 将会拷贝 bs*count 个字节的数据 4096*852992 即是拷贝 3332MB 的数据(不要忘记Boot
分区的大小)
!!!!需要根据rootfs分区的大小来调整count的值!!!!
!!!!需要根据rootfs分区的大小来调整count的值!!!!
!!!!需要根据rootfs分区的大小来调整count的值!!!!
!!!!需要根据rootfs分区的大小来调整count的值!!!!
count参数数值的计算公式(bs为4096的情况下) (单位MB): 4(磁盘最前端MBR的大小) + 256(BOOT分区的大小) + 3072(rootfs分区的大小) * 256(固定值)
请根据自身情况修改前四个数值
将分区设置大一点的目的就是为了提高容错率.确保所有的文件都可以被拷贝到.
如果你没有对磁盘进行分区,只需要确保你拷贝的大小大于你有效数据的大小即可(请确保至少比rootfs的数据量多500MB,因为完整的BOOT分区大小会计算在内)
输入命令后耐心等待拷贝完成即可
在Windows下备份 (不推荐)
在Windows下进行备份可能会出现一些奇奇怪怪的事情
在开始之前你需要一个 Diskgenuis
软件 官网
下载适合你系统的版本即可
打开 diskgenuis 软件
方式一(如果你已经成功调整rootfs的大小,推荐使用此方法)
假设你已经成功调整了 rootfs
分区的大小
假设你已经成功调整了 rootfs
分区的大小
假设你已经成功调整了 rootfs
分区的大小
- 在diskgenuis菜单栏的
磁盘
选项卡中选择新建虚拟磁盘文件
->新建 .img 镜像文件
- 新建一个大于或等于 SD卡上所有分区大小的
img
文件 | 注意选中磁盘映像文件
(推荐至少比boot+rootfs分区大100MB) 这里我新建了一个3.5GB的img
文件
注意不要勾选格式化 - 点击
确定
后等待文件生成完毕后可以在软件的左边看见img
文件 - 点击SD卡上的
boot
分区,记录数据 - 在img文件上新建一个分区,确保参数与boot分区一致
如图所示根据你boot分区的大小照着填,注意是FAT32的文件系统 - 再对
img
文件剩余的空间建立一个 EXT4 格式的分区 (保持与rootfs分区格式一样即可) - 点击确定后点击软件左上角的
确定更改
询问是否格式化选是
即可
点击确定后点击软件左上角的确定更改
询问是否格式化选是
即可
点击确定后点击软件左上角的确定更改
询问是否格式化选是
即可 - 右键
img
文件下的boot
分区,点击取消激活分区
(如果分区处于激活状态请执行此操作) - 右键 SD 卡的
boot
分区 , 点击克隆分区
| 选择img
文件下的boot
分区 (如果img文件不出现则说明你没有保存更改) - 如图,选择
按文件复制
点击开始即可 - 对
rootfs
分区也进行同样操作 - 完成关闭软件即可,备份完成.
注意: 使用此方法的前提是调整空间不出错.
方式2
方式二相对简单
- 在
diskgenuis
中右键 SD卡 的boot
分区
选择备份分区到镜像文件
,弹出如下界面,点击备份选项可以选择压缩方式 (越高级的压缩方式需要越长的时间) - 选择文件路径后点击确定即可
- 对
rootfs
分区进行此相同的操作 - 至此备份完成
本方法会备份出两个文件对应两个分区,建议将两个文件一起储存.
还原
在Linux下还原
在Linux下还原可比备份简单多了
如同备份一样,你需要先确定SD卡挂载的位置
假设SD卡被挂载在 /dev/sdc
假设SD卡被挂载在 /dev/sdc
假设SD卡被挂载在 /dev/sdc
只需要将DD命令的 if
和 of
参数对调即可
sudo dd of=/dev/sdc if=Pi_System.img bs=4096
-- 请将if的参数改为你备份文件的所在路径
--------------------------------------
此时不需要控制count参数,程序默认会拷贝完整的文件.
耐心等待拷贝完成之后即可
在 Windows 下还原 Linux 下备份的 img 文件
- 使用
diskgenuis
或其他软件
对SD卡进行格式化成一个分区
方法见文章最后 - 按照烧写系统的方法对
img
文件进行烧写即可
同样的,也可以使用 diskgenuis
进行烧写,方法不再赘述
在 Windows 下还原 diskgenuis
备份的文件
- (可选) 1. 使用
diskgenuis
或其他软件
对SD卡进行格式化成一个分区
方法见文章最后
使用官方的镜像对SD卡进行一次烧写
如果你的分区表没有被破坏,可以选择此项 - 在
diskgenuis
中右键boot
分区后选择从镜像文件还原分区
, 选择对应的文件后按下确定即可 - 对
rootfs
分区进行同样的操作
这种方法实测好像不太稳定,会出现一些莫名其妙的问题,主要还是看人品
还原之后的分区空间恢复
sudo raspi-config
-> Advanced Options
-> Expand Filesystem
按照提示重启系统即可.
写在最后
如果你看了这篇文章还不会,则说明
- 我的表达能力欠佳
- 你的水平还不够
- 这篇文章不适合你
补充: diskgenuis
对 SD 卡进行格式化的方法
- 在软件中选中SD卡并点击上方
快速分区
- 如图
点击后选择是即可