redis打包deb笔记

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脚本(编译参数,可能没有)

  1. 下载源代码并解压

    wget http://download.redis.io/releases/redis-2.8.19.tar.gz
    tar xvzf redis-2.8.19.tar.gz

  2. 生成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 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:
#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有些不同:

  1. 它会根据系统生成服务脚本,需要运行它的install_server.sh。解决办法,把Makefile中的install那部分改为运行这个脚本。。

install:

    cd utils && ./install_server.sh
  1. 源代码编译阶段,不知为何会对release.h进行修改,导致与上游源不匹配,dpkg-buildpackage失败。这时候需要dpkg-source --commit一下。

  2. 如果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。。

你可能感兴趣的:(redis打包deb笔记)