将linux程序打成.run包

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

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

1.1 核心优势

单文件分发​​:将所有依赖打包成一个文件,简化分发流程

​​离线部署​​:内嵌所有资源,无需网络下载

​​一键安装​​:用户只需执行一个命令即可完成部署

​​权限控制​​:可强制以 root 权限执行关键操作

​​版本固化​​:确保部署版本一致性

​​进度反馈​​:内置解压进度显示

1.2 典型应用场景

嵌入式设备部署(如算能小盒子)

需要复杂初始化流程的软件

包含多个依赖组件的应用套件

需要预配置环境的系统

离线环境下的软件部署

2. .run 文件核心原理

2.1 文件结构解剖

2.2 工作流程

用户执行​​:sudo ./package.run

​​创建临时目录​​:在 /tmp 下创建唯一目录

​​解压资源​​:将内嵌数据解压到临时目录

​​执行安装脚本​​:运行指定的安装脚本(如 install.sh

​​处理资源​​:复制文件、配置环境、安装服务

​​清理临时文件​​:自动删除临时目录

​​完成部署​​:显示成功信息和访问方式

2.3 关键技术点

​​自解压机制​​:使用 makeself 或手工拼接脚本与数据

​​资源定位​​:通过 awk或 tail定位数据起始位置

​​权限管理​​:使用 --needroot确保 root 权限

​​错误处理​​:严格的错误检查和退出机制

​​日志系统​​:详细记录部署过程

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

3.1 准备工作

bash 复制代码
# 安装必要工具(ubuntu)
apt update
apt install -y makeself

3.2 目录结构

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

3.3 编译脚本

  • make_package.sh
bash 复制代码
#!/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 安装脚本

  • 由于安装脚本涉及业务内容,此处只能示例了,其实就是你的部署脚本或者执行脚本
bash 复制代码
#!/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 执行编译打包

bash 复制代码
# 添加执行权限
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包中的内容

bash 复制代码
./xxxx.run --noexec --target ./

# --noexec 不执行内嵌脚本
# --target 指定提取目录
相关推荐
晚风吹长发4 小时前
Docker基础——Docker Network(网络详解)
linux·运维·网络·ubuntu·docker·容器
高磊20056 小时前
LVS(Linux virual server)
linux·服务器·lvs
shwill1236 小时前
PID 算法(三)--- 增量 PID ↔ 单神经元 PID 等价映射
linux·算法
执笔画流年呀7 小时前
Linux搭建Java项目部署环境
java·linux·运维
Sisphusssss8 小时前
香橙派5plus GPIO
linux·python·ubuntu
W.W.H.8 小时前
嵌入式 Linux外接USB/WIFI模块兼容5G频段实战
linux·运维·5g·wifi
影视飓风TIM8 小时前
Linux下C程序编译:gcc 动态链接与静态链接全解
linux·c语言
神秘剑客_CN9 小时前
openEuler 22.03安装openGauss 6.0
linux·opengauss·openeuler
小此方10 小时前
Linux网络(一):揭秘从网络发展哲学到 TCP/IP 协议栈分层设计的设计哲学
linux·网络·tcp/ip