根文件系统备份与重新烧录¶
本章主要介绍如何对根文件系统进行备份以及重新烧录, 备份的根文件系统可用于系统恢复与实际产品烧录等环节。
根文件系统备份¶
首先用户需要准备一个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插入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。
在开发板系统中,执行野火提供的系统备份脚本,该备份脚本已经在野火最新发布的系统镜像中提供, 具体路径为:/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:
系统备份成功后,拔下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行:提示用户文件系统备份完毕!