??在對設備進行固件分區備份之前,我們需要通過設備的 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