当前位置:   article > 正文

deb打包教程

deb打包教程

**

debian包知识梳理

**
一.认识debian包
deb是Unix系统(其实主要是Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组。
由于 Unix 类系统对权限、所有者、组的严格要求,而 deb 格式安装包又经常会涉及到系统比较底层的操作,所以权限等的设置尤其重要。
1.deb包的一般目录格式
mydeb

|----DEBIAN

   |-------control

   |-------postinst

   |-------postrm
  • 1
  • 2
  • 3
  • 4
  • 5

|----boot

   |----- mysoftware
  • 1

DEBIAN目录中主要存放deb包打包过程中要用到的配置,至少得有control,copyright(版权),changlog(修订记录)等.

control文件:描述软件包的名称(package),版本(version),描述(description)等,是deb包必须剧本的描述性文件,以便于软件的安装管理和索引。如果进行充分的管理,还需要填入如下字段:
section:声明软件的类别,常见的有“utils”,”net”,”mail”,”text”,”x11”等
priority:声明软件对系统的重要程度:如“required”,”standard”,”optional”,”extra”等
essential:声明是否是系统最基本的软件包(yes or no),如果是的话,这就表明该软件是维持系统稳定和正常运行的软件包,不允许任何形式的卸载
architecture:软件包结构,”i386”,”amd 64”,”sparc”,”powerpc”等
source:软件包的源代码名称
depends:软件所依赖的其他软件包和库文件.如果是依赖多个软件和库文件,彼此用逗号隔开
pre-depends:软件安装前必须安装,配置依赖性的软件包和库文件,它常常用于必须的预运行脚本需求
recommends:这个字段表明推荐的安装其他软件包和库文件
suggest:建议安装其他软件包和库文件、
control文件完整示例:

Package: mysoftware
Version: 2016-02-26
Section: free
Priority: optional
Depends: libssl.0.0.so, libstdc++2.10-glibc2.2
Suggests: Openssl
Architecture: i386
Installed-Size: 66666
Maintainer: Simon @ newdivide7037#gmail.com
Provides: mysoftware
Description: just for test
(此处必须空一行再结束)

postinst文件:包含了软件在进行正常目录文件拷贝到系统后,所需要执行的配置工作
prerm文件:软件卸载前需要执行的脚本
postrm文件:软件卸载后需要执行的脚本
postinst文件内容( 软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行,然后给该脚本赋予可执行权限:chmod +x postinst):
1
2 # !/bin/sh
echo “my deb” >/home/mydeb.log
  
postrm文件内容( 软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行,然后给该脚本赋予可执行权限:chmod +x postrm):
1
2 # !/bin/sh
rm -rf /home/mydeb.log

2.deb打包后组成样式
.deb是ar存档,类似于.a,其本身由三部分组成:
(1)数据包,包含实际安装的程序数据 data.tar.gz: 包的数据
(2)安装信息及控制脚本包,包含deb的安装说明,标识,脚本等 control.tar.gz: 包的相关元数据(control, md5sums)
(3)deb文件的一些二进制数据,包括文件头等信息,一般看不到 debian-binary:记录着deb文件的格式版本号 “2.0\n”

3.deb常用命令集合
(1)查看deb包含有哪些文件(不安装)
dpkg -c XXX.deb //安装前根据deb文件查看
dpkg -L debname //安装后根据包名查看
(2)安装deb包
dpkg -i xxx.deb
(3)移除deb包
dpkg -r debname
(4)查看某个文件属于那个deb包
dpkg -S filepath
(5)释放安装内容到指定目录下
dpkg -X xxx.deb 目录名
(6)释放控制信息到当前目录下的DEBIAN子目录中
dpkg -e xxx.deb 目录名
二.手把手制作一个deb包
1.创建一个源码包

2.创建gpg key
gpg是gnu组织一个加密解密软件在build包时需要用到,后续我会写一篇文章介绍gpg.后面在launchpad平台做开发需要用到

gpg --gen-key 根据提示一步一步往下做
gpg --list-keys

3.环境准备

在对这个源码包进行deb化之前,首先要确保源代码目录绝对干净,为了让软件包能够正确地制作,需要把源代码目录更改为“小写字母-版本号”格式。同时需要export两个环境变量。
mv helloworldtest heloworld-0.1
export DEBEMAIL=”XXX@XXXX”
export DEBFULLNAME=”xxxx”
注意此处的邮箱和密码必须和你在生成gpg key的时候完全一致,这两个变量的值也会在changelog等多处文件中用到.
4.对源码包进行deb化
方法有很多种,本文采用dh_make.dh_make --createorig命令生成制作deb包所需的默认信息并在上一层目录中生成helloworld_0.1.orig.tar.xz源码压缩包(没有源码压缩包的话dh_make将不能成功执行)。
cd hellloworld-0.1
dh_make --createorig
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch?
[s/i/m/l/k/n] s
Maintainer name : mountzf
Email-Address : xxxx@xxx.xxx
Date : Fri, 08 Jul 2019 15:44:24 +0800
Package Name : helloworld
Version : 0.1
License : blank
Type of Package : Single
Hit to confirm:
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the helloworld Makefiles install into $DESTDIR and not in / .

这里询问安装包类型,我们这里是单个可执行文件,所以我选择了s.同时系统给出了两个提示信息,我们发现当前目录中多了debian目录,里面生成了默认的打包需要的配置文件和脚本,需要自行修改
这个目录下面的文件很多,不能一一解释。这里列举几个重要的,也是绝大部分软件必须的:
control文件: 声明很多重要的变量,dpkg通过这些变量来管理软件包
copyright文件: 不用说,版权信息,相当重要
changelog文件: 这是一个必需文件,包含软件版本号,修订号,发行版和优先级。
rules文件: 这实际上是另外一个Makefile脚本,用来给dpkg-buildpackage用的.
compat文件: 这个文件留着是有用的
dirs文件:这个文件指出我们需要的但是在缺省情况下不会自动创建的目录
其中control文件我们可能需要修改。删除后缀是.ex和.EX的文件,不然如果没有修改后缀名或者删除,在打包完成的lintian检查时会有一条错误叫做:Debian帮助文件被打包进了 .debian.tar.gz

rm -rf .ex
rm -rf .EX
emacsen 开头的是针对基于 emacs 这个 IDE 的名为 emacsen 的编辑器的安装/删除/启动脚本。是打包类似 emacsen 插件这样的程序才会用到的。但是 emacsen 这个项目 2007 年就不更新了。于是无用。
initd.ex 是启动脚本,你的软件要开机自启动,才需要去编辑并重命名它,比如输入法。否则无用。
cron.d.ex 定时服务。除非你的软件有服务,并需要按周期运行。否则无用。同理 default.ex 也是这样。
doc-base.EX 是 deb 系专用的。大概意思是告诉系统各种不同格式的帮助手册在哪里可以找得到。你在乎手册吗?
manpage.
.ex 是具体的各个格式的帮助手册。
post
.ex 跟 RPM 系的 post 一样。postinst 管安装,postrm 管删除。一般是库文件会用。而且这个无需你去干预,改名去掉 .ex 就可以,dh_installdeb 会自动帮你填写。
watch.ex 是蝶变专有的,意思是关注某个 url,有变化就邮件通知你来升级。

接着要删除 README*:
rm -rf README*

其中 README.debian 是类似于 RPM 的 changelog 这样的一个存在。比如你加了补丁,改动了什么,写进去。 README.source 是描述源代码是否满足蝶变策略的文件,我们打的包都不通过蝶变官方分发,所以不用管这个。

5.修改Makefile
根据第二个提示,我们不应该将该程序安装至/根目录中,而应该在$DESTDIR,修改Makefile如下:

BINDIR=$(DESTDIR)/usr/bin

make install command.

install:
mkdir -p $(BINDIR)
$(INSTALL) $(PROG) $(BINDIR)

第一处改动是为了在build包的时候把文件安装到正确的目录,第二处修改是$(DESTDIR)/usr/local/bin并不存在,所以在安装之前需要创建安装目录。

注意:Debian要求可执行文件不能安装在/usr/local目录下,因此如果BINDIR设为/usr/local/bin的话,build的时候会出错而不能继续进行。

  1. build软件包

su root
dpkg-buildpackage -rfakeroot
此时源码已经打包完毕,生成了deb安装包helloworld_0.1-1_amd64.deb和.tar.gz压缩包
7.检查和安装

dpkg-deb -c helloworld_0.1-1_amd64.deb
dpkg -i helloworld_0.1-1_amd64.deb

dpkg -r helloworld

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/649318
推荐阅读
相关标签
  

闽ICP备14008679号