将linux程序打成.run包

1. 为什么使用 .run 安装包?

在 Linux 系统部署中,.run 安装包提供了独特的优势:

1.1 核心优势

单文件分发​​:将所有依赖打包成一个文件,简化分发流程
​​离线部署​​:内嵌所有资源,无需网络下载
​​一键安装​​:用户只需执行一个命令即可完成部署
​​权限控制​​:可强制以 root 权限执行关键操作
​​版本固化​​:确保部署版本一致性
​​进度反馈​​:内置解压进度显示

1.2 典型应用场景

嵌入式设备部署(如算能小盒子)
需要复杂初始化流程的软件
包含多个依赖组件的应用套件
需要预配置环境的系统
离线环境下的软件部署

2. .run 文件核心原理

2.1 文件结构解剖

image

2.2 工作流程

用户执行​​:sudo ./package.run
​​创建临时目录​​:在 /tmp 下创建唯一目录
​​解压资源​​:将内嵌数据解压到临时目录
​​执行安装脚本​​:运行指定的安装脚本(如 install.sh)
​​处理资源​​:复制文件、配置环境、安装服务
​​清理临时文件​​:自动删除临时目录
​​完成部署​​:显示成功信息和访问方式

2.3 关键技术点

​​自解压机制​​:使用 makeself 或手工拼接脚本与数据
​​资源定位​​:通过 awk或 tail定位数据起始位置
​​权限管理​​:使用 --needroot确保 root 权限
​​错误处理​​:严格的错误检查和退出机制
​​日志系统​​:详细记录部署过程

 

3. 创建 .run 包的完整流程

3.1 准备工作

# 安装必要工具(ubuntu)
apt update
apt install -y makeself

3.2 目录结构

├── test_build                                #大目录
│   ├── aibox_deploy                          #部署内容
│   │   ├── install.sh                        #安装脚本
│   │   └── resources                         #资源文件
│   │       └── test-v4.6.3.20.tgz
│   └── make_package.sh                       #编译脚本

 3.3 编译脚本

  • make_package.sh 
#!/bin/bash
# make_package.sh 
# 安装必要工具
#sudo apt update
#sudo apt install -y makeself

# 定义版本信息
VERSION="4.6.3.20"
BUILD_DATE="$(date +%Y%m%d)"
OUTPUT_NAME="test_V${VERSION}_${BUILD_DATE}.run"

# 清理旧文件
rm -f $OUTPUT_NAME

# 检查源目录是否存在
if [ ! -d "aibox_deploy" ]; then
    echo "错误: 源目录 aibox_deploy 不存在"
    exit 1
fi

# 检查安装脚本是否存在
if [ ! -f "aibox_deploy/install.sh" ]; then
    echo "错误: 安装脚本 aibox_deploy/install.sh 不存在"
    exit 1
fi

# 检查安装包是否存在
INSTALL_PACKAGE="aibox_deploy/resources/test-v${VERSION}.tgz"
if [ ! -f "$INSTALL_PACKAGE" ]; then
    echo "错误: 安装包 $INSTALL_PACKAGE 不存在"
    echo "请确保版本号匹配: ${VERSION}"
    exit 1
fi

# 创建自解压安装包
makeself \
    --needroot \
    --tar-extra "--no-same-owner" \
    --gzip \
    --nomd5 \
    aibox_deploy/ \
    $OUTPUT_NAME \
    "AI软件系统部署 V$VERSION" \
    ./install.sh --install

echo "=============================================="
echo "打包成功!生成文件: $OUTPUT_NAME"
echo "部署命令:"
echo "  sudo ./$OUTPUT_NAME"
echo "=============================================="

3.4 安装脚本 

  • 由于安装脚本涉及业务内容,此处只能示例了,其实就是你的部署脚本或者执行脚本
#!/bin/bash
# 自解压路径处理
UNPACK_DIR=$(dirname "$0")
EMBEDDED_PACKAGE="$UNPACK_DIR/resources/test-v4.6.3.20.tgz"

# 固定配置
VERSION="4.6.3.20"
DATA_DIR="/data"

# 日志系统
LOG_FILE="/var/log/deploy.log"
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') [$1] $2" | tee -a $LOG_FILE
}

# 主安装流程
main() {
    # 处理内嵌资源
    cp "$EMBEDDED_PACKAGE" "$DATA_DIR/test.tgz"
    chmod 644 "$DATA_DIR/test.tgz"
    
    # 解压安装
    tar zxpf "$DATA_DIR/test.tgz" -C "$DATA_DIR"
    
    # 更多部署步骤...
    
    log "INFO" "===== 部署成功 ====="
}

# 执行入口
main

 3.5 执行编译打包

# 添加执行权限
chmod +x make_package.sh
chmod +x aibox_deploy/install.sh

# 执行打包
./make_package.sh

# 输出结果
ls -lh *.run # 输出 test_V4.6.3.20_20250802.run

4.在服务器上运行

  • 上传到服务器上,执行 ./test_V4.6.3.20_20250802.run 即可

5.提取run包中的内容

./xxxx.run --noexec --target ./

# --noexec 不执行内嵌脚本
# --target 指定提取目录

 

posted @ 2025-08-05 17:26  Leonardo-li  阅读(101)  评论(0)    收藏  举报