文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linux制作一个deb包如此简单:Ubuntu的deb安装包文件的内部组成分析与使用原理

2024-11-30 02:45

关注

本文通过实例演示了如何制作一个简单的deb包,讲解了deb包的内部各个文件的作用,以及安装后在系统中如何生效、如何维护。

deb 包剖析

deb 是一个标准的 Unix ar 存档格式[1],其中包含应用程序和其他实用程序文件。最重要的一个是控制文件(control),它存储了有关 deb 包及其安装的程序的信息。

<软件名称>_<主版本号>-<修订版本号>_<硬件架构>.deb

假设您要发布名为 mynano 的程序,版本 1.0,该程序是为 64 位处理器(AMD64)构建的。您的 deb 文件名将类似于 mynano_1.0-0_amd64.deb

制作 deb 包

现在,我们已准备好生成包。确保您的系统中安装了 dpkg-deb 工具(来自 dpkg 软件包,可通过sudo apt install dpkg 安装):稍后将使用dpkg-deb 生成最终deb包。

(1) 创建工作目录 创建一个临时工作目录以将包放入其中。遵循我们之前看到的相同命名约定。例如:

mkdir mynano_1.0-1_amd64/

(2) 创建内部结构 将程序文件放在目标系统上应安装的位置。假设您希望将可执行文件安装到:/usr/bin/

首先创建目录:

mkdir -p mynano_1.0-1_amd64/usr/bin/

mkdir命令的-p标志将创建嵌套目录,如果其中任意目录不存在则自动创建。然后将可执行文件复制到其中:

# 假设你开发的程序可执行文件为 ~/YourProjects/mynano/src/targets/release/mynano
cp ~/YourProjects/mynano/src/targets/release/mynano  mynano_1.0-1_amd64/usr/bin/

(3) 创建文件control 该文件位于DEBIAN目录中(注意目录名为大写字母)

先创建文件夹:DEBIAN

mkdir mynano_1.0-1_amd64/DEBIAN

然后创建空文件:control

touch mynano_1.0-1_amd64/DEBIAN/control

填写control文件内容:

Package: mynano
Version: 1.0
Architecture: amd64
Maintainer: linuxlibs 
Description: 基于nano的自定义编辑器
Depends: nano (>= 5.0)

其中:

该文件可能包含其他有用的字段,例如Depends指出deb包的依赖项列表。那么如果借助 apt 命令安装 deb包的时候,就会先安装上 nano>=5.0版本的软件包,再安装 mynano。

(5) 最后一步:构建 deb 包 按如下方式调用dpkg-deb:

dpkg-deb --build --root-owner-group 

在我们的示例中:

dpkg-deb --build --root-owner-group 

这里的 --root-owner-group 标志使所有 deb 包内容都归 root 用户所有,这是标准方法。如果没有这样的标志,所有文件和文件夹的属主都为您当前的用户,但考虑到 deb 软件包将安装到的系统中并不一定存在与你同名账号,所以使用--root-owner-group 更合理。

上面的命令将在工作目录旁边生成一个.deb的文件,或者如果包内有错误或丢失,则打印错误。如果操作成功,就可以分发这个生成的 deb 包给他人了。

(6) 使用deb包安装到系统:可以看到,通过apt方式安装我们制作的deb包的时候,会自动安装上依赖项:nano 软件包

# apt install ./mynano_1.0-1_amd64.deb
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
注意,选中 'mynano' 而非 './mynano_1.0-1_amd64.deb'
将会同时安装下列软件:
  nano
建议安装:
  hunspell
下列【新】软件包将被安装:
  mynano nano
升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 79 个软件包未被升级。
需要下载 280 kB/1,135 kB 的归档。
解压缩后会消耗 881 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 /root/my-nano-editor-src/mynano_1.0-1_amd64.deb mynano amd64 1.0.0 [855 kB]
获取:2 https://mirrors.ustc.edu.cn/ubuntu jammy/main amd64 nano amd64 6.2-1 [280 kB]
已下载 280 kB,耗时 1秒 (422 kB/s)
正在选中未选择的软件包 nano。
(正在读取数据库 ... 系统当前共安装有 231799 个文件和目录。)
准备解压 .../archives/nano_6.2-1_amd64.deb  ...
正在解压 nano (6.2-1) ...
正在选中未选择的软件包 mynano。
准备解压 .../mynano_1.0-1_amd64.deb  ...
正在解压 mynano (1.0.0) ...
正在设置 nano (6.2-1) ...
update-alternatives: 使用 /bin/nano 来在自动模式中提供 /usr/bin/editor (editor)
update-alternatives: 使用 /bin/nano 来在自动模式中提供 /usr/bin/pico (pico)
正在设置 mynano (1.0.0) ...
正在处理用于 install-info (6.8-4build1) 的触发器 ...
正在处理用于 man-db (2.10.2-1) 的触发器 ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...

