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

dpkg 命令安装软件:

$ dpkg -i

因此,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