当前位置:网站首页>如何制作deb包
如何制作deb包
2022-07-30 20:25:00 【666QAQ】
原文链接:https://www.internalpointers.com/post/build-binary-deb-package-practical-guide
前言
deb文件是包含数据的存档,扩展名为.deb。
用它来发布或安装Debian及其衍生版本的linux程序非常简单。
使用deb包可以很方便地处理依赖关系、加进你的电脑、安装卸载。
这个教程会教你如何从0开始制作deb包,并在目标系统中安装一个二进制可执行文件。
先来了解一些理论基础。
了解deb包的结构
deb包是标准的Unix归档程序包,包含你的应用程序和其他实用程序文件。最重要的是控制文件,它存储了deb包的信息和要安装的程序。
对内,deb包的文件夹模仿典型的linux系统结构,例如/usr,/usr/bin,/opt等。在安装时,这些文件夹内的文件会被复制到真实文件系统的对应位置。
比如,一个<.deb>/usr/local/bin/binaryfile会被安装到/usr/local/bin/binaryfile。
对外,所有的deb包遵循相同的命名约定:<name>_<version>-<revision>_<architecture>.deb
其中:
- <name>
- 应用程序名
- <version>
- 应用程序版本号
- <revision>
- 当前deb包的版本号
- <architecture>
- 程序运行的硬件架构
比如,假设你要发布的程序叫做hello,版本为1.0,为构建64-ARM处理器构建。则包应该命名为hello_1.0-1_arm64.deb
- 程序运行的硬件架构
制作deb包
下面来制作deb包。确保你的系统中安装了dpkg-deb程序,我们会用它来生成最终成品。
1.创建工作目录
创建一个临时的工作目录,来在其中制作deb包。
遵循之前讲的命名约定。
例如:
mkdir hello_1.0-1_arm64
2.创建内部结构
把你的程序文件放到应该被安装到的位置。
例如,假如你想将文件安装到/usr/local/bin,
mkdir -p hello_1.0-1_arm64/usr/local/bin
mkdir的-p选项会创建上层目录。
下来把你的程序文件拷贝进包内的位置,
例如:
cp ~/YourProjects/Hello/hello hello_1.0-1_arm64/usr/local/bin
3.创建控制文件(control file)
控制文件(control file) 位于DEBIAN目录下。注意是大写。
小写的debian被用来存放源代码,叫做源包(原文:source packages),本教程是关于二进制包,所以不需要它。
先创建DEBIAN目录:
mkdir helloworld_1.0-1_arm64/DEBIAN
然后创建空的控制文件(contorl file):
touch helloworld_1.0-1_arm64/DEBIAN/control
4.填写控制文件(control file)
用文本编辑器打开之前创建的控制文件(control),控制文件里是一些数据字段。对于二进制包,至少且必须包含下列字段:
- Package
- 程序名
- Version
- 程序版本号
- Architecture
- 目标系统硬件架构
- Maintainer
- 包维护负责人的姓名和邮箱地址
- Description
- 程序的简短描述
例如:
- 程序的简短描述
Package: hello
Version: 1.0
Architecture: arm64
Maintainer: Internal Pointers <[email protected]>
Description: A program that greets you.
You can add a longer description here. Mind the space at the beginning of this paragraph.
控制文件control也可以包含额外的有效字段,比如所属部分section,或是依赖列表dependency list。如果你的程序依赖外部库,那么后者相当重要。
你可以手动填写它,但是有帮助工具可以减轻负担,后面会告诉你的。
5.构建deb包
这是最后一步,调用dpkg-deb,像下面这样:
dpkg-deb --build --root-owner-group <package-dir>
对我们的例子:
dpkg-deb --build --root-owner-group <helloworld_1.0-1_arm64>
--root-owner-group标志使得deb包内容归roor用户所有,这也是标准方法。
如果没有这个标志,所有文件、文件夹都会被普通用户所有,然而,该用户在要安装的系统中可能不存在。
上面的命令会在工作目录旁生产一个.deb包。如果包内部有错误或缺失,则打印错误信息,
如果成功了,你就得到了一个可供发布的deb包。
下面会介绍更多有用的内容。
测试deb包
测试你刚刚刚刚构建的deb包是个不错的选择。你可以安装它,就和安装其他deb包一样。
sudo dpkg -i <package>
确保它也能轻松卸载。你可以这样删除包:
sudo dpkg -r <appname>
或者连同它的配置文件一起删除(如果有):
sudo dpkg -P <appname>
可以这样来确保程序已经被正确删除:
dpkg -l |grep <appname>
dpkg -l命令列出所以安装的包,然后用grep检索程序名。当正确卸载后,输出应为空。
deb包安装出错
特别地,当你在处理一些 预安装/配置/删除 脚本时。dpkg会有这样这样典型的报错:
Package is in a very bad inconsistent state - you should reinstall it before attempting a removal.
这会组织任何进展。解决方法:
将所有对损坏包的引用移动到安全的地方(比如/tmp),然后强制删除它,就像这样:
sudo mv /var/lib/dpkg/info/<packagename>.* /tmp/
sudo dpkg --remove --force-remove-reinstreq <packagename>
处理外部依赖项
你可以使用dpkg-shlibdeps自动生产外部依赖项。它会解析你的二进制文件,找到外部的符号。
在写作这篇教程时,这个工具似乎无法开箱即用。
由于某些未知的原因(对我),它需要工作目录下debian/control文件——我们上文提到的源包(source packages)。
这里解决方法是先创建它,然后进入工作目录,运行命令:
dpkg-shlibdeps -O path/to/binaryfile
-O选项会打印依赖项到标注你输出。复制并粘贴它到你的DEBIAN/control的Depends部分即可。
完成后就可以摆脱debian/control文件了。我很确定,有更好的方法。一旦有该部分更多信息,我会更新该文章。
运行安装与卸载的处理脚本
有这四个文件:postinst, preinst, postrm,prerm被成为维护脚本。
这些文件位于DEBIAN,如同它们的名字暗示的那样,preinst和postinst分贝在安装前后执行,而prerm和postrm分别在卸载前后执行。
它们必须被标记为可执行文件。当然,记得设置权限,必须在0555和0755之间。
来源
Debian Policy Manual
Debian documentation - Chapter 7. Basics of the Debian package management system
Unix StackExchange - How to uninstall a .deb installed with dpkg?
边栏推荐
猜你喜欢

