1 分钟阅读 次阅读

  • FireFly 官方提供的打包工具 ff_export_rootfs 不能指定打包的目录,只能指定打包后 .img 文件的输出目录。为了解决这个问题,我对脚本进行了修改,添加了 -s 参数,用于指定需要打包的源目录。 </br>
  • 此脚本适用于以下场景:在另一台机子上挂载根文件系统,修改后需要重新打包。

1 脚本信息

脚本名称hw_export_rootfs

使用步骤

  1. 将脚本复制到目标系统中
  2. 赋予执行权限

    chmod +x hw_export_rootfs
    
  3. 直接运行脚本(需指定路径):

    ./hw_export_rootfs
    
  4. 建议将脚本放入 PATH 环境变量包含的目录中,以便无需指定路径即可使用:

    • 查看当前 PATH

      echo $PATH
      
    • 将脚本移动到环境变量中的某个目录(如 /usr/local/bin):

      mv hw_export_rootfs /usr/local/bin
      
  5. 查看脚本的帮助信息

    hw_export_rootfs -h
    

2 使用说明

2.1 基本命令格式

hw_export_rootfs </path/to/store> [-s <source_path>] [-t <ext4|btrfs>] [-h]

2.2 参数说明

  • </path/to/store>:指定镜像文件的存储路径。
  • -s <source_path>:指定需要打包的源目录(默认为 /)。
  • -t <ext4|btrfs>:指定镜像文件的文件系统类型(默认为源目录的文件系统类型)。
  • -h:显示脚本的使用说明。

2.3 注意事项

  • 必须以 root 权限运行脚本

3 示例用法

  1. 指定输出路径和源目录

    sudo hw_export_rootfs /output/path -s /source/path
    
  2. 仅指定输出路径(使用默认源目录 /

    sudo hw_export_rootfs /output/path
    
  3. 指定文件系统类型

    hw_export_rootfs /output/path -s /source/path -t ext4
    



4 脚本关键修改内容解析

1. 变量默认值

SOURCE_PATH="/"
DEST_PATH=""
STORE_FS_TYPE=""
  • SOURCE_PATH:用于保存用户通过 -s 参数指定的源目录路径,默认为 /(即根目录)。
  • DEST_PATH:用于保存用户未加标志的第一个参数值,表示打包后 .img 文件的存储路径。
  • STORE_FS_TYPE:用于保存用户通过 -t 参数指定的文件系统类型(如 ext4btrfs),默认值为空,表示使用源目录的文件系统类型。

2. 参数解析逻辑

while [[ $# -gt 0 ]]; do
	case $1 in
		-s)
			SOURCE_PATH=$2
			shift 2
			;;
		-t)
			STORE_FS_TYPE=$2
			shift 2
			;;
		*)
			DEST_PATH=$1
			shift
			;;
	esac
done

工作原理

  • 使用 while [[ $# -gt 0 ]] 循环,逐个解析命令行参数,直到参数列表为空($# 为 0)。
  • case $1 in 分支结构匹配参数:
    • -s:匹配 -s 参数,表示指定源目录路径:
      • $2 的值(即 -s 后面的参数值)赋值给 SOURCE_PATH
      • 使用 shift 2 跳过当前的 -s 和其值。
    • -t:匹配 -t 参数,表示指定文件系统类型:
      • $2 的值(即 -t 后面的参数值)赋值给 STORE_FS_TYPE
      • 使用 shift 2 跳过当前的 -t 和其值。
    • *(默认分支):表示未匹配到带标志的参数:
      • $1 的值赋值给 DEST_PATH
      • 使用 shift 跳过当前参数。

参数解析结果

  • 未匹配的第一个参数会被视为 DEST_PATH,即 .img 文件的存储路径。
  • -s 后的参数会被赋值给 SOURCE_PATH
  • -t 后的参数会被赋值给 STORE_FS_TYPE

示例解析

hw_export_rootfs /output/path/rootfs.img -s /source/path -t ext4
  • $1 = /output/path/rootfs.imgDEST_PATH="/output/path/rootfs.img"
  • $1 = -s$2 = /source/pathSOURCE_PATH="/source/path"
  • $1 = -t$2 = ext4STORE_FS_TYPE="ext4"

解析结果:

  • DEST_PATH="/output/path/rootfs.img"
  • SOURCE_PATH="/source/path"
  • STORE_FS_TYPE="ext4"

3. 路径合法性检查

[[ -d $DEST_PATH ]] || { echo -e "\033[31m store path not exist \033[0m"; exit -1; }
[[ -d $SOURCE_PATH ]] || { echo -e "\033[31m source path $SOURCE_PATH does not exist or is not a directory \033[0m"; exit -1; }

功能解析

  • [[ -d $DEST_PATH ]]
    • 检查 DEST_PATH 是否是一个有效的目录路径。
    • 如果目录不存在,输出错误提示信息,并使用 exit -1 终止脚本。
  • [[ -d $SOURCE_PATH ]]
    • 检查 SOURCE_PATH 是否是一个有效的目录路径。
    • 如果目录不存在或不是一个目录,输出错误提示信息,并终止脚本。

提示信息

  • 使用 ANSI 转义序列 \033[31m 将错误信息显示为红色,\033[0m 用于重置颜色。
    • \033[31m:红色字体。
    • \033[0m:重置文字样式。

留下评论