redis打包deb筆記

#deb包打包 對於Linux一些從源代碼編譯的軟件,有這能夠定製安裝的好處,但也有管理不方便的壞處(portage之流除外)。爲了集羣化部署,最好仍是將編譯好的源代碼打包html

##通常編譯: 對於不一樣的Linux軟件源代碼,編譯安裝細節會不同,可是離不開三部曲框架: 1 ./configure或者其餘名字 這一步主要用於檢查軟件的編譯運行所須要的依賴關係,例如查看某些連接庫是否存在。有的軟件還會進一步分析主機信息生成相應的配置。 2 make option 編譯階段 就是把源代碼編譯(通常是根據makefile)可執行的程序或者庫。有的軟件./configure寫的很差,可能會致使make階段出錯,不過通常是提示你缺乏一些軟件包,google下,安裝上軟件包便可,軟件自己編譯失敗的例子不多(也不是沒有)。 3 make install 安裝階段 這個階段會將編譯生成的文件安裝到系統中(根據Makefile的配置),例如將可執行文件放到/usr/bin下,把連接庫放到/usr/lib下等。此外有的軟件可能有安裝腳本,進行一些配置工做(例如redis)。 總之,源代碼中通常會有README或者INSTALL之類的文件,編譯安裝前先閱讀如下。git

##打包成deb 先決條件:redis

  • 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. 下載源代碼並解壓ubuntu

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

  2. 生成Debian控制文件 這個過程能夠本身手寫,創建Debian的control等文件,能夠參考Debian wikiDebian新維護人員手冊。 更通常的過程是使用自動話工具生成而後修改,例如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 #注意解壓後的源代碼文件夾須要以<軟件包>-<版本號>方式命名框架

而後是一些交互式操做:ide

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 / .post

這時候文件夾裏會有一個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有些不一樣:

  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。。

相關文章
相關標籤/搜索