一、debian和deb
广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Debian项目众多内核分支中以Linux宏内核为主,而且 Debian开发者 所创建的操作系统中绝大部分基础工具来自于GNU工程 ,因此 “Debian” 常指Debian GNU/Linux。非官方内核分支还有只支持x86的Debian GNU/Hurd(Hurd微内核),只支持amd64的Dyson(OpenSolaris混合内核)等。这些非官方分支都存在一些严重的问题,没有实用性,比如Hurd微内核在技术上不成熟,而Dyson则基础功能仍不完善。
Deb是Debian软件包格式,文件扩展名为.deb,deb包是Unixar的标准归档,将包文件信息以及包内容,经过gzip和tar打包而成,处理deb包的经典程序是dpkg,经常是通过apt来运作。
二、deb打包过程
安装所需的依赖
sudo apt-get install build-essential debhelper make autoconf automake dpkg-dev fakeroot pbuilder gnupg
创建一个应用目录,命名为{poackage-name}-{version},比如我们创建一个叫做demo的应用,目录名为demo-1.0.0。
将需要安装的源码或程序放入目录,压缩这个目录为demo.1.0.0.tar.gz,此时这个压缩包和目录在同级。
在终端中进入目录,执行以下命令
dh_make -f ../demo_1.0.0.tar.gz
输入s和Enter
之后,我们能够看到demo-1.0.0目录中会自动生成一个debian目录,里面包含了debian所需要的脚本,它们并不都是必须的,但我们至少要保留changelog、compat、control、copyright、rules以及source,同时,我们需要创建一个install文件。比如本例中我们希望把src中的文件拷贝到/home/中
#!/bin/bash
mkdir debian/demo/home/
cp -r src/* debian/demo/home/
保存install,修改其他文件(具体说明在后文介绍)。
回到demo-1.0.0目录,输入以下命令进行编译:
dpkg-buildpackage -rfakeroot -b
我们看到demo-1.0.0上层生成了一个名为demo_1.0.0-1_amd64.deb的deb包,至此,deb包打包成功。
如果想安装这个deb包,可以执行
dpkg -i demo_1.0.0-1_amd64.deb
三、debian相关配置文件
1、安装前执行脚本debian/preinst
Debian软件包(".deb")解压前执行的脚本,为正在被升级的包停止相关服务,直到升级或安装完成(成功后执行 'postinst' 脚本)
#!/bin/sh
if [ "$1" = "upgrade" ] || [ "$1" = "install" ];then
#需要执行的脚本
fi
2、安装后执行脚本debian/postinst
主要完成软件包(".deb")安装完成后所需的配置工作。通常,postinst 脚本要求用户输入, 和/或警告用户如果接受默认值,应该记得按要求返回重新配置这个软件。一个软件包安装或升级完成后,postinst 脚本驱动命令,启动或重起相应的服务。
#!/bin/sh
set -e
if [ "$1" = "configure" ]; then
ldconfig
fi
3、卸载前执行脚本debian/prerm
停止一个软件包的相关进程,要卸载软件包的相关文件前执行。
if [ "$1" = "remove" -o "$1" = "deconfigure" ]; then
#需要执行的脚本
fi
4、卸载后执行脚本debian/postrm
修改相关文件或连接,和/或卸载软件包所创建的文件。
#!/bin/sh
if [ "$1" = "upgrade" ] ; then
需要执行的脚本
elif [ "$1" = "remove" ] || [ "$1" = "purge" ] ; then
需要执行的脚本
fi
5、debian/changelog
changelog提供版本修改信息,帮助下载软件包的人了解软件包中是否有他们需要知道的信息,决定着生成的deb包的版本号。格式如下:
package (version) distribution(s); urgency=urgency
[optional blank line(s), stripped]
* change details
more change details
[blank line(s), included in output of dpkg-parsechangelog]
* even more change details
[optional blank line(s), stripped]
-- maintainer name [two spaces] date
(注:date可以使用命令date -R获取)
6、debian/control
control决定着deb包的包名、编译依赖和运行依赖。用dh_make生成的默认control文件格式如下(行号是为了添加解释,我们在这里特意加入的):
1 Source: demo
2 Section: unknown
3 Priority: extra
4 Maintainer: steveyg
5 Build-Depends: debhelper (>=9)
6 Standards-Version: 1.0.0
7 Homepage:
8
9 Package: demo
10 Architecture: amd64
11 Depends: ${shlibs:Depends}, ${misc:Depends}
12 Description:
13
1-7行是源码的control信息,9-13是二进制包的control信息。
第 1 行是源代码包的名称。
第 2 行是该源码包要进入发行版中的分类。
第 3 行是描述用户安装该包的重要程度。由于这是一个常规优先级的软件,并不与其他软件包冲突,我们将优先级改为 optional。
每个软件包都有一个维护者指定的优先级,用于包管理系统。这些优先级是:
必须的(Required):系统运转所必须的软件包。包括修复系统缺陷所必须的所有工具。不能删除这些软件包,否则系统可能会崩溃,且甚至有可能无法用 dpkg 恢复。仅有这类包的系统是不可用的,但是它为系统管理员启动系统安装其它软件提供足够的功能。
重要的(Important):在任何类 Unix 系统上均安装有该级别软件包。没有这类包,其它的包无法在系统上正常运转或使用,Emacs,X11,TeX 等大型应用程序不在此列。此类包构成基本系统。
一般的(Standard):Linux 系统里的一般软件包,构成小型字符系统。这是用户什么也不选也会默认安装的软件包. 不包括大型软件, 但是 Emacs(与其说它是一个应用软件,不如说它是基础构件)一小部分 TeX 和 LaTeX(不支持X)除外。
可选的(Optional):软件包包含了所有的你想要安装的文件,如果你一开始不知道它是什么。或者没有特殊的需要。这包括 X11,所有的 TeX 和许多应用程序。
额外的(Extra):这类包不是与其它高优先级的软件冲突,只有知道它的用途才可能对你有用,就是因为特别的原因而不能进入"可选"优先级。
第 4 行是源码维护者的名字和邮箱。
第 5 行是源码的编译依赖。
第 6 行是此软件包所依据的“Debian Policy Manual” 标准版本号。
第 7 行是源码的主页。
第 9 行是二进制软件包的名称。通常情况下与源代码包相同,但不是必须的。
第 10 行是目标机架构,指明二进制包的类型。如果你的软件包是平台独立的(例如一个 shell 或 Perl 脚本,或一些文档),将这项改变为 all,否则写成any。
第 11 行显示了 Debian 软件包系统中最强大的特性之一。每个软件包都可以和其他软件包有各种不同的关系。除 Depends 外,还有 Recommends、Suggests、Pre-Depends、Breaks、Conflicts、Provides 和 Replaces。
第 12 行是软件的简短描述。
第 13 行是软件的详细描述。
7、debian/compat
定义兼容级别,Ubuntu Kylin下保持默认值即可。
8、debian/copyright
包含源码的版权和许可,dh_make 可以给出一个 copyright 文件的模板。
9、debian/install
一些文件可以通过该install脚本,在软件安装时安装到系统的指定路径下,也可以选择python的setup模块等进行安装操作。
10、debian/links
创建额外的符号链接。
11、debian/rules
rules文件本质上是一个Makefile文件,这个Makefile文件定义了创建deb格式软件包的规则。打包工具按照rules文件指定的规则,完成编译,将软件安装到临时安装目录,清理编译目录等操作,并依据安装到临时目录的文件来生成deb格式的软件包。
dh_make 会生成一个使用 dh 命令的非常简单但非常强大的默认的 rules 文件:
#!/usr/bin/make -f
# -*- makefile -*-
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
%:
dh $@
一般没有特殊要求的情况下,源码包使用默认配置就可以了