(7) 【非必须】卸载安装的软件 mynano:

# apt remove mynamo -y
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
下列软件包将被【卸载】:
  mynano
升级了 0 个软件包,新安装了 0 个软件包,要卸载 1 个软件包,有 79 个软件包未被升级。
解压缩后会消耗 0 B 的额外空间。
您希望继续执行吗? [Y/n] y
(正在读取数据库 ... 系统当前共安装有 231872 个文件和目录。)
正在卸载 mynano (1.0.0) ...

(8) 【非必须】查询 mynano_0.1-1_amd64.deb 的依赖关系:dpkg -I ./mynano*deb

以上制作deb包的方式,还有哪些可改进的地方:

以上并没有加入文件安装后的额外处理脚本,而实际的deb软件包,很多在安装前、安装后还要执行一些初始化服务配置脚本;或执行测试命令验证安装效果是否正常;安装后通过脚本启动后台服务。

如何实现?

deb的规范支持添加 preinst、postinst、prerm 和 postrm 这4个脚本。置于/DEBIAN/目录下。注意,这4个文件对于制作deb包来说,不是必须的,有需要的时候才添加。

例如我们为mynano在mynano_1.0-1_amd64/DEBIAN/ 目录下添加4个文件:

preinst 文件内容为:

#!/bin/bash
echo "来自preinst的消息"

postinst 文件内容为:

#!/bin/bash
echo "一些适合在安装后执行的处理逻辑"

prerm 文件内容为:

#!/bin/bash
echo "一些适合在卸载软件前执行的处理逻辑"

postrm 文件内容为:

#!/bin/bash
echo "一些适合在卸载软件后执行的处理逻辑"

并设置文件权限为0555或0755,以避免报错:

dpkg-deb: 错误: 维护者的脚本 preinst 的权限位是 644 (必须 >=0555 且 小于等于0775)`。

重新制作安装包:

# chmod 755 mynano_1.0-1_amd64/DEBIAN/{preinst,postinst,prerm,postrm}                           ```
  
# cp -pr mynano_1.0-1_amd64 mynano_1.0-2_amd64 #修订版本从1变为2
# 确保 preinst 等文件已在DEBIAN/目录下。
# dpkg-deb --build --root-owner-group mynano_1.0-2_amd64

得到新的修订版的mynano deb包文件:mynano_1.0-2_amd64.deb

安装新包:

#  apt install ./mynano_1.0-2_amd64.deb
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
注意,选中 'mynano' 而非 './mynano_1.0-2_amd64.deb'
下列【新】软件包将被安装:
mynano
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 79 个软件包未被升级。
需要下载 0 B/855 kB 的归档。
解压缩后会消耗 0 B 的额外空间。
获取:1 /root/tmp/my-nano-editor-src/mynano_1.0-2_amd64.deb mynano amd64 1.0.0 [855 kB]
正在选中未选择的软件包 mynano。
(正在读取数据库 ... 系统当前共安装有 231871 个文件和目录。)
准备解压 .../mynano_1.0-2_amd64.deb  ...
来自 preinst 的消息
正在解压 mynano (1.0.0) ...
正在设置 mynano (1.0.0) ...
Scanning processes...
Scanning processor microcode...
Scanning linux images...

可以看到此时安装中输出了一段话:

正式 我们的preinst脚本的效果。

那么mynano的deb包安装后,这些文件会被放置于 /var/lib/dpkg/info/ 目录下,如mynano的脚本文件安装后存储于 /var/lib/dpkg/info/ 目录下,以 mynano.*字符开头的文件名就是 mynano的相关配置脚本:

# ls -lht  /var/lib/dpkg/info/mynano.*
-rw-r--r-- 1 root root 49  1月 17 12:33 /var/lib/dpkg/info/mynano.md5sums
-rw-r--r-- 1 root root 33  1月 17 12:33 /var/lib/dpkg/info/mynano.list
-rwxr-xr-x 1 root root 44  1月 17 12:23 /var/lib/dpkg/info/mynano.preinst
# cat /var/lib/dpkg/info/mynano.preinst
#!/bin/bash
echo "来自preinst的消息"

下面分别介绍每个脚本文件的作用:

参考资料:

Unix ar 存档格式: http://fileformats.archiveteam.org/wiki/AR

来源:深入理解Linux内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