• remk_image.sh


    remk_image.sh

    #!/usr/bin/env bash
    #filename: remk_image.sh
    
    #set -x
    
    SCRIPT_NAME=$(basename "$0")
    SCRIPT_DIR=$(cd "$(dirname "$0")";pwd)
    CUR_DIR=$(pwd)
    
    Usage1() {
        echo "Usage: ${SCRIPT_NAME} [hexzci:r:s:k:o:]"
        echo "Options:"
        echo "    -h --- This help text"
        echo "    -e --- Extract rootfs from image"
        echo "    -x --- Unpack squashfs"
        echo "    -z --- Pack squashfs"
        echo "    -c --- Create new image from rootfs and vminux"
        echo "    -i <image_path_name> --- image file path and name"
        echo "    -r <rootfs_path_name> --- rootfs file path and name"
        echo "    -s <squashfs_path> --- Squashfs path"
        echo "    -k <vminux_path_name> --- vminux file path and name"
        echo "    -o <output_path> --- Output file path(rootfs or image)"
        echo "Examples:"
        echo "    ${SCRIPT_NAME} -e -i ./acu100e/acu100e-image.bin -o ./acu100e"
        echo "    ${SCRIPT_NAME} -x -r ./acu100e/acu100e-rootfs.bin -o ./acu100e"
        echo "    ${SCRIPT_NAME} -z -s ./acu100e/squashfs-root -o ./acu100e"
        echo "    ${SCRIPT_NAME} -c -k ./acu100e/acu100e-vmlinux.bin -r ./acu100e/acu100e-new-rootfs.bin -o ./acu100e"
        return 0
    }
    
    Usage2() {
        echo "用法: ${SCRIPT_NAME} [hexzci:r:s:k:o:]"
        echo "选项:"
        echo "    -h --- 显示帮助信息"
        echo "    -e --- 从镜像中提取rootfs"
        echo "    -x --- 解包squashfs"
        echo "    -z --- 打包squashfs"
        echo "    -c --- 从rootfs和vminux创建新image"
        echo "    -i <image_path_name> --- image文件路径和文件名"
        echo "    -r <rootfs_path_name> --- rootfs文件路径和文件名"
        echo "    -s <squashfs_path> --- squashfs路径"
        echo "    -k <vminux_path_name> --- vminux文件路径和文件名"
        echo "    -o <output_path> --- 输出文件路径(rootfs或image)"
        echo "示例:"
        echo "    ${SCRIPT_NAME} -e -i ./acu100e/acu100e-image.bin -o ./acu100e"
        echo "    ${SCRIPT_NAME} -x -r ./acu100e/acu100e-rootfs.bin -o ./acu100e"
        echo "    ${SCRIPT_NAME} -z -s ./acu100e/squashfs-root -o ./acu100e"
        echo "    ${SCRIPT_NAME} -c -k ./acu100e/acu100e-vmlinux.bin -r ./acu100e/acu100e-new-rootfs.bin -o ./acu100e"
        return 0
    }
    
    Usage() {
        local iszh=$(env | grep "LANG=" | grep "zh")
        if [ -z "${iszh}"  ]; then
            Usage1
        else
            Usage2
        fi
    }
    
    work_mode=''
    output_path=''
    output_vmlinux=''
    output_rootfs=''
    output_squashfs=''
    output_image=''
    
    input_image=''
    input_vmlinux=''
    input_rootfs=''
    input_squashfs=''
    
    if [ $# -lt 1 ]; then
        Usage
        exit 1
    fi
    
    while getopts "hexzci:r:s:k:o:" opt ; do
        case "$opt" in
        'h')
            Usage
            exit 0
            ;;
        'e')
            work_mode='extract'
            output_vmlinux='output_vmlinux.bin'
            output_rootfs='output_rootfs.bin'
            ;;
        'x')
            work_mode='unpack'
            output_squashfs='squashfs-root'
            ;;
        'z')
            work_mode='pack'
            output_rootfs='output_new_rootfs.bin'
            ;;
        'c')
            work_mode='create'
            output_image='output_new_image.bin'
            ;;
        'i')
            input_image="${OPTARG}"
            ;;
        'r')
            input_rootfs="${OPTARG}"
            ;;
        's')
            input_squashfs="${OPTARG}"
            ;;
        'k')
            input_vmlinux="${OPTARG}"
            ;;
        'o')
            output_path="${OPTARG}"
            ;;
        *)
            Usage
            exit 1
            ;;
        esac
    done
    
    die()
    {
        echo "Die: $@"
        exit 15
    }
    
    extract_rootfs()
    {
        if [ $# -ne 4 ]; then
            echo "Error: parameter is incorrect."
            return 1
        fi
        
        local local_image local_vmlinux local_rootfs local_output
        local_image=$(readlink -f "$1")
        local_vmlinux=$2
        local_rootfs=$3
        local_output=$(readlink -f "$4")
        
        if [ ! -f "${local_image}" ]; then
            echo "Error: local_image=${local_image} is incorrect."
            return 1
        fi
        
        if [ ! -d "${local_output}" ]; then
            echo "Error: local_output=${local_output} is incorrect."
            return 1
        fi
        
        if [ -f "${local_output}/${local_vmlinux}" ]; then
            echo "Error: The ${local_output}/${local_vmlinux} file already exists, please delete the file first."
            return 1
        fi
        
        if [ -f "${local_output}/${local_rootfs}" ]; then
            echo "Error: The ${local_output}/${local_rootfs} file already exists, please delete the file first."
            return 1
        fi
        
        local local_rootfs_offset local_image_offset local_rootfs_size
        local_rootfs_offset=$(grep -oba hsqs ${local_image} | grep -oP '[0-9]*(?=:hsqs)')
        local_image_offset=$(wc -c ${local_image} | grep -oP '[0-9]*(?= )')
        local_rootfs_size=$(expr ${local_image_offset} - ${local_rootfs_offset})
        echo "Info: local_rootfs_offset=${local_rootfs_offset}, local_image_offset=${local_image_offset}, local_rootfs_size=${local_rootfs_size}"
        
        echo "Info: Extract ${local_output}/${local_vmlinux} from ${local_image}, please wait two minutes ..."
        dd if="${local_image}" of="${local_output}/${local_vmlinux}" bs=1 ibs=1 count="${local_rootfs_offset}"
        echo "Info: Extract ${local_output}/${local_rootfs} from ${local_image}, please wait eight minutes ..."
        dd if="${local_image}" of="${local_output}/${local_rootfs}" bs=1 ibs=1 count="${local_rootfs_size}" skip="${local_rootfs_offset}"
        echo "Info: Output ${local_output}/${local_vmlinux} ${local_output}/${local_rootfs}"
        
        return 0
    }
    
    unpack_squashfs()
    {
        if [ $# -ne 3 ]; then
            echo "Error: parameter is incorrect."
            return 1
        fi
        
        local local_rootfs local_squashfs local_output
        local_rootfs=$(readlink -f "$1")
        local_squashfs=$2
        local_output=$(readlink -f "$3")
        
        if [ ! -f "${local_rootfs}" ]; then
            echo "Error: local_rootfs=${local_rootfs} is incorrect."
            return 1
        fi
        
        if [ ! -d "${local_output}" ]; then
            echo "Error: local_output=${local_output} is incorrect."
            return 1
        fi
        
        local local_unsquashfs='/home/lsgx/develop/lede/builder/staging_dir/host/bin/unsquashfs4'
        if [ ! -f "${local_unsquashfs}" ]; then
            echo "Error: local_unsquashfs=${local_unsquashfs} file does not exist."
            return 1
        fi
        
        if [ -d "${local_output}/${local_squashfs}" ]; then
            echo "Error: The ${local_output}/${local_squashfs} folder directory exists, please delete the directory first."
            return 1
        fi
        
        echo "Info: Unpack ${local_rootfs} to ${local_output}/${local_squashfs}, please wait two minutes ..."
        ${local_unsquashfs} -d ${local_output}/${local_squashfs} ${local_rootfs}
        
        return 0
    }
    
    pack_squashfs()
    {
        if [ $# -ne 3 ]; then
            echo "Error: parameter is incorrect."
            return 1
        fi
        
        local local_squashfs local_rootfs local_output
        local_squashfs=$(readlink -f "$1")
        local_rootfs=$2
        local_output=$(readlink -f "$3")
        
        if [ ! -d "${local_squashfs}" ]; then
            echo "Error: local_squashfs=${local_squashfs} is incorrect."
            return 1
        fi
        
        if [ ! -d "${local_output}" ]; then
            echo "Error: local_output=${local_output} is incorrect."
            return 1
        fi
        
        local local_mksquashfs='/home/lsgx/develop/lede/builder/staging_dir/host/bin/mksquashfs4'
        if [ ! -f "${local_mksquashfs}" ]; then
            echo "Error: local_mksquashfs=${local_mksquashfs} file does not exist."
            return 1
        fi
        
        if [ -f "${local_output}/${local_rootfs}" ]; then
            echo "Error: The ${local_output}/${local_rootfs} file already exists, please delete the file first."
            return 1
        fi
        
        echo "Info: Pack ${local_squashfs} to ${local_output}/${local_rootfs}, please wait two minutes ..."
        ${local_mksquashfs} ${local_squashfs} ${local_output}/${local_rootfs} -nopad -noappend -root-owned -comp xz -Xpreset 9 -Xe -Xlc 0 -Xlp 2 -Xpb 2 -b 256k -processors 1
        
        return 0
    }
    
    create_image()
    {
        if [ $# -ne 4 ]; then
            echo "Error: parameter is incorrect."
            return 1
        fi
        
        local local_vmlinux local_rootfs local_image local_output
        local_vmlinux=$(readlink -f "$1")
        local_rootfs=$(readlink -f "$2")
        local_image=$3
        local_output=$(readlink -f "$4")
        
        if [ ! -f "${local_vmlinux}" ]; then
            echo "Error: local_vmlinux=${local_vmlinux} is incorrect."
            return 1
        fi
        
        if [ ! -f "${local_rootfs}" ]; then
            echo "Error: local_rootfs=${local_rootfs} is incorrect."
            return 1
        fi
        
        if [ ! -d "${local_output}" ]; then
            echo "Error: local_output=${local_output} is incorrect."
            return 1
        fi
        
        local local_padjffs='/home/lsgx/develop/lede/builder/staging_dir/host/bin/padjffs2'
        if [ ! -f "${local_padjffs}" ]; then
            echo "Error: local_padjffs=${local_padjffs} file does not exist."
            return 1
        fi
        
        if [ -f "${local_output}/${local_image}" ]; then
            echo "Error: The ${local_output}/${local_image} file already exists, please delete the file first."
            return 1
        fi
        
        cat ${local_vmlinux} ${local_rootfs} > ${local_output}/${local_image}
        echo "Info: Output ${local_output}/${local_image}"
        ${local_padjffs} ${local_output}/${local_image}
        echo "Info: Padding ${local_output}/${local_image}"
        
        return 0
    }
    
    if [ "${work_mode}" = "extract" -a "${input_image}" != "" -a "${output_vmlinux}" != "" -a "${output_rootfs}" != "" -a "${output_path}" != "" ]; then
        echo "Extract rootfs from image ..."
        echo "Options: work_mode=${work_mode}, input_image=${input_image}, output_vmlinux=${output_vmlinux}, output_rootfs=${output_rootfs}, output_path=${output_path}"
        extract_rootfs "${input_image}" "${output_vmlinux}" "${output_rootfs}" "${output_path}" || die "Error: Extract rootfs from image failed."
    fi
    
    if [ "${work_mode}" = "unpack" -a "${input_rootfs}" != "" -a "${output_squashfs}" != "" -a "${output_path}" != "" ]; then
        echo "Unpack squashfs ..."
        echo "Options: work_mode=${work_mode}, input_rootfs=${input_rootfs}, output_squashfs=${output_squashfs}, output_path=${output_path}"
        unpack_squashfs "${input_rootfs}" "${output_squashfs}" "${output_path}" || die "Error: Unpack squashfs failed."
    fi
    
    if [ "${work_mode}" = "pack" -a "${input_squashfs}" != "" -a "${output_rootfs}" != "" -a "${output_path}" != "" ]; then
        echo "Pack squashfs ..."
        echo "Options: work_mode=${work_mode}, input_squashfs=${input_squashfs}, output_rootfs=${output_rootfs}, output_path=${output_path}"
        pack_squashfs "${input_squashfs}" "${output_rootfs}" "${output_path}" || die "Error: Pack squashfs failed."
    fi
    
    if [ "${work_mode}" = "create" -a "${input_vmlinux}" != "" -a "${input_rootfs}" != "" -a "${output_image}" != "" -a "${output_path}" != "" ]; then
        echo "Create new image from rootfs and vminux ..."
        echo "Options: work_mode=${work_mode}, input_vmlinux=${input_vmlinux}, input_rootfs=${input_rootfs}, output_image=${output_image}, output_path=${output_path}"
        create_image "${input_vmlinux}" "${input_rootfs}" "${output_image}" "${output_path}" || die "Error: Create new image from rootfs and vminux failed."
    fi
    
    exit 0

    =============== End

  • 相关阅读:
    Python自动化运维之20、HTML
    Python自动化运维之18、Python操作 MySQL、pymysql、SQLAchemy
    Python自动化运维之17、Python操作 Memcache、Redis、RabbitMQ
    Python自动化运维之16、线程、进程、协程、queue队列
    Python自动化运维之15、网络编程之socket、socketserver、select、twisted
    Python自动化运维之14、设计模式
    Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)
    浏览器学习笔记-11 settimeout
    浏览器学习笔记-10 页面中的一些优化
    浏览器学习笔记--09 事件循环
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/13763267.html
Copyright © 2020-2023  润新知