在对设备进行固件分区备份之前,我们需要通过设备的 debug 接口进行连接。设备的 debug 接口位于左下角,连接时需设置波特率为 115200。
ssh连接
设备默认的 SSH 服务配置较为严格,端口号为 33998,且不允许通过密码直接登录。我们可以通过查看 /etc/ssh/sshd_config
文件来确认默认配置:
# cat /etc/ssh/sshd_config | grep Port
Port 33998
# cat /etc/ssh/sshd_config | grep Password
#PasswordAuthentication yes
PermitEmptyPasswords yes
为了方便后续的操作,我们需要修改 SSH 配置,允许通过密码登录,并关闭允许空密码的设置。修改后的配置如下:
PasswordAuthentication yes
PermitEmptyPasswords no
使用 sed
命令可以快速完成这些修改,命令如下:
sed -i -e "s/^#PasswordAuthentication.*$/PasswordAuthentication yes/" -e "s/^P
ermitEmptyPasswords.*$/PermitEmptyPasswords no/" /etc/ssh/sshd_config
修改完成后,重启设备以使配置生效。之后,我们可以通过 SSH 客户端尝试登录设备,设备默认的用户名和密码均为 root
。登录成功后,我们可以查看系统的版本信息,确认设备运行的系统为 Buildroot 2019.11.1 版本:
PS C:\Users\zac.chen> ssh root@192.168.101.27 -p 33998
(root@192.168.101.27) Password:
# cat /etc/os-release
NAME=Buildroot
VERSION=2019.11.1
ID=buildroot
VERSION_ID=2019.11.1
PRETTY_NAME="Buildroot 2019.11.1"
查看分区
在进行备份操作之前,我们需要先了解设备的分区情况。通过查看内核启动日志中的分区信息,我们可以获取到设备的分区布局:
# dmesg | grep -i mmcblk
[ 3.454019] mmcblk0: emmc:0001 M8G1GC 7.28 GiB
[ 3.458938] mmcblk0boot0: emmc:0001 M8G1GC partition 1 4.00 MiB
[ 3.459620] mmcblk0boot1: emmc:0001 M8G1GC partition 2 4.00 MiB
[ 3.460225] mmcblk0rpmb: emmc:0001 M8G1GC partition 3 512 KiB
[ 3.464148] meson-mmc: [mmcblk0p01] bootloader offset 0x000000000000, size 0x000000400000
[ 3.464567] meson-mmc: [mmcblk0p02] reserved offset 0x000002400000, size 0x000004000000
[ 3.464872] meson-mmc: [mmcblk0p03] cache offset 0x000006c00000, size 0x000020000000
[ 3.465200] meson-mmc: [mmcblk0p04] env offset 0x000027400000, size 0x000000800000
[ 3.465525] meson-mmc: [mmcblk0p05] logo offset 0x000028400000, size 0x000002000000
[ 3.465858] meson-mmc: [mmcblk0p06] recovery offset 0x00002ac00000, size 0x000002000000
[ 3.466327] meson-mmc: [mmcblk0p07] rsv offset 0x00002d400000, size 0x000000800000
[ 3.466850] meson-mmc: [mmcblk0p08] tee offset 0x00002e400000, size 0x000000800000
[ 3.467279] meson-mmc: [mmcblk0p09] crypt offset 0x00002f400000, size 0x000002000000
[ 3.467756] meson-mmc: [mmcblk0p10] misc offset 0x000031c00000, size 0x000002000000
[ 3.468199] meson-mmc: [mmcblk0p11] boot offset 0x000034400000, size 0x000002000000
[ 3.468630] meson-mmc: [mmcblk0p12] system offset 0x000036c00000, size 0x000080000000
[ 3.469108] meson-mmc: [mmcblk0p13] vendor offset 0x0000b7400000, size 0x000010000000
[ 3.469479] meson-mmc: [mmcblk0p14] odm offset 0x0000c7c00000, size 0x000010000000
[ 3.469853] meson-mmc: [mmcblk0p15] data offset 0x0000d8400000, size 0x0000f9c00000
[ 5.124487] EXT4-fs (mmcblk0p12): mounted filesystem with ordered data mode. Opts: (null)
[ 5.333461] EXT4-fs (mmcblk0p12): re-mounted. Opts: data=ordered
[ 5.801438] EXT4-fs (mmcblk0p15): 1 orphan inode deleted
[ 5.801484] EXT4-fs (mmcblk0p15): recovery complete
[ 5.812330] EXT4-fs (mmcblk0p15): mounted filesystem with ordered data mode. Opts: (null)
[ 5.836262] EXT4-fs (mmcblk0p13): recovery complete
[ 5.837294] EXT4-fs (mmcblk0p13): mounted filesystem with ordered data mode. Opts: (null)
从上述信息可以看出,设备的存储介质为 eMMC,总容量为 7.28 GiB,包含多个分区,每个分区都有特定的用途。其中,mmcblk0p15
分区被挂载到 /data
目录,用于存储设备运行中的数据。通过查看文件系统的使用情况,我们可以了解到 /data
目录的可用空间约为 1.3 GiB:
# df -h
Filesystem Size Used Available Use% Mounted on
/dev/system 1.9G 825.0M 1008.4M 45% /rom
devtmpfs 485.3M 0 485.3M 0% /dev
tmpfs 490.0M 8.0K 489.9M 0% /dev/shm
tmpfs 490.0M 196.0K 489.8M 0% /tmp
tmpfs 490.0M 184.0K 489.8M 0% /run
/dev/data 3.8G 2.3G 1.3G 63% /data
/dev/vendor 239.9M 2.0M 221.1M 1% /vendor
overlayfs:/data/overlay/upper3.8G 2.3G 1.3G 63% /
cgroup 490.0M 0 490.0M 0% /sys/fs/cgroup
overlayfs:/data/overlay/upper3.8G 2.3G 1.3G 63% /writable/ipfsbit-518518/docker
为了释放更多空间以便进行后续的备份操作,我们可以清空 /data
目录中的数据,并重启设备。重启后,/data
目录的可用空间将增加至约 3.5 GiB:
rm -rf /data/*
reboot
# df -h
Filesystem Size Used Available Use% Mounted on
/dev/system 1.9G 825.0M 1008.4M 45% /rom
devtmpfs 485.3M 0 485.3M 0% /dev
tmpfs 490.0M 8.0K 489.9M 0% /dev/shm
tmpfs 490.0M 180.0K 489.8M 0% /tmp
tmpfs 490.0M 176.0K 489.8M 0% /run
/dev/data 3.8G 54.9M 3.5G 2% /data
/dev/vendor 239.9M 2.0M 221.1M 1% /vendor
overlayfs:/data/overlay/upper3.8G 54.9M 3.5G 2% /
cgroup 490.0M 0 490.0M 0% /sys/fs/cgroup
overlayfs:/data/overlay/upper3.8G 54.9M 3.5G 2% /writable/ipfsbit-518518/docker
备份分区
本地备份
在进行分区备份时,我们需要注意以下几点:
- 备份范围:只需要备份 GPT 分区表以及
mmcblk0boot0
、mmcblk0boot1
、mmcblk0rpmb
和mmcblk0p01
至mmcblk0p14
。mmcblk0p15
(即/data
分区)是运行中的 overlayfs 缓存数据,不需要备份。 - 备份工具:使用
dd
命令进行备份,该命令可以精确地复制设备或文件的内容。 - 备份路径:将备份文件存储在
/data/backup
目录中。
以下是备份的具体步骤:
-
创建备份目录:
mkdir /data/backup
-
备份 GPT 分区表:
dd if=/dev/mmcblk0 bs=512 count=34 of=/data/backup/mmcblk0_GPT.bin conv=fsync
-
备份引导分区:
dd if=/dev/mmcblk0boot0 of=/data/backup/mmcblk0boot0.bin conv=fsync dd if=/dev/mmcblk0boot1 of=/data/backup/mmcblk0boot1.bin conv=fsync
-
备份其他分区:
dd if=/dev/mmcblk0rpmb of=/data/backup/mmcblk0rpmb.bin conv=fsync dd if=/dev/bootloader of=/data/backup/mmcblk0p1_bootloader.bin conv=fsync dd if=/dev/reserved of=/data/backup/mmcblk0p2_reserved.bin conv=fsync dd if=/dev/cache of=/data/backup/mmcblk0p3_cache.bin conv=fsync dd if=/dev/env of=/data/backup/mmcblk0p4_env.bin conv=fsync dd if=/dev/logo of=/data/backup/mmcblk0p5_logo.bin conv=fsync dd if=/dev/recovery of=/data/backup/mmcblk0p6_recovery.bin conv=fsync dd if=/dev/rsv of=/data/backup/mmcblk0p7_rsv.bin conv=fsync dd if=/dev/tee of=/data/backup/mmcblk0p8_tee.bin conv=fsync dd if=/dev/crypt of=/data/backup/mmcblk0p9_crypt.bin conv=fsync dd if=/dev/misc of=/data/backup/mmcblk0p10_misc.bin conv=fsync dd if=/dev/boot of=/data/backup/mmcblk0p11_boot.bin conv=fsync
由于 /data
分区的可用空间有限,一次可能无法完成全部分区的备份。因此,我们需要分两次完成备份操作:
-
第一次备份:完成上述分区的备份后,通过 SFTP 将
/data/backup
目录中的备份文件导出到外部存储设备(如电脑或其他存储介质)。 -
清空备份目录:导出备份文件后,清空
/data/backup
目录,以释放空间:rm -rf /data/backup/*
-
第二次备份:继续备份剩余的分区:
dd if=/dev/system of=/data/backup/mmcblk0p12_system.bin conv=fsync
dd if=/dev/vendor of=/data/backup/mmcblk0p13_vendor.bin conv=fsync
dd if=/dev/odm of=/data/backup/mmcblk0p14_odm.bin conv=fsync
- 最终导出:将第二次备份生成的文件再次通过 SFTP 导出到外部存储设备。
网络备份
对于熟悉网络配置和系统操作的玩家来说,还可以通过挂载网络文件系统(Network File System,简称 NFS)来实现分区数据的备份。这种方法不仅可以简化备份流程,还能提高备份效率,避免因本地存储空间不足而导致的分步备份操作。
挂载网络文件系统
首先,需要确保目标设备(即备份服务器)已经配置好 NFS 服务,并且共享了一个可供备份的目录。在设备上,可以通过以下命令挂载网络文件系统:
# mount -t nfs [备份服务器的IP地址]:/共享目录路径 /挂载点
例如,假设备份服务器的 IP 地址为 192.168.101.100
,共享目录为 /backup
,挂载点为 /mnt/backup
,则命令如下:
# mount -t nfs 192.168.101.100:/backup /mnt/backup
挂载成功后,/mnt/backup
目录将直接映射到备份服务器的共享目录,设备上的任何写入操作都会实时同步到备份服务器。
远程备份分区数据
在挂载了网络文件系统后,备份分区数据的操作与本地备份类似,只是备份文件的存储路径从本地的 /data/backup
改为了挂载的远程目录 /mnt/backup
。以下是备份命令的修改示例:
# 创建远程备份目录
mkdir /mnt/backup/remote_backup# 备份 GPT 分区表
dd if=/dev/mmcblk0 bs=512 count=34 of=/mnt/backup/remote_backup/mmcblk0_GPT.bin conv=fsync# 备份引导分区
dd if=/dev/mmcblk0boot0 of=/mnt/backup/remote_backup/mmcblk0boot0.bin conv=fsync
dd if=/dev/mmcblk0boot1 of=/mnt/backup/remote_backup/mmcblk0boot1.bin conv=fsync# 备份其他分区
dd if=/dev/mmcblk0rpmb of=/mnt/backup/remote_backup/mmcblk0rpmb.bin conv=fsync
dd if=/dev/bootloader of=/mnt/backup/remote_backup/mmcblk0p1_bootloader.bin conv=fsync
dd if=/dev/reserved of=/mnt/backup/remote_backup/mmcblk0p2_reserved.bin conv=fsync
dd if=/dev/cache of=/mnt/backup/remote_backup/mmcblk0p3_cache.bin conv=fsync
dd if=/dev/env of=/mnt/backup/remote_backup/mmcblk0p4_env.bin conv=fsync
dd if=/dev/logo of=/mnt/backup/remote_backup/mmcblk0p5_logo.bin conv=fsync
dd if=/dev/recovery of=/mnt/backup/remote_backup/mmcblk0p6_recovery.bin conv=fsync
dd if=/dev/rsv of=/mnt/backup/remote_backup/mmcblk0p7_rsv.bin conv=fsync
dd if=/dev/tee of=/mnt/backup/remote_backup/mmcblk0p8_tee.bin conv=fsync
dd if=/dev/crypt of=/mnt/backup/remote_backup/mmcblk0p9_crypt.bin conv=fsync
dd if=/dev/misc of=/mnt/backup/remote_backup/mmcblk0p10_misc.bin conv=fsync
dd if=/dev/boot of=/mnt/backup/remote_backup/mmcblk0p11_boot.bin conv=fsync
dd if=/dev/system of=/mnt/backup/remote_backup/mmcblk0p12_system.bin conv=fsync
dd if=/dev/vendor of=/mnt/backup/remote_backup/mmcblk0p13_vendor.bin conv=fsync
dd if=/dev/odm of=/mnt/backup/remote_backup/mmcblk0p14_odm.bin conv=fsync