#deb包打包 对于Linux一些从源代码编译的软件,有这可以定制安装的好处,但也有管理不方便的坏处(portage之流除外)。为了集群化部署,最好还是将编译好的源代码打包
##一般编译: 对于不同的Linux软件源代码,编译安装细节会不一样,但是离不开三部曲框架: 1 ./configure
或者其他名字 这一步主要用于检查软件的编译运行所需要的依赖关系,例如查看某些链接库是否存在。有的软件还会进一步分析主机信息生成相应的配置。 2 make option
编译阶段 就是把源代码编译(一般是根据makefile)可执行的程序或者库。有的软件./configure写的不好,可能会导致make阶段出错,不过一般是提示你缺少一些软件包,google下,安装上软件包即可,软件本身编译失败的例子很少(也不是没有)。 3 make install
安装阶段 这个阶段会将编译生成的文件安装到系统中(根据Makefile的配置),例如将可执行文件放到/usr/bin下,把链接库放到/usr/lib下等。此外有的软件可能有安装脚本,进行一些配置工作(例如redis)。 总之,源代码中一般会有README或者INSTALL之类的文件,编译安装前先阅读以下。
##打包成deb 先决条件:
- dh_make(dh-make包的一部分)——用于自动创建./debian目录和其他用于创建.deb包的骨架模板文件;
- make(Gnu make)——构建过程中要用到的工具;
- debchange/dc(devscripts包的一部分)——用于编辑包的版本号;
- debuild(devscrihpts包的一部分)——运行构建过程,包括编译连接,以及生成deb包;
- fakeroot(fakeroot包的一部分)——这个东西是必须的;
- dput——上传经过签名的deb文件,这个不上传的话可以忽略。
Deb文件分析: deb文件主要由两部分,其中第一部分是软件本身的文件,可能包括可执行文件,库,配置文件,服务配置文件(/etc/init.d等,还有一部分就是Debian的控制文件,包括control、postinst(安装后执行的动作)、postrm(删除操作后执行的动作等)、rule脚本(编译参数,可能没有)
-
下载源代码并解压
wget http://download.redis.io/releases/redis-2.8.19.tar.gz
tar xvzf redis-2.8.19.tar.gz
-
生成Debian控制文件 这个过程可以自己手写,建立Debian的control等文件,可以参考Debian wiki和Debian新维护人员手册。 更一般的过程是使用自动话工具生成然后修改,例如checkinstall(rpm也可以偶)等。这里使用Debian和ubuntu官方推荐的 dh_make工具
mv redis-2.8.19 redis_2.8.19.orig.tar.gz #重命名成这种形式,便于dh_make分析
cd redis-*
dh_make -f ../redis-2.8.19.orig.tar.gz #注意解压后的源代码文件夹需要以<软件包>-<版本号>方式命名
然后是一些交互式操作:
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch? [s/i/m/l/k/n] s #这里一般选择single,如果你的软件包比较大,可以选择m,其余可以参考man手册。主要是处理方式不同。
Maintainer name : root
Email-Address : root@debian
Date : Wed, 07 Jan 2015 23:36:49 +0800
Package Name : redis
Version : 2.8.19
License : blank
Type of Package : Single
Hit <enter> to confirm:
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the redis Makefiles install into $DESTDIR and not in / .
这时候文件夹里会有一个debian文件夹:主要修改下control,copyright之类文件的个人信息,软件描述信息还有依赖关系,构建依赖等等等等。如果可以,你也可以修改以下rules文件,进行编译优化。写依赖关系是一件比较麻烦的事,说明里提到的软件包名称并不一定是你系统软件包的名字,需要确定,为了节约时间,这里直接使用apt-get download redis-server
下载的deb包做演示:
source: redis
section: unknown
priority: extra
maintainer: wgjak47 wgjak47@debian
build-depends: debhelper (>= 8.0.0)
standards-version: 3.9.3
homepage: <insert the upstream url, if relevant>
#vcs-git: git://git.debian.org/collab-maint/redis.git
#vcs-browser: http://git.debian.org/?p=collab-maint/redis.git;a=summary
package: redis architecture: amd64 depends: libc6 (>= 2.14), libjemalloc1 (>= 2.1.1),adduser section: description: by wgjak47
这个control只是实验演示使用的,如果deb要对外发布,一定要认真对待每一个字段。
此外对于服务,例如数据库,还需要配置preinst,prerm,postinst,postrm四个文件。主要是自动启动/关闭服务,防止服务运行中卸载等情况。例如redis就是,内容太多,就不贴了。
3.一般情况下大部分软件都可以直接dpkg-buildpackage -rfakeroot
,但是redis有些不同:
- 它会根据系统生成服务脚本,需要运行它的install_server.sh。解决办法,把Makefile中的install那部分改为运行这个脚本。。
install:
cd utils && ./install_server.sh
-
源代码编译阶段,不知为何会对release.h进行修改,导致与上游源不匹配,dpkg-buildpackage失败。这时候需要
dpkg-source --commit
一下。 -
如果dpkg-buildpackage中间失败,再进行可能会提示冲突,需要进行手动清理。
PS 如果打包过程遇到问题,可以通过apt-get source redis
下载官方的源代码包,进行参考。 PS2 Debian官方打的redis包竟然是这么处理的,一个个映射过去Orz: cat redis-tools.install src/redis-benchmark /usr/bin src/redis-cli /usr/bin src/redis-check-aof /usr/bin src/redis-check-dump /usr/bin debian/bash_completion.d /etc
是redis的Makefile写的有问题,还是Debian的打包人员编译的方法不对??ORZ。。