尚未完成,谨慎参考。。。后面成功之后会在把步骤优化一下
目录
[A. 插入空白SD卡](#A. 插入空白SD卡)
[B. 确认设备名](#B. 确认设备名)
[1. 硬件兼容性检查](#1. 硬件兼容性检查)
[2. 镜像完整性检查](#2. 镜像完整性检查)
[3. 目标板备份(极其重要!)](#3. 目标板备份(极其重要!))
一、准备工作
1、
源设备和目标设备都是同一型号(香橙派5 Pro RK3588S),并且你有一个大容量的外部存储(128G SD卡挂载在 /media/orangepi/6661-3031),那么完全可以在这块香橙派上完成所有工作,无需x86电脑
2、核心思路
利用挂载的128G SD卡作为工作盘和存储盘,直接在源香橙派5 Pro上完成系统备份、处理,并最终烧录到新卡
二、
步骤一:准备工作与环境检查
1、确认存储 :确保挂载在 /media/orangepi/6661-3031 的128G SD卡有足够空间(应大于你系统已使用的空间,而非总容量)。在终端查看:
df -h /media/orangepi/6661-3031
2、切换到工作目录:所有操作都在这个外置存储上进行,避免占用内部存储
cd /media/orangepi/6661-3031
步骤二:生成原始系统镜像
这个镜像会包含整个系统盘(包括bootloader、内核、系统分区)的所有数据sudo apt clean # 清理软件包缓存 (可以跳过这一步不清理)
sudo journalctl --vacuum-time=3d # 清理3天前的系统日志
rm -rf ~/.cache/* # 清理用户缓存
# 2. 确认存储空间(应显示约119G可用)
df -h .
2.关键:找到系统根分区设备 :
这是最重要的一步,绝对不能搞错。运行:
lsblk -f
(base) orangepi@orangepi5pro:/media/orangepi/6661-3031$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
mmcblk1
│
├─mmcblk1p1
│ vfat FAT32 opi_boot
│ EF67-BD3B 899.5M 12% /boot
└─mmcblk1p2
ext4 1.0 opi_root
140be987-4b3c-4ea1-a96f-80e84c822007 17.2G 35% /var/log.hdd
/
mmcblk1boot0
mmcblk1boot1
mmcblk0
│
└─mmcblk0p1
exfat 1.0 6661-3031 119.1G 0% /media/orangepi/6661-3031
zram0
SWAP
zram1
171.4M 1% /var/log
(base) orangepi@orangepi5pro:/media/orangepi/6661-3031$
从输出可以清楚看到:
-
系统根设备是
/dev/mmcblk1:- 根目录
/挂载在mmcblk1p2分区上,这证实该系统是从 eMMC 启动的。需要备份的整个设备就是/dev/mmcblk1(包含p1和p2两个分区)。
- 根目录
-
128G外置SD卡是
/dev/mmcblk0:- 它被格式化为exFAT,挂载在
/media/orangepi/6661-3031,有119G可用空间,足够存放备份镜像
- 它被格式化为exFAT,挂载在
可以100%确定目标设备是 /dev/mmcblk1
# 确保在128G外置卡目录
cd /media/orangepi/6661-3031
# 开始备份整个eMMC(mmcblk1)
sudo dd if=/dev/mmcblk1 of=./orangepi5pro_emmc_backup.img bs=4M status=progress
预计时间:这会将整个eMMC(比如32GB或64GB)的数据复制出来。根据eMMC速度和容量,可能需要20-60分钟
验证备份 检查备份文件ls -lh orangepi5pro_emmc_backup.img
sudo fdisk -l orangepi5pro_emmc_backup.img1. 文件大小正常
显示两个分区
关键细节:
-
if=/dev/mmcblk1:绝对正确,备份整个eMMC设备 -
生成的文件约为eMMC总容量(如32GB/64GB)
-
过程中可按
Ctrl+T查看进度
步骤3:安装必要工具(在源香橙派上)
sudo apt update && sudo apt install -y e2fsprogs util-linux
步骤4:手动压缩镜像(代替PiShrink)
以下是手动压缩的完整流程,我将其写成一个脚本方便执行:
已经生成的 orangepi5pro_emmc_backup.img 文件
cd /media/orangepi/6661-3031
# 创建针对已存在镜像的压缩脚本
cat > shrink_existing_image.sh << 'EOF'
#!/bin/bash
# 压缩已存在的香橙派镜像脚本
INPUT_IMG="orangepi5pro_emmc_backup.img"
OUTPUT_IMG="orangepi5pro_final.img"
echo "=== 检查现有镜像 ==="
ls -lh "$INPUT_IMG"
sudo fdisk -l "$INPUT_IMG"
echo -e "\n=== 获取分区信息 ==="
# 获取第二个分区(系统分区)信息
PARTITION_INFO=$(sudo fdisk -l "$INPUT_IMG" | grep "img2")
if [ -z "$PARTITION_INFO" ]; then
# 尝试其他可能的分区标识
PARTITION_INFO=$(sudo fdisk -l "$INPUT_IMG" | grep "Linux filesystem" | tail -1)
fi
echo "分区信息: $PARTITION_INFO"
# 提取起始扇区
START_SECTOR=$(echo "$PARTITION_INFO" | awk '{print $2}')
SECTOR_SIZE=512
OFFSET=$((START_SECTOR * SECTOR_SIZE))
echo "系统分区起始扇区: $START_SECTOR"
echo "偏移量: $OFFSET 字节"
echo -e "\n=== 挂载系统分区 ==="
sudo losetup -f --show -o $OFFSET "$INPUT_IMG"
LOOP_DEV=$(sudo losetup -j "$INPUT_IMG" | grep offset | cut -d: -f1)
echo "使用的loop设备: $LOOP_DEV"
echo -e "\n=== 检查并修复文件系统 ==="
sudo e2fsck -pf "$LOOP_DEV"
CHECK_RESULT=$?
if [ $CHECK_RESULT -eq 0 ] || [ $CHECK_RESULT -eq 1 ]; then
echo "文件系统检查通过"
else
echo "文件系统有错误,尝试修复..."
sudo e2fsck -fy "$LOOP_DEV"
fi
echo -e "\n=== 缩小文件系统到最小 ==="
sudo resize2fs -M "$LOOP_DEV"
echo -e "\n=== 获取缩小后的块信息 ==="
TUNE2FS_OUTPUT=$(sudo tune2fs -l "$LOOP_DEV" 2>/dev/null)
BLOCK_SIZE=$(echo "$TUNE2FS_OUTPUT" | grep "Block size:" | awk '{print $3}')
BLOCK_COUNT=$(echo "$TUNE2FS_OUTPUT" | grep "Block count:" | awk '{print $3}')
echo "块大小: $BLOCK_SIZE 字节"
echo "块数量: $BLOCK_COUNT"
# 计算文件系统实际大小(字节)
FS_SIZE=$((BLOCK_SIZE * BLOCK_COUNT))
# 计算需要的扇区数(每个扇区512字节)
FS_SECTORS=$(( (FS_SIZE + SECTOR_SIZE - 1) / SECTOR_SIZE ))
echo "文件系统需要扇区数: $FS_SECTORS"
echo -e "\n=== 卸载loop设备 ==="
sudo losetup -d "$LOOP_DEV"
echo -e "\n=== 创建新镜像文件 ==="
# 计算新分区结束扇区(预留2048扇区空间)
NEW_END=$((START_SECTOR + FS_SECTORS + 2048))
echo "新分区结束扇区: $NEW_END"
# 1. 复制MBR和分区表(前2048扇区,约1MB)
dd if="$INPUT_IMG" of="$OUTPUT_IMG" bs=512 count=2048 status=progress
echo -e "\n=== 调整分区表 ==="
# 使用fdisk调整第二个分区大小
cat << FDISK_CMDS | sudo fdisk "$OUTPUT_IMG"
d
2
n
p
2
$START_SECTOR
$NEW_END
n
p
w
FDISK_CMDS
echo -e "\n=== 复制文件系统数据 ==="
dd if="$INPUT_IMG" bs=512 skip=$START_SECTOR count=$FS_SECTORS | \
dd of="$OUTPUT_IMG" bs=512 seek=$START_SECTOR conv=notrunc status=progress
echo -e "\n=== 扩展文件系统到分区大小 ==="
# 重新设置loop设备
sudo losetup -f --show -o $OFFSET "$OUTPUT_IMG"
NEW_LOOP_DEV=$(sudo losetup -j "$OUTPUT_IMG" | grep offset | cut -d: -f1)
# 检查并扩展文件系统
sudo e2fsck -pf "$NEW_LOOP_DEV"
sudo resize2fs "$NEW_LOOP_DEV"
# 最后检查
sudo fsck -y "$NEW_LOOP_DEV"
# 清理
sudo losetup -d "$NEW_LOOP_DEV"
echo -e "\n=== 完成! ==="
echo "原始镜像大小: $(du -h "$INPUT_IMG" | cut -f1)"
echo "压缩后镜像大小: $(du -h "$OUTPUT_IMG" | cut -f1)"
echo "节省空间: $(echo "scale=1; (1 - $(du -k "$OUTPUT_IMG" | cut -f1) / $(du -k "$INPUT_IMG" | cut -f1)) * 100" | bc)%"
# 验证镜像结构
echo -e "\n=== 验证镜像结构 ==="
sudo fdisk -l "$OUTPUT_IMG"
EOF
# 赋予执行权限
chmod +x shrink_existing_image.sh
# 运行脚本
sudo ./shrink_existing_image.sh
步骤5:压缩镜像(dd完成后执行)
# 使用PiShrink自动收缩并压缩
# 1. 查看分区信息
sudo fdisk -l orangepi5pro_emmc_backup.img
# 记录:img2的Start值(如2158592)
# 2. 挂载系统分区
OFFSET=$((2158592 * 512))
sudo losetup -f --show -o $OFFSET orangepi5pro_emmc_backup.img
LOOP_DEV=$(sudo losetup -a | grep "offset" | grep "backup" | awk -F: '{print $1}')
# 3. 检查并压缩文件系统
sudo e2fsck -pf $LOOP_DEV
sudo resize2fs -M $LOOP_DEV
# 4. 获取压缩后信息
sudo tune2fs -l $LOOP_DEV | grep -E "(Block count|Block size)"
# 记录:Block count和Block size
完成后:
-
得到
orangepi5pro_emmc_backup.img -
可删除原始文件释放空间:
第四阶段:创建新镜像(关键步骤)
# 1. 计算参数
BLOCK_COUNT=2973220 # 实际获取的值
BLOCK_SIZE=4096 # 实际获取的值
FS_SIZE=$((BLOCK_COUNT * BLOCK_SIZE))
FS_SECTORS=$(( (FS_SIZE + 511) / 512 ))
START_SECTOR=2158592 # 实际获取的值
NEW_END=$((START_SECTOR + FS_SECTORS + 2048))
TOTAL_MB=$(( (NEW_END + 2048) * 512 / 1024 / 1024 ))
# 2. 创建空白镜像
dd if=/dev/zero of=orangepi5pro_final.img bs=1M count=$TOTAL_MB status=progress
# 3. 复制引导分区
dd if=orangepi5pro_emmc_backup.img of=orangepi5pro_final.img bs=512 count=$START_SECTOR conv=notrunc status=progress
# 4. 创建GPT分区表
cat << EOF | sudo fdisk orangepi5pro_final.img
g
n
1
61440
2158591
n
2
2158592
$NEW_END
w
EOF
# 5. 复制系统数据
sudo losetup -f --show -o $OFFSET orangepi5pro_emmc_backup.img
ORIG_LOOP=$(sudo losetup -a | grep "backup" | grep "offset" | awk -F: '{print $1}')
dd if=$ORIG_LOOP of=orangepi5pro_final.img bs=512 seek=$START_SECTOR skip=$START_SECTOR count=$FS_SECTORS conv=notrunc status=progress
sudo losetup -d $ORIG_LOOP
第五阶段:优化新镜像
# 1. 扩展文件系统
sudo losetup -f --show -o $OFFSET orangepi5pro_final.img
NEW_LOOP=$(sudo losetup -a | grep "final" | grep "offset" | awk -F: '{print $1}')
sudo resize2fs $NEW_LOOP
# 2. 清理硬件信息
sudo mount $NEW_LOOP /mnt
sudo rm -f /mnt/etc/udev/rules.d/70-persistent-net.rules
sudo rm -f /mnt/etc/ssh/ssh_host_*
echo "uninitialized" | sudo tee /mnt/etc/machine-id
sudo umount /mnt
sudo losetup -d $NEW_LOOP
第六阶段:烧录测试
# 1. 插入空白SD卡,确认设备名(如/dev/sdb)
sudo lsblk
# 2. 烧录
sudo dd if=orangepi5pro_final.img of=/dev/sdb bs=4M status=progress conv=fsync
# 3. 在新香橙派5 Pro上测试
三、
orangepi5pro_emmc_backup.img
orangepi5pro_final.img
shrink_existing_image.sh
现在已经完成生成这三个文件,接下来的步骤
第一步:检查最终镜像状态
cd /media/orangepi/6661-3031
# 检查最终镜像
ls -lh orangepi5pro_final.img
sudo fdisk -l orangepi5pro_final.img
输出:
-
orangepi5pro_final.img的文件大小是多少 -
fdisk显示的分区信息是什么
(base) orangepi@orangepi5pro:/media/orangepi/6661-3031$ ls -lh orangepi5pro_final.img
sudo fdisk -l orangepi5pro_final.img
-rwxr-xr-x 1 orangepi orangepi 14G 12月 20 11:13 orangepi5pro_final.img
sudo\] orangepi 的密码: Disk orangepi5pro_final.img:13.61 GiB,14612955136 字节,28540928 个扇区 单元:扇区 / 1 \* 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:gpt 磁盘标识符:063BEFB7-91B2-0B4D-B723-111C205CB05B 设备 起点 末尾 扇区 大小 类型 orangepi5pro_final.img1 61440 2158591 2097152 1G Linux 文件系统 orangepi5pro_final.img2 2158592 25946400 23787809 11.3G Linux 文件系统 (base) orangepi@orangepi5pro:/media/orangepi/6661-3031$
现在进入最终步骤
第一步:通用化处理(清理硬件信息)
cd /media/orangepi/6661-3031
# 1. 挂载系统分区(第二分区)
OFFSET=$((2158592 * 512))
sudo mkdir -p /mnt/img_root
sudo mount -o loop,offset=$OFFSET orangepi5pro_final.img /mnt/img_root
# 2. 清理硬件特定文件
echo "清理硬件信息..."
sudo rm -f /mnt/img_root/etc/udev/rules.d/70-persistent-net.rules
sudo rm -f /mnt/img_root/etc/ssh/ssh_host_*
sudo rm -f /mnt/img_root/etc/machine-id
echo "uninitialized" | sudo tee /mnt/img_root/etc/machine-id
# 3. 可选:清理临时文件
sudo rm -rf /mnt/img_root/tmp/*
sudo rm -rf /mnt/img_root/var/tmp/*
# 4. 卸载
sudo umount /mnt/img_root
sudo rmdir /mnt/img_root
echo "镜像清理完成!"
第二步:准备烧录到SD卡
A. 插入空白SD卡
-
准备一张至少16GB的空白SD卡
-
通过读卡器插入香橙派USB口
B. 确认设备名
# 插入前查看当前设备
sudo lsblk
# 插入SD卡后再查看
sudo lsblk
找到新增的设备,通常是:
-
/dev/sda(USB读卡器) -
/dev/mmcblk2(SD卡槽)
重要 :确认不是 /dev/mmcblk1(你的系统盘)!
(base) orangepi@orangepi5pro:/media/orangepi/6137-3232$ sudo lsblk
sudo\] orangepi 的密码: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS mmcblk1 179:0 0 28.9G 0 disk ├─mmcblk1p1 179:1 0 1G 0 part /boot └─mmcblk1p2 179:2 0 27.6G 0 part /var/log.hdd / mmcblk1boot0 179:32 0 4M 1 disk mmcblk1boot1 179:64 0 4M 1 disk mmcblk0 179:96 0 119.1G 0 disk └─mmcblk0p1 179:97 0 119.1G 0 part /media/orangepi/6661-3031 zram0 254:0 0 3.9G 0 disk \[SWAP
zram1 254:1 0 200M 0 disk /var/log
(base) orangepi@orangepi5pro:/media/orangepi/6137-3232$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 1 119.1G 0 disk
└─sdb1 8:17 1 119.1G 0 part
mmcblk1 179:0 0 28.9G 0 disk
├─mmcblk1p1 179:1 0 1G 0 part /boot
└─mmcblk1p2 179:2 0 27.6G 0 part /var/log.hdd
/
mmcblk1boot0 179:32 0 4M 1 disk
mmcblk1boot1 179:64 0 4M 1 disk
mmcblk0 179:96 0 119.1G 0 disk
└─mmcblk0p1 179:97 0 119.1G 0 part /media/orangepi/6661-3031
zram0 254:0 0 3.9G 0 disk [SWAP]
zram1 254:1 0 200M 0 disk /var/log
(base) orangepi@orangepi5pro:/media/orangepi/6137-3232$
可以清楚地看到:
设备识别结果
插入SD卡前:
-
mmcblk1:你的系统盘(eMMC) -
mmcblk0:128G外置卡(工作盘)
插入SD卡后新增:
sdb:新插入的空白SD卡(119.1G)
确认目标设备:/dev/sdb
现在执行完整烧录流程
第一步:返回工作目录并清理镜像
# 返回存放镜像的目录
cd /media/orangepi/6661-3031
# 通用化处理(如果还没做)
OFFSET=$((2158592 * 512))
sudo mkdir -p /mnt/img_root
sudo mount -o loop,offset=$OFFSET orangepi5pro_final.img /mnt/img_root
# 清理硬件信息
sudo rm -f /mnt/img_root/etc/udev/rules.d/70-persistent-net.rules
sudo rm -f /mnt/img_root/etc/ssh/ssh_host_*
sudo rm -f /mnt/img_root/etc/machine-id
echo "uninitialized" | sudo tee /mnt/img_root/etc/machine-id
# 卸载
sudo umount /mnt/img_root
sudo rmdir /mnt/img_root
echo "✅ 镜像清理完成"
第二步:烧录到SD卡
# 重要:确认目标设备
TARGET_DEV="/dev/sdb"
echo "目标设备: $TARGET_DEV"
# 检查目标设备是否正确
sudo fdisk -l $TARGET_DEV
# 应该显示空白或已有分区的信息
# 开始烧录(使用dd命令)
echo "开始烧录14GB镜像到SD卡..."
echo "预计时间:3-5分钟"
sudo dd if=orangepi5pro_final.img of=$TARGET_DEV bs=4M status=progress conv=fsync
# 等待完成
sync
echo "✅ 烧录完成!"
第三步:验证烧录结果
# 检查SD卡分区
sudo fdisk -l $TARGET_DEV
# 应该显示:
# 设备 起点 末尾 扇区 大小 类型
# /dev/sdb1 61440 2158591 2097152 1G Linux 文件系统
# /dev/sdb2 2158592 25946400 23787809 11.3G Linux 文件系统
# 检查文件系统
sudo fsck.ext4 -n ${TARGET_DEV}2
第四步:安全移除SD卡
# 确保所有数据写入
sync
# 等待10秒
sleep 10
echo "可以安全拔出SD卡了"
echo "物理拔出后插入新香橙派5 Pro"
四、在新板上启动测试
硬件连接:
-
插入SD卡:到新香橙派5 Pro的SD卡槽
-
连接外设:
-
电源(5V/4A适配器)
-
HDMI显示器
-
USB键盘
-
网线(可选)
-
启动过程:
首次启动时间线:
0-30秒:U-Boot启动,LED闪烁
30-90秒:内核启动,系统扩展文件系统
90-180秒:进入登录界面
五、
如果不是新开发板需要覆盖
方案A:直接DD覆盖(最彻底)
适用场景:目标板系统问题严重,需要完全重置
# 在新板(目标板)上操作步骤:
# 1. 将你的镜像SD卡通过读卡器插入目标板USB口
# 2. 确认设备名(假设为/dev/sda)
sudo lsblk
# 3. 确认目标板eMMC设备(通常是/dev/mmcblk1)
# 绝对不要搞错!
# 4. 开始覆盖(示例,请根据实际情况调整)
sudo dd if=/dev/sda1 of=/dev/mmcblk1 bs=4M status=progress conv=fsync
# 或直接使用镜像文件
sudo dd if=/media/orangepi/xxx/orangepi5pro_final.img of=/dev/mmcblk1 bs=4M status=progress conv=fsync
# 5. 重启
sudo reboot
方案B:只替换系统分区(更安全)
适用场景:保留用户数据,只修复系统环境
# 1. 挂载你的镜像和目标板系统
# 挂载你的镜像系统分区
sudo mount /dev/sda2 /mnt/source
# 挂载目标板系统分区
sudo mount /dev/mmcblk1p2 /mnt/target
# 2. 备份目标板重要数据
sudo cp -r /mnt/target/home/orangepi /备份位置/
# 3. 清理目标板系统但保留home
sudo rm -rf /mnt/target/{etc,usr,var,lib,opt,sbin,bin,boot} 2>/dev/null
# 4. 复制新系统(排除home)
sudo cp -a /mnt/source/{etc,usr,var,lib,opt,sbin,bin,boot} /mnt/target/
# 5. 卸载
sudo umount /mnt/source /mnt/target
1. 硬件兼容性检查
# 在你的镜像系统和目标板系统都运行:
cat /proc/cpuinfo | grep "model name"
cat /proc/device-tree/model
uname -a
# 比较结果,确保:
# - 都是香橙派5 Pro (RK3588S)
# - 内核版本相近
# - 架构相同(aarch64)
2. 镜像完整性检查
# 检查你的镜像
sudo fdisk -l orangepi5pro_final.img
# 应该有2个分区:1G的boot和11G的系统分区
# 检查是否可以挂载
sudo mount -o loop,offset=$((2158592*512)) orangepi5pro_final.img /mnt/test
ls /mnt/test
sudo umount /mnt/test
3. 目标板备份(极其重要!)
# 在目标板上备份当前状态
# A. 备份重要文件
sudo tar czf /tmp/backup_home.tar.gz /home/orangepi
sudo tar czf /tmp/backup_etc.tar.gz /etc
# B. 备份整个系统(如果空间足够)
sudo dd if=/dev/mmcblk1 of=/tmp/full_backup.img bs=4M status=progress
# C. 备份到外部存储
# 插入U盘或通过网络传输