To the operation of the int variable assignment is atom?

Maxwell 一款简单易上手的实时抓取Mysql数据的软件

Ordinary int main(){} does not write return 0; what will happen?

【回归预测-lssvm分类】基于最小二乘支持向量机lssvm实现数据分类代码

MySQL 高级(进阶) SQL 语句 (一)

推荐系统-排序层-模型(一):Embedding + MLP(多层感知机)模型【Deep Crossing模型:经典的Embedding+MLP模型结构】

C语言中指针没那么难~(2)【文章结尾有资料】

365天挑战LeetCode1000题——Day 044 按公因数计算最大组件大小 并查集

Flex布局详解

Activiti 工作流引擎 详解
随机推荐
Android studio连接MySQL并完成简单的登录注册功能
MySql密码
OSS简单上传图片
Network layer protocol------IP protocol
明解C语言第五章习题
【Codeforces思维题】20220728
Mysql——字符串函数
JUnit 5测试中的临时目录(附实例及代码)
Recommendation System - Sorting Layer - Model (1): Embedding + MLP (Multilayer Perceptron) Model [Deep Crossing Model: Classic Embedding + MLP Model Structure]
[PM only] Quickly count who else in the team has not registered and reported information, and quickly screen out the members of their own project team who have not completed the list of XXX work items
OSS simply upload pictures
Difference Between Concurrency and Parallelism
是对称矩阵的对角化
推荐系统:评估指标【离线评估指标:RMSE(均方根误差)、AUC、准确率、召回率、F1】【在线评估:A/B测试】【一般要求响应时间<0.5s】
TensorFlow2: Overview
多线程的互斥锁应用RAII机制
To the operation of the int variable assignment is atom?
halcon——轮廓线
MySQL的主从复制
PHP低代码开发平台 V5.0.7新版发布