linux下deb包的管理及制作 | 一次成功

摘要:
deb本身可以使用不同的压缩方式。而control.tar.gz则包含了一个deb安装的时候所需要的控制信息。apt-get命令安装软件:$apt-getinstalldpkg命令安装软件:$dpkg-i因此,dpkg主要是用来安装已经下载到本地的deb软件包,或者对已经安装好的软件进行管理。

1.deb包介绍

在debian/ubuntu环境下,很多情况下,我们安装已经开发的程序运用,可以通过deb包的命令进行程序的部署,对应的项目目录文件也会同步到某些目录下,
有些情况下将程序做成service启动,这样会更方便运用的管理,如通过service xxx start|stop|status|restart。

deb 是 Unix 系统(其实主要是 Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组。

deb 包本身有三部分组成:数据包,包含实际安装的程序数据,文件名为 data.tar.XXX;安装信息及控制脚本包,包含 deb 的安装说明,标识,脚本等,文件名为 control.tar.gz;最后一个是 deb 文件的一些二进制数据,包括文件头等信息,一般看不到,在某些软件中打开可以看到。

deb 本身可以使用不同的压缩方式。tar 格式并不是一种压缩格式,而是直接把分散的文件和目录集合在一起,并记录其权限等数据信息。之前提到过的 data.tar.XXX,这里 XXX 就是经过压缩后的后缀名。

deb 默认使用的压缩格式为 gzip 格式,所以最常见的就是 data.tar.gz。常有的压缩格式还有 bzip2 和 lzma,其中 lzma 压缩率最高,但压缩需要的 CPU 资源和时间都比较长。

data.tar.gz包含的是实际安装的程序数据,而在安装过程中,该包里的数据会被直接解压到根目录(即 / ),因此在打包之前需要根据文件所在位置设置好相应的文件/目录树。

而 control.tar.gz 则包含了一个 deb 安装的时候所需要的控制信息。一般有 5 个文件:

  • control,用了记录软件标识,版本号,平台,依赖信息等数据,这是最主要的文件配置,必不可少;
  • preinst,在解包data.tar.gz 前运行的脚本;
  • postinst,在解包数据后运行的脚本;
  • prerm,卸载时,在删除文件之前运行的脚本;
  • postrm,在删除文件之后运行的脚本;在 Cydia 系统中,Cydia 的作者 Saurik 另外添加了一个脚本,extrainst_,作用与 postinst 类似。
  • rules,通常是给命令dpkg-buildpackage使用

dpkg与apt-get区别

使用 dpkg 命令安装软件时,可以使用 -i 选项并指定 deb 安装包的路径。和 Ubuntu 下的另一个包管理工具 apt-get(Advanced Package Tool)有所不同。

apt-get 命令并不直接操作 deb 安装包文件,而是从 /etc/apt/sources.list 配置文件中定义的软件镜像源里下载软件包并安装,使用时也只需指定软件的名称(或者也可以附加上版本号)。

apt-get 命令安装软件:

$ apt-get install <package_name[=version]>

dpkg 命令安装软件:

$ dpkg -i <package_file_path>

因此,dpkg 主要是用来安装已经下载到本地的 deb 软件包,或者对已经安装好的软件进行管理。而 apt-get 可以直接从远程的软件仓库里下载安装软件。

2.deb常用命令

1).安装deb包
dpkg -i 包名

2).删除deb包,删除安装的文件
dpkg -r 包名
# e.g. 如hello_1.0_linux_amd64.deb, 就是hello

3).提取deb包文件到指定目录
dpkg -x 包名 dirname
# e.g. dpkg -x hello_1.0_linux_amd64.deb ./hello
# 解释,提取deb包信息到当前的hello目录中,但是DEBIAN包不会提取到hello中

4).查看包中的文件信息
dpkg -c 包名
# stout会列出所有目录文件信息

5).制作deb包
dpkg|dpkg-deb -b source-pakage pakageName
# 在做包前还有些工作是要完成的,见下文

3.deb包的制作

首先介绍下基本流程。

主要流程分以下三步:

1).编辑文件信息 

2).编写control信息,单写这个也可以成功打出deb包,如果配置文件较多,比如加入系统服务的那些文件,需要加在xxxxinst文件脚本中

3).构建deb包

下面通过一个简单的例子说明。

dpkg-deb方式构建deb包

1.首先生成项目目录
# mkdir -p hello/opt

2.进入目录中
# cd hello/opt

3.生成编辑文件-简单做个python例子
# touch hello.py
# vim hello.py
以下是文件内容
------
#!/usr/bin/python
print "hello"
------
保存后退出

4.加执行权限
# chmod +x hello.py

5.回到hello主目录下,生成DEBIAN目录
# mkdir DEBIAN

6.编写control信息
# cd DEBIAN
# touch control
# vim control

以下是control内容
------
Package: hello
Version: 1.0
Section: BioInfoServ
Priority: optional
Depends:
# 此处是相关的依赖包,多个用逗号隔开,如有确切版本,则可以 python-django (= 1.11.5)
Suggests:
Architecture: amd64
Installed-Size: 4096
Maintainer: gatieme
Provides: bioinfoserv-arb
Description: A test for using dpkg cmd
------

7.回到hello目录
------
root@test:/data/test/hello# ls -R
.:
DEBIAN  opt

./DEBIAN:
control

./opt:
hello.py
------

8.接下来执行做包命令
# 回到hello目录上层,
# cd ..
# ls   # hello目录
# dpkg-deb -b hello hello_1.0_linux_amd64.deb # dpkg-deb命令,-b表示构建deb包, hello表示源文件包, hello_1.0_linux_amd64.deb表示构建后的deb包
# 下面是输出
------
dpkg-deb: building package 'hello' in 'hello_1.0_linux_amd64.deb'.
------

# 更多
我们可以通过以下命令来提取deb包的DEBIAN信息
dpkg-deb -e xx包
# 提取对应deb包的DEBIAN目录到当前目录,内部含control,confile,postinst等等信息

到了这里,deb包就完成了,接下来可以通过dpkg相关命令管理deb包。

4.写在后面

deb包的目录树

|——mydeb
     |————usr
           |————lib
                 |——可执行文件(安装后,就在你的/usr/lib生成相应的可执行文件)
           |————share
                 |————icons 
                         |——deb.png(图标文件生成到/usr/share/icons/)
                 |————applications                           
                         |——deb.desktop(桌面文件生成到/usr/share/applications/)
     |————DEBIAN(大写、用来制作打包文件)
            |————control(描述deb包的信息必须的文件)

DEBIAN目录下可用的文件如下

这个目录下面的文件很多,不能一一解释。这里列举几个重要的,也是绝大部分软件必须的:

control文件: 声明很多重要的变量,dpkg通过这些变量来管理软件包
copyright文件: 不用说,版权信息,相当重要
changelog文件: 这是一个必需文件,包含软件版本号,修订号,发行版和优先级。
rules文件: 这实际上是另外一个Makefile脚本,用来给dpkg-buildpackage用的.
compat文件: 这个文件留着是有用的
dirs文件:这个文件指出我们需要的但是在缺省情况下不会自动创建的目录

conrol文件

//包名
Package: Internet-of-things
//版本
Version: 1.0.0-2017.05.03
//包分类
Section: tuils 
//优先级
Priority: optional
//依赖软件包
Depends:
//建议
Suggests: 
//目标机架构
Architecture: i386 | amd64
//安装后大小
Installed-Size: 
//维护者
Maintainer: papa
//原维护者
Original-Maintainer: papa
//提供
Provides:  
//包描述
Description: 欢迎来到万物智联
//软件主页
Homepage: http://blog.csdn.net/qq_27818541/

参考
https://blog.csdn.net/gatieme/article/details/52829907
https://blog.csdn.net/youlinhuanyan/article/details/99574723

免责声明:文章转载自《linux下deb包的管理及制作 | 一次成功》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DVWA环境Git报错:error: cannot open .git/FETCH_HEAD: Read-only file system下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种。 第一种是单例模式的类。 第二种是另外定义一个Service,直接通过Service来实现ftp的上传下载删除。 这两种感觉都有利弊。 第一种实现了代码复用,但是配置信息全需要写在类中,维护比较复杂。 第二种如果是spring框架,可以通过propertis...

dmalloc arm-linux平台使用

话说“工欲善其事,必先得其器”,用C语言写程序,最怕遇到个什么内存泄漏,内存越界访问了,心里那个急啊。。。 如果在i368-linlux上,valgrind工具是首选,但在arm-linux平台上,如何呢,dmalloc就是一个不错的选择。当然,IBM的purify是另外一个级别的选手,不提也罢。 1. 到官方网站下载dmalloc: www.dmallo...

PostgreSQL在Linux上的RPM和源码安装

第一章 引言 此文档主要描述Postgre数据库,基于Red Hat Enterprise Linux Server release 6.5 的操作系统上安装Postgre数据库的文档衍生而来。此文档包括Postgre数据库的多种安装方式。 1.1 背景 本文档介绍Postgre 数据库基于linux 6.5平台的三种安装方式。 第二章 部署前规划...

虚拟化技术实现 — QEMU-KVM

目录 文章目录 目录 前文列表 KVM QEMU QEMU-KVM QEMU-KVM 调用 KVM 内核模块启动虚拟机的流程概要 前文列表 《虚拟化技术实现 — 虚拟化技术发展编年史》 KVM KVM(Kernel-based Virtual Machine,基于内核的虚拟机)是一种用于 Linux 内核中的虚拟化基础设施。本质是一个嵌入到 Lin...

Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解

YAML语法规范;在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义。YAML 是一个 JSON 的超集,任何有效的 JSON 文件也都是一个有效的YAML文件。 具体参见:「YAML 语言教程与使用案例」 通过yaml创建nginx...

Dockerfile构建容器镜像

在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低。所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其中,然后让docker读取并分析、执行,那么重复构建、更新将变得很方便,所以Dockerfile就此诞生了。Docker提供了Dockerfile作为构建Do...