8.7 KiB
8.7 KiB
DEB 包说明
1. 什么是 DEB 包
1.1 基本概念
DEB (Debian Package) 是 Debian 及其衍生 Linux 发行版(如 Ubuntu)使用的软件包格式。类似于 Windows 的 .exe 安装程序或 macOS 的 .pkg 安装包。
1.2 文件格式
- 文件扩展名:
.deb - 内部结构: 使用
ar归档格式(类似于 tar) - 包含内容:
- 控制信息(包的元数据、依赖关系等)
- 数据文件(应用程序文件、配置文件等)
1.3 安装方式
# 安装 DEB 包
sudo dpkg -i package.deb
# 或者使用 apt(会自动处理依赖)
sudo apt install ./package.deb
2. ThingsBoard 为什么使用 DEB 包
2.1 优势
- 标准化安装: 统一的安装位置和文件结构
- 依赖管理: 自动检查和处理依赖关系(如 Java 17)
- 系统集成: 可以注册为系统服务(systemd)
- 配置管理: 配置文件会被标记,升级时不会被覆盖
- 权限管理: 自动设置正确的文件权限和所有者
2.2 在 Docker 中的使用
虽然 Docker 中可以使用其他方式安装,但使用 DEB 包有以下好处:
- 一致性: 与直接安装在 Linux 系统上的方式一致
- 便利性: 一键安装,自动配置所有文件和权限
- 可维护性: 便于卸载和升级
3. ThingsBoard DEB 包包含的内容
3.1 包结构
根据 packaging/java/build.gradle 配置,DEB 包包含以下内容:
/usr/share/thingsboard/ # 安装目录(pkgInstallFolder)
├── bin/ # 可执行文件
│ ├── thingsboard.jar # 主 JAR 文件(Spring Boot 打包)
│ └── install/ # 安装脚本(如果启用)
│ ├── install.sh
│ ├── upgrade.sh
│ └── logback.xml
├── conf/ # 配置文件
│ ├── thingsboard.conf # 主配置文件
│ ├── thingsboard.yml # YAML 配置
│ ├── logback.xml # 日志配置
│ └── actor-system.conf # Actor 系统配置
├── data/ # 数据文件
└── extensions/ # 扩展文件
/lib/systemd/system/ # 系统服务目录
└── thingsboard.service # systemd 服务文件
/etc/thingsboard/conf -> /usr/share/thingsboard/conf # 符号链接
3.2 关键文件说明
3.2.1 JAR 文件
- 位置:
/usr/share/thingsboard/bin/thingsboard.jar - 内容: Spring Boot 打包的完整应用(包含所有依赖)
- 格式: Fat JAR(可执行 JAR)
3.2.2 配置文件
- thingsboard.conf: 环境变量和系统配置
- thingsboard.yml: 应用配置(数据库、队列等)
- logback.xml: 日志配置
- actor-system.conf: Actor 系统配置
3.2.3 系统服务文件
- thingsboard.service: systemd 服务文件
- 允许使用
systemctl start thingsboard管理服务
3.3 安装脚本
DEB 包包含以下安装钩子脚本:
- preinst: 安装前执行
- postinst: 安装后执行(创建用户、启动服务等)
- prerm: 卸载前执行
- postrm: 卸载后执行(清理文件等)
4. DEB 包的构建过程
4.1 构建工具
ThingsBoard 使用 Gradle 的 nebula.ospackage 插件来构建 DEB 包。
位置: packaging/java/build.gradle
4.2 构建步骤
buildDeb {
arch = "all" // 架构:all 表示适用于所有架构
archiveFileName = "${pkgName}.deb" // 输出文件名
// 依赖要求:需要 Java 17
requires("openjdk-17-jre")
.or("java17-runtime")
.or("oracle-java17-installer")
.or("openjdk-17-jre-headless")
// 复制配置文件
from("${buildDir}/conf") {
include "${pkgName}.conf"
into "${pkgInstallFolder}/conf"
}
// 复制 JAR 文件
from(mainJar) {
rename { "${pkgName}.jar" }
into "bin"
}
// 安装钩子脚本
preInstall file("${buildDir}/control/deb/preinst")
postInstall file("${buildDir}/control/deb/postinst")
preUninstall file("${buildDir}/control/deb/prerm")
postUninstall file("${buildDir}/control/deb/postrm")
// 系统服务文件
from("${buildDir}/control/template.service") {
into "/lib/systemd/system"
rename { "${pkgName}.service" }
}
}
4.3 构建命令
# 在 application 模块目录下
cd application
# 执行 Gradle 构建 DEB 包
gradle buildDeb
# 生成的 DEB 包位置
# application/target/thingsboard-4.2.1.deb
4.4 Maven 集成
Maven 构建时会自动调用 Gradle 构建 DEB 包:
<!-- application/pom.xml -->
<plugin>
<groupId>org.thingsboard</groupId>
<artifactId>gradle-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>invoke</goal>
</goals>
<configuration>
<tasks>
<task>buildDeb</task>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
5. DEB 包在 Docker 构建中的使用
5.1 Dockerfile 中的安装
# msa/tb-node/docker/Dockerfile
FROM thingsboard/openjdk17:bookworm-slim
# 复制 DEB 包到临时目录
COPY ${pkg.name}.deb /tmp/
# 安装 DEB 包
RUN dpkg -i /tmp/${pkg.name}.deb && \
rm /tmp/${pkg.name}.deb
# DEB 包会将应用安装到 /usr/share/thingsboard/
5.2 安装后的效果
安装 DEB 包后:
- 文件安装: 所有文件复制到
/usr/share/thingsboard/ - 用户创建: 创建
thingsboard用户(如果不存在) - 权限设置: 设置正确的文件权限
- 服务注册: 注册 systemd 服务(但在 Docker 中通常不使用)
6. DEB 包的内容示例
6.1 查看 DEB 包内容
# 查看 DEB 包信息
dpkg -I thingsboard-4.2.1.deb
# 查看 DEB 包文件列表
dpkg -c thingsboard-4.2.1.deb
# 解压 DEB 包(不安装)
dpkg-deb -x thingsboard-4.2.1.deb /tmp/extract
6.2 典型输出
package: thingsboard
version: 4.2.1-1
architecture: all
maintainer: ThingsBoard Authors
depends: openjdk-17-jre | java17-runtime | ...
description: ThingsBoard IoT Platform
7. DEB vs RPM vs JAR
7.1 包格式对比
| 格式 | 适用系统 | 构建工具 | ThingsBoard 支持 |
|---|---|---|---|
| DEB | Debian/Ubuntu | Gradle (nebula.ospackage) | ✅ |
| RPM | RedHat/CentOS | Gradle (nebula.ospackage) | ✅ |
| JAR | 跨平台 | Maven (spring-boot-maven-plugin) | ✅ |
7.2 ThingsBoard 的构建
ThingsBoard 同时支持多种打包格式:
- DEB: 用于 Debian/Ubuntu 系统安装
- RPM: 用于 RedHat/CentOS 系统安装
- JAR: 用于 Docker 或直接运行
8. 为什么 Docker 中也用 DEB 包
8.1 原因
- 统一构建流程: 与 Linux 系统安装使用相同的构建产物
- 自动化安装:
dpkg -i一键安装,自动处理所有文件 - 权限管理: DEB 包会自动设置正确的权限和所有者
- 配置管理: 配置文件会被正确标记和保护
8.2 替代方案
理论上可以直接复制 JAR 文件,但使用 DEB 包有以下优势:
# 方案1:使用 DEB 包(ThingsBoard 采用)
COPY thingsboard.deb /tmp/
RUN dpkg -i /tmp/thingsboard.deb
# 方案2:直接复制 JAR(更简单但需要手动配置)
COPY thingsboard.jar /usr/share/thingsboard/bin/
RUN mkdir -p /usr/share/thingsboard/conf && \
chown -R thingsboard:thingsboard /usr/share/thingsboard
DEB 包方案更标准化,减少了手动配置的工作。
9. 总结
9.1 DEB 包是什么
- 定义: Debian/Ubuntu Linux 系统的软件包格式
- 作用: 标准化软件安装、配置和管理
- 格式:
.deb文件,包含软件文件和控制信息
9.2 ThingsBoard 中的 DEB 包
- 包含内容: JAR 文件、配置文件、启动脚本、系统服务文件
- 构建工具: Gradle (nebula.ospackage 插件)
- 构建位置:
application/target/thingsboard-{version}.deb - 使用场景:
- Linux 系统直接安装
- Docker 镜像构建(作为中间产物)
9.3 在 Docker 构建中的角色
源码编译 → JAR 打包 → DEB 打包 → Dockerfile 安装 DEB → Docker 镜像
DEB 包是连接 Maven/Gradle 构建和 Docker 镜像构建的桥梁,提供了标准化的安装和配置方式。