将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 小时前
Ubuntu安装php8.4 及redis ngin
linux·redis·ubuntu
一只旭宝4 小时前
回调函数(Callback)
linux·服务器·算法
木泽八4 小时前
《Ubuntu系统GRUB引导修复操作记录》
linux·运维·ubuntu
水饺编程5 小时前
第2章:Linux 基础,删除用户
linux·c语言·汇编
Novproxy_Z5 小时前
机房 IP 和住宅 IP 怎么区分?IP ASN、归属信息检测脚本
linux·网络·tcp/ip
mounter6255 小时前
深入理解 Linux blk-iocost:基于虚拟时间的 I/O 资源控制与 BPF 扩展
linux·linux kernel·kernel
码少女5 小时前
Linux——网络层-IP协议以及路由选择
linux·网络·网络协议·tcp/ip
qeen876 小时前
【Linux】Ext2文件系统介绍
linux·服务器
FlightYe7 小时前
视界原理之3D视频(三):解码和显示
android·linux·3d·ffmpeg·音视频·android runtime
牢姐与蒯7 小时前
Linux网络篇——TCP(一)之手搓TCP,并实现词典和远程命令
linux·网络·tcp/ip