10 March 2014
最近因為安全性的關係,
我要在ubuntu 10.04上面將openssl從0.9.8k更新至1.0.1e,
以及將openssh從5.3p1更新至6.2p2
但偏偏這兩個較新的版本都沒有給10.04用的package....
所以這時候只好自己build了!
有人可能會覺得奇怪,為什麼要包成package安裝?
而不直接tar開source,然後make install就好?
因為我需要重複的更新很多次,很多檯機器!
如果在每一檯都去./configure, make, make install...那真的會很花時間!
所以最快的方式就是先在一檯機器上build package,
然後再把package拿到每一檯去安裝,
會快上許多!

喔!對了!這邊教你的是怎麼build出一包debian package!
如果你想要把這包package撒出去給別人使用,建議你要加上sign key啦!
甚至如果你想要撒到launchpad上的話,更要加上sign key!
但這裡只會教怎麼build而已!

恩,其實build還是很簡單!
難的是環境的準備跟環境的設定啊.....


在這裡會介紹兩種build debian package的方法!
  1. checkinstall
  2. debuild


這兩種的方式差蠻多的,
checkinstall它是用錄製的方式,
透過make install,然後錄下整個安裝過程,
再把打包成一個debian package!
而debuild可以想像成就是動態的去build,把所需的檔案通通包進去package!

1. install tools

先安裝所需的package,第一個是checkinstall,再來安裝ubuntu-dev-tools這個package,
ubuntu-dev-tools裡面就包含了debuild等相關需要的tools.
apt-get install checkinstall
apt-get install ubuntu-dev-tools bzr-builddeb debhelper

2. download and decompress tarball

把source code下載下來和解壓縮開,
cd ~
wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz // download ssl
tar xvzf openssl-1.0.1e.tar.gz

wget http://openbsd.org.ar/pub/OpenBSD/OpenSSH/portable/openssh-6.2p2.tar.gz // download ssh

cd openssl-1.0.1e

3. Config and Compile source code

這一步蠻重要的,
要進行config和make(compile),
但!!!只有checkintall需要“先”config and compile!
先config,openssl的config還好,但openssh的config要稍微注意一點,
openssh的config要特別帶一個--sysconfdir,
這個參數是說明你將來的sshd_config, ssh_config, ssh_host_xxx_key要放在哪裡,
如果你沒有帶這個參數,預設應該是會存在/usr/etc/底下,老實說蠻奇怪的!
所以還是指定一下吧!
那因為前面剛剛說了,只有openssl需要先config,所以等等會再說openssh怎麼去設定config,
先設定openssl的config,
./config

進行make,make就是compile,把你的source code compile成binary,
make


4. Build package (checkinstall)

前面說了build package,這裡會介紹兩種方法(其實蠻多種方法的),
我會先用checkinstall build ssl,然後用debuild build ssh,
首先是ssl,
checkinstall make install
checkinstall的原理就是會去錄製接在它後面那個command所作的事情,
所以我們後面接make install(就是安裝),
make install下下去以後就會真的去安裝這個package,
然後checkintall就會在旁邊錄起來!
checkinstall這個指令按下enter以後,會出現幾個preconfig的訊息,
你要先替這個package建立一些information,
第一個是會問你doc,這個就是直接y下去!(如下圖)

接著是要你描述一下這個package是做什麼的(如下圖)

最後就是這package的相關資訊,你可以改掉maintainer是誰,
改成自己email!(如下圖)

那怎麼看有沒有成功?
因為你是下make install,
所以最後build的流程會去幫你安裝,
如果安裝失敗, 那你的package也不會存在!

那有人可能只是單純想要build package,而不想要安裝這個package在這檯機器上,
那該怎麼辦?
checkinstall有額外的參數可以做這件事情,多帶一個--install就行!
checkinstall --install=no make install



5. Build package (debuild)

上面介紹了checkinstall的方法,
現在要介紹debuild的方式,
那這裡我們以opennssh為範例,
透過debuild比較算是debian的practice,
首先要先有debian的資料夾,
這資料夾下面有一堆林林種種的config file,甚至是init.d,
那我們難道要一個一個的設定這些config?
當然不用,可以透過dh_make去幫我們產生template,

那可是透過dh_make也有點麻煩,就是要接一堆參數,
那好險Canonical有提供另一個tool(bzr)去幫我們handle這件事情,
透過bzr就可以幫我們產生debian/*底下的template,
cd ~
bzr dh-make openssh 6.2p2 openssh-6.2p2.tar.gz
bzr會問你這是一個single binary, indep binary, multiple binary, library, kernel module, kernel patch or cdbs?
就選single binary(如下圖),


dh-make會先幫你建立一個opepssh的資料夾,裡面其實就是下載的那個tarball解開!
進到openssh資料夾,你會發現裡面會有另外一個debian資料夾,
這個資料夾裡面通通都是build debian package所需要的file,
有幾個file蠻重要的,
像是control, changelog, docs,
這些就是dh_make幫我們建好的template,既然是template,
所以就有些欄位要改掉!不過都是一些基本的information,所以這裡就不一一介紹!

接著就要開始build,
build其實是靠debian/rule來trigger,
rule裡面要放一些dh_autoconfiguration, dh_install, dh_xxxx.....etc,
一堆的command,
不過template已經幫我們建立好了dh $@,我們就不用一一處理!

在開始build之前,
有個比較dirty的事情要先做,
前面不是有說要設定--sysconfdir嗎?
debian的practice是透過override_dh_auto_configure去做,
override_dh_auto_configure會幫我們把要帶的參數再帶給./configure,
但偏偏我怎麼試都帶不過去,最後只好用dirty的方式,
就是去找到source code,去硬改sysconfdir的位置,
預設會是/etc,
但我想要放在/etc/ssh底下,
那個source code位置就在/usr/share/perl5/Debian/Debhelper/Buildsystem/autoconf.pm,
找到下面這行,把/etc再改成我要的...
push @opts, "--sysconfdir=/etc";
那因為這方法真的蠻dirty的,如果有哪位大大知道該怎麼正確的透過override_dh_auto_configure去設定,
歡迎告訴我~


最後就可以用debuild build了
後面帶的參數意思就是不要sign source pacakge and .changes files,
debuild -uc -us -B


最後說明一下另一個command,
這command可以來看package裡面有些什麼!
lesspipe openssh-6.2p2.deb
可以拿這command來簡單的驗證一下build有沒有成功!



















blog comments powered by Disqus