6. 根文件系统备份与重新烧录¶
对系统镜像镜像完整备份的好处是处理方便,步骤简单。但是完整备份的系统镜像体积较大且无法使用量产工具进行烧录。
如果我们仅对根文件系统做出了修改,则可以单独备份根文件系统分区。同理,如果我们对boot分区或其他分区做出了修改, 也可以单独备份相应的分区。但是在开发过程中,我们一般不去修改别的分区,所以这里重点讲解rootfs分区的备份,其他分区的备份及烧录方式也类似。
6.1. 备份前的准备工作¶
为了顺利的进行根文件系统的备份,我们先要做一些准备工作。
将烧录到eMMC或SD卡的RK格式镜像源文件解包,得到各个分区的镜像。
用于后期镜像处理的Linux PC或虚拟机
如果备份的是eMMC,则需要一张已经烧录了板卡通用备份镜像的SD卡。
6.2. 根文件系统备份¶
为了验证rootfs分区是否被正确备份,我们将桌面背景图片换为下图所示的图片。
接着操作以下步骤,再次启动时会自动扩展分区。
通用镜像 执行以下操作:
打开系统初始化脚本/etc/init.d/boot_init.sh,该脚本是初始化脚本,默认配置为了开机自启动。
1 | vim /etc/init.d/boot_init.sh
|
假定通用镜像的根文件系统分区为/dev/mmcblk0p3,可执行命令 df -h 进行确认,在系统初始化脚本末尾添加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #-------扩容------
#判断/boot/boot_dilatation_init文件是否存在,不存在则进行扩容
if [ ! -e "/boot/boot_dilatation_init" ] ;
then
#转换MBR -> GPT分区表
sgdisk -e /dev/mmcblk0
#修改/dev/mmcblk0p3根文件系统分区空间配置
printf 'yes\n-1\nyes' | parted /dev/mmcblk0 resizepart 3 ---pretend-input-tty
#根据配置重新分配空间
resize2fs /dev/mmcblk0p3
#创建判断文件,第二次启动存在该文件不再执行此扩容
touch /boot/boot_dilatation_init
fi
# 遍历eth0到eth3网口
for i in {0..3}; do
iface="eth$i"
# 检查接口是否存在
if ifconfig "$iface" &> /dev/null; then
# 判断是否是原生GMAC网口
if cat /sys/class/net/"$iface"/device/of_node/compatible | grep "gmac" &> /dev/null; then
# 原生GMAC网口使用rk工具——vendor_storage
# 判断/boot/boot_mac_ethX,不存在则进行随机mac
if [ ! -e "/boot/boot_mac_$iface" ] ; then
# 生成随机MAC地址
new_mac=$(printf '%01x2%02x%02x%02x%02x%02x' $((RANDOM%16)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)))
# 创建判断文件,第二次启动存在该文件则不再执行随机mac
touch /boot/boot_mac_$iface
# 保存随机生成的mac到判断文件中
echo "$new_mac" > /boot/boot_mac_$iface
# 获取生成的mac并修改
vendor_lan_mac=$vendor_lan_mac$(cat /boot/boot_mac_$iface)
# 使用vendor_storage工具固化修改原生GMAC网口MAC
vendor_storage -w VENDOR_LAN_MAC_ID -t hex -i "${vendor_lan_mac}"
# 确保第一次启动时生效,因为vendor_storage固化后需重启才能生效
ip link set dev "$iface" down
ifconfig "${iface}" hw ether "${new_mac}"
ip link set dev "$iface" up
fi
else
# 非原生网口每次启动都使用ifconfig修改mac
# 判断/boot/boot_mac_ethX,不存在则进行随机mac
if [ ! -e "/boot/boot_mac_$iface" ] ; then
# 生成随机MAC地址
new_mac=$(printf '%01x2:%02x:%02x:%02x:%02x:%02x' $((RANDOM%16)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)))
# 创建判断文件,第二次启动存在该文件则不再执行随机mac
touch /boot/boot_mac_$iface
# 保存随机生成的mac到判断文件中
echo "$new_mac" > /boot/boot_mac_$iface
fi
ip link set dev "$iface" down
# 获取生成的mac并修改
mac_address=$(cat /boot/boot_mac_$iface)
ifconfig $iface hw ether $mac_address
ip link set dev "$iface" up
fi
fi
done
|
插入烧录了板卡通用备份镜像的SD卡,从SD卡启动系统。 如果是备份SD卡上的rootfs分区的话,这一步就是将要备份的SD卡插入Linux PC。
打开gparted磁盘管理工具,卸载并压缩要备份的rootfs分区。
应用我们做出的修改,缩小rootfs的体积
使用 mkdir 命令创建一个新的目录,用于存放从带镜像的SD卡中拷贝的镜像。
然后使用 dd 命令将带镜像的SD中的镜像拷贝到新创建的目录中,这里我们选择挂载的U盘。
刚才在压缩分区时我们得知eMMC的rootfs分区就是/dev/mmcblk0p6分区
1 2 3 4 5 6 7 8 9 10 | #挂载U盘
mount /dev/sda1 /mnt/udisk/
#将带镜像的SD卡中的镜像拷贝到创建的目录中
dd if=/dev/mmcblk0p6 of=/mnt/udisk/backup-rootfs.img bs=1024k conv=sync
#拷贝需要时间,请耐心等待,打印消息如下
3400+0 records in
3400+0 records out
3565158400 bytes (3.6 GB, 3.3 GiB) copied, 185.89 s, 19.2 MB/s
|
备份完成后我们poweroff命令关机,移除U盘,这样我们就得到了单独的rootfs.img分区镜像。
我们可以选择直接用开发工具进行分区烧录,也可以将备份的rootfs.img与其他分区合并成一个完整的镜像。
6.3. 分区烧录¶
使用开发工具导入对应的分区表,然后依次选择RK格式完整镜像解包后的各个分区镜像, 注意rootfs分区要选择我们刚刚备份得到的backup-rootfs.img镜像文件,然后进行烧录。
6.4. 打包成完整镜像后烧录¶
打开我们的打包工具,将之前解包的分区镜像和刚刚备份的backup-rootfs.img复制到Image目录下, 并将backup-rootfs.img重命名为rootfs.img替换原来的文件,然后运行rk356x-mkupdate.sh打包完整镜像。
将打包后的完整镜像update.img烧录到板卡中。
6.5. 验证修改结果¶
重新烧录镜像后,默认桌面背景仍然是我们原来修改的图片。
