1、备份前准备
备份树莓派,需要准备1个Linux系统和1个存储着待备份系统的存储设备(后面称作备份盘,一般来说是SD卡,我演示的是备份SD卡;也可以是硬盘,因为我以后系统会安装到硬盘,直接从硬盘里面启动树莓派)一般使用下面两种方式备份
1.1、系统选择
-
除了需要备份的备份盘,还需要一个Linux系统,Linux系统可以使用以下两种方式
-
1、直接使用虚拟机(本教程用这种方式演示,虚拟机环境为
Debian 10 的root用户
)
2、使用树莓派+系统盘(可以启动树莓派系统的SD卡,但不能是备份盘,过程跟第一种方式一样)最终会做到用虚拟机第一次备份SD卡里面的系统,还原到硬盘里面,然后硬盘启动,分区,以后就用SD卡当做系统盘,用树莓派备份硬盘里的系统。
1.2、备份所需要安装的软件
sudo apt-get install kpartx parted dosfstools dump
kpartx
用于分区镜像
parted
格式化分区
dosfstools
提供格式化分区的格式
dump
备份工具
1.3、准备镜像文件
1.3.1、查看备份盘需要备份的目录所占的空间
-
1.3.1.1、查看备份盘的路径
-
使用命令
查看SD卡的路径fdisk -l
红色框框住的就是备份盘的路径
/dev/sdb1
是备份盘系统的/boot
目录
/dev/sdb2
是备份盘系统的/
目录
1.3.1.2 挂载备份盘
-
要查看、操作备份盘的文件,首先要把他挂载到当前系统里
cd ~/ mkdir boot mkdir root mount /dev/sdb1 boot mount /dev/sdb2 root
1.3.1.3 查看备份盘已使用空间
-
查看备份盘已使用空间,是为了后面确定创建镜像的大小,我创建镜像的大小大约是
(boot目录总空间 + / 根目录已使用空间) * 1.1
。
使用命令df -h
可以看到boot
目录总大小为252MB
/
目录已使用大小为4.6 * 1024 ≈ 4710MB
创建的镜像大小≈5433MB
1.3.2、创建一个空白的镜像文件
根据步骤
1.3.1.3
的计算,下面将要创建一个大小大约为5433MB
的镜像
dd if=/dev/zero of=pi.img bs=1M count=5433
1.3.3、分割镜像
1.3.3.1、查看镜像需要分割的大小
fdisk -l /dev/sdb
可以看出
分区表
类型是dos
boot
目录的开始和结束分别为8192
和524287
/
目录的开始是524288
,结束不用管,因为刚才创建的镜像文件的大小足够存储备份盘boot
+/
目录下的文件,所以结束直接是镜像文件的结束大小就好了。
1.3.3.2、开始分割
下面是分割镜像的命令
#分区表格式类型为 msdos
parted pi.img --script -- mklabel msdos
#为两个目录分区(下面第二条命令最后面是 "负一",代表一直分割到镜像文件结束)
parted pi.img --script -- mkpart primary fat32 8192s 524287s
parted pi.img --script -- mkpart primary ext4 524288s -1
1.3.3.3、查看分割结果
fdisk -l /dev/sdb pi.img
可以看到sdb
的分区情况和pi.img
镜像的分割情况,是多么的相似
1.3.4、把镜像文件虚拟为循环设备
# 寻找第一个未使用的循环设备
losetup -f
· 这里将会输出一个类似于 /dev/loop0 之类的结果,下面的操作都是使用刚才输出的 loop0,这里要根据实际情况自己更改
# 将pi.img虚拟成循环设备
losetup /dev/loop0 pi.img
# 查看结果
losetup -a
· 成功的话会输出 /dev/loop0: [2049]:1048581 (/root/pi.img)
1.3.5、装载镜像
kpartx -av pi.img
· 下面输出pi.img的装载文件名,文件在目录 /dev/mapper/ 下
· loop0p1 对应着存放 boot 目录下的文件
· loop0p2 对应着存放 / 目录下的文件
1.3.6、格式化镜像
mkfs.vfat -n boot /dev/mapper/loop0p1
mkfs.ext4 /dev/mapper/loop0p2
1.3.7、创建系统用户
因为我的虚拟机只有
root
用户,我的树莓派系统的用户是pi
,所以这里最好创建一个pi
用户
useradd pi
1.3.8、挂载镜像文件到文件系统
# 创建 boot_bak 目录,用来存放备份盘 boot 目录的文件
mkdir boot_bak
# 创建 root_bak 目录,用来存放备份盘 / 目录的文件
mkdir root_bak
# 挂载 loop0p1 到 boot_bak 目录
mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 boot_bak/
# 挂载 loop0p2 到 root_bak 目录
mount -t ext4 /dev/mapper/loop0p2 root_bak/
2、开始备份
2.1、备份boot目录下的文件
# 拷贝 boot 目录下的文件到 boot_bak
cp -rfp boot/* boot_bak/
# 查看 boot_bak 目录是否拷贝文件成功
ls boot_bak/
2.2、备份系统盘 / 目录下的文件
# 赋予 root 目录相对应的权限、用户和用户组
chmod 777 root_bak
chown pi.pi root_bak
# 进入 root_bak 目录
cd root_bak
# 备份 /,还原备份到 root 目录
dump -0uaf - ../root/ | restore -rf -
· 经过一番等待,看到输出 DUMP: DUMP IS DONE 就是备份完成了
2.3、修改PARTUUID
这里需要把
镜像的boot
分区(/dev/mapper/loop0p1) 和 /
分区(/dev/mapper/loop0p2)的PARTUUID
设置到
boot_bak/cmdline.txt
和 root/etc/fstab
文件
让系统找到相对应的分区
2.3.1、查看PARTUUID
blkid
可以看到
boot
分区(/dev/mapper/loop0p1)的PARTUUID
是a7951e41-01
/
分区(/dev/mapper/loop0p2)的PARTUUID
是a7951e41-02
2.3.2、修改boot_bak/cmdline.txt
通过vi
命令修改boot_bak/cmdline.txt
文件,找到root=PARTUUID=
,把值修改为a7951e41-02
2.3.3、修改root_bak/etc/fstab
通过vi
命令修改root_bak/etc/fstab
文件,把/boot
和/
前面PARTUUID
的值分别修改为a7951e41-01
和 a7951e41-02
到这里,备份操作已经完成了,pi.img
就是备份的镜像文件,后面将会把镜像还原到外置硬盘,从硬盘启动树莓派。这个备份盘里面的系统也最好不要删掉,因为后面会把这个备份盘作为系统盘,用树莓派备份外置硬盘里面的系统。