将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 准备工作
# 安装必要工具(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 指定提取目录

浙公网安备 33010602011771号