#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
Deb文件分析: deb文件主要由兩部分,其中第一部分是軟件自己的文件,可能包括可執行文件,庫,配置文件,服務配置文件(/etc/init.d等,還有一部分就是Debian的控制文件,包括control、postinst(安裝後執行的動做)、postrm(刪除操做後執行的動做等)、rule腳本(編譯參數,可能沒有)數據庫
下載源代碼並解壓ubuntu
wget http://download.redis.io/releases/redis-2.8.19.tar.gz
tar xvzf redis-2.8.19.tar.gz
bash
生成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 #注意解壓後的源代碼文件夾須要以<軟件包>-<版本號>方式命名
框架
而後是一些交互式操做: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有些不一樣:
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。。