根文件系统备份与重新烧录

本章主要介绍如何对根文件系统进行备份以及重新烧录, 备份的根文件系统可用于系统恢复与实际产品烧录等环节。

根文件系统备份

  1. 首先用户需要准备一个u盘或者是sd卡(在备份的过程中SD卡或U盘将被格式化), 注意u盘/sd卡的容量一定要比当前系统占用的磁盘空间要大, 否则备份过程将会失败。用户可通过在控制台终端输入以下命令,查看当前系统大小:

    df -h
    
    #打印信息如下
    Filesystem      Size  Used Avail Use% Mounted on
    udev             82M     0   82M   0% /dev
    tmpfs            49M  1.6M   48M   4% /run
    /dev/mmcblk0p2  7.2G  425M  6.4G   7% /
    tmpfs           244M     0  244M   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           244M     0  244M   0% /sys/fs/cgroup
    tmpfs            40K     0   40K   0% /mnt/.psplash
    /dev/mmcblk0p1   40M   17M   23M  43% /boot
    

    其中 / 表示当前系统占用425M硬盘空间,用户需要确保u盘/sd卡容量大于425M

  2. 插入u盘,确保当前系统识别到相应设备文件,设备文件为:/dev/sdx(x为具体英文字母), 如果系统只有一个u盘设备,那么该设备文件通常为:/dev/sda,用户可通过输入以下命令确认:

    lsblk
    
    #打印消息
    
    NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda            8:0    1 14.9G  0 disk
    └─sda1         8:1    1 14.9G  0 part
    mmcblk1      179:0    0  7.3G  0 disk
    ├─mmcblk1p1  179:1    0   40M  0 part
    └─mmcblk1p2  179:2    0  7.2G  0 part
    mmcblk1boot0 179:8    0    4M  1 disk
    mmcblk1boot1 179:16   0    4M  1 disk
    mmcblk0      179:24   0  7.4G  0 disk
    ├─mmcblk0p1  179:25   0   40M  0 part /boot
    └─mmcblk0p2  179:26   0  7.4G  0 part /
    

    通过设备容量可以看出U盘的设备为sda,也可以通过U盘插入前后的设备变化确定U盘的设备。

    提示

    若是直接使用板载的SD卡槽,相应的设备文件则为:/dev/mmcblk0。

  3. 在开发板系统中,执行野火提供的系统备份脚本,该备份脚本已经在野火最新发布的系统镜像中提供, 具体路径为:/opt/scripts/tools/backup/backup_rootfs.sh

    用户执行该脚本时,需要输入u盘的设备文件作为参数,如以下命令所示:

    sudo /opt/scripts/tools/backup/backup_rootfs.sh /dev/sda
    

    执行该文件后,系统将自动开始备份,在此过程中将不断打印提示消息,结束时打印消息如下。

    ./boot/
    ./boot/fire.ico
    ./dtbs/
     ./dtbs/overlays/
    ./kernel/
    ./kernel/System.map-4.19.35-imx6
    ./kernel/config-4.19.35-imx6
    ./kernel/initrd.img-4.19.35-imx6
    ./kernel/vmlinuz-4.19.35-imx6
    ./uboot/
    ./uEnv.txt
    ./ID.txt
    ./SOC.sh
    ./autorun.inf
    /root
    roofs backup finished!!
    [ 2033.946576]  sda:
    
  4. 系统备份成功后,拔下u盘,查入到windows电脑上,可查看到rootfs.tar与boot.tar文件, 分别对应系统根文件系统和/boot分区的两个文件。

提示

备份得到的rootfs.tar能够在linux下使用tar解压修改后再重新打包。

mfg工具烧录rootfs.tar

将rootfs.tar文件拷贝到 mfgtools-release/Profiles/Linux/OS Firmware/release 目录下, 修改 mfgtools-release 目录下的 cfg.ini 文件,找到 my_rootfs 开头那行并在前面添加#注释。 添加 my_rootfs=rootfs.tar ,如下所示

1
2
3
4
5
6
7
8
9
files_dir = release
my_zImage=zImage
my_uboot=u-boot-mmc.imx
my_bootpart=boot.tar
my_rootfs=rootfs.tar
#my_rootfs=console-armhf-rootfs-lubancat-carp.tar
#my_rootfs=qt-armhf-rootfs-lubancat-carp.tar
#my_rootfs=console-armhf-rootfs-ubuntu-bionic.tar
#my_rootfs=console-armhf-rootfs-ubuntu-focal.tar

修改后保存,打开mfg工具重新烧写系统即可。

提示

若修改了 /boot分区 下的文件内容同样也需要将boot.tar拷贝到 mfgtools-release/Profiles/Linux/OS Firmware/release 目录下。

备份脚本讲解

backup_rootfs.sh脚本的内容如下所示:

 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
#!/bin/sh -e


 _exit_trap() {
    umount ${tmp_rootfs_dir}
    rmdir ${tmp_rootfs_dir}
}

_err_trap() {
     umount ${tmp_rootfs_dir}
     rmdir ${tmp_rootfs_dir}
 }

 dpkg -l | grep exfat-fuse || deb_pkgs="${deb_pkgs}exfat-fuse "
 dpkg -l | grep exfat-utils || deb_pkgs="${deb_pkgs}exfat-utils "

 if [ "${deb_pkgs}" ] ; then
     echo "Installing: ${deb_pkgs}"
     sudo apt-get update
     sudo apt-get -y install ${deb_pkgs}
 fi

 tmp_rootfs_dir=/mnt/rootfs_backup

 if [ $# -gt 0 ]; then
     DEV="$1"
 else
     echo "please input a storage device!"
     exit 0
  fi

 mkfs.exfat -n rootfs $DEV

 trap _exit_trap EXIT
 trap _err_trap ERR

 if [ ! -d ${tmp_rootfs_dir} ] ; then
     mkdir ${tmp_rootfs_dir}
 fi

 mount -t exfat $DEV $tmp_rootfs_dir

 tar -cvf ${tmp_rootfs_dir}/rootfs.tar --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/boot} /*

 echo "roofs backup finished!!"
  • 第1行:表示使用sh解释器解析该脚本,-e参数代表命令一旦执行出错,脚本马上停止执行。

  • 第4~12行:设置脚本执行错误和退出时应当执行的函数,这里主要是卸载和删除临时挂载目录。

  • 第14~21行:判断系统是否安装了exfat-fuse和exfat-utils两个工具包。这里通过u盘备份获取的根文件系统, 用户最终还需要在windows平台上重新烧录到其他芯片。因此,为方便在windows平台上从u盘拷贝出根文件系统, u盘应当格式化为exfat文件系统,该文件系统格式可以直接被windows平台识别。但是,在linux系统中挂载和 格式化exfat文件系统,则需要使用上面的两个工具。如果系统未安装这两个工具包,应该使用apt工具进行安装。

  • 第23行:设置u盘挂载时使用的临时文件夹。

  • 第25~30行:判断执行脚本的传参,这里需要传入u盘相关设备文件。

  • 第32行:以exfat格式化u盘设备。

  • 第34~35行:捕捉脚本执行错误和退出的信号,如果捕捉成功,则执行相应处理函数。

  • 第37~41行:创建临时文件夹,并挂载u盘设备。

  • 第43行:用tar工具打包当前根文件系统。注意,当前系统目录有一系列虚拟文件系统和临时文件,用户无需备份, 用–exclude参数排除这部分目录和文件即可。打包得到的根文件系统命令为rootfs.tar。

  • 第45行:提示用户文件系统备份完毕!