http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=220&blogId=1取得原始碼

雖然 Debain 的套件管理主要是操作 deb 這類已編譯好的套件檔,但官方的 Debian Archiver 裡的所有套件同時都會附上原始碼,且這些原始碼會和 deb 檔放在同一個目錄之下。這種公開透明的作法是很讓人激賞的。

而在 Debian 中要取得套件的原始碼也出乎意料得簡單。首先,和 deb 類似的,您必須在 /etc/apt/sources.list 中加入 deb-src 項目,來指示 apt-get 如何取得原始碼。例:

# lenny
deb http://ftp.tw.debian.org/debian stable main contrib non-free
deb-src http://ftp.tw.debian.org/debian stable main contrib non-free
然後,在進行 apt-get update 後,就可以使用 apt-get 直接取得放在 Debian Archiver 中的原始碼了。以 zsnes 為例:
apt-get source zsnes
一般下載回來的原始碼會包含以下檔案:
zsnes_1.510-2.2.dsc → 套件資訊及驗証碼
zsnes_1.510.orig.tar.gz
→ 原始碼
zsnes_1.510-2.2.diff.gz → 編譯套件所需的完整 debian 目錄
如果您有安裝 dpkg-dev 套件,在下載完成後 apt-get 還會自動替您解壓縮。您也可以自行手動解開那些 *.tar.gz 檔,或是在稍後安裝了 dpkg-dev 套件後,使用以下指令來解開套件:
dpkg-source -x zsnes_1.510-2.2.dsc
但並不是所有的 deb 套件主機都會提供原始碼就是了。
準備套件編譯環境:
如果您想手動編譯編譯,建議您能依照 在 Debian GNU/Linux 裡建立 chroot 環境 裡的說明,使用 chroot 環境來編譯套件。

在 Debian 裡,已有方便的指令讓您能輕鬆得準備好某個套件的編譯環境。以 LilyTerm 為例:
apt-get build-dep lilyterm

apt-get 將會依據 lilyterm 套件所提供的編譯資訊自動把所有相關的套件全部安裝進來。(此時就是 Package Maintainer 的功力大考驗了)

但如果出現了以下錯誤訊息:

# apt-get build-dep lilyterm
E: 無法滿足套件 lilyterm 的編譯相依關係。
請試著以以下指令找出 LilyTerm 的相依套件:
apt-cache showsrc lilyterm | grep '^Build-Depends'
並手動安裝這些套件,來找出這些套件無法安裝的原因。
重新編譯 deb 套件
若您想自行編譯這些套件,請在取得 deb 套件原始碼並準備好編譯環境後,進入套件的目錄裡,並下達以下指令:
dpkg-buildpackage -rfakeroot -us -uc

就會開始編譯套件並生成 deb 檔了。

不過,建議您在編譯之前,能修改 debian/changelog 檔,並在原始版號後面加上 .foo,像是由 1:0.17.4-21:0.17.4-2.im,如此可以避免下次下達 apt-get upgrade 時,又將原始的 1:0.17.4-2 給裝了進來。apt-get 預設遇到相同版號時,會以列在 source.lists 裡的套件為優先。

而加上了 .foo 另一個優點是,若有新的版本出現時,如 1:0.17.4-3,它將會安裝更新後的版本。若您在 apt-get upgrade 時發現這個軟體有推出了新版本,您可能想要確認新的版本是不是已符合您的需求,或再重新編譯這個新版本,並在新版號後面再次加上 .foo,並待及下次版本更新。如此應該是比較合宜的做法。

自行編譯新版的 deb 套件
如果某個軟體推出了新版本,但卻未能及時進入 Debian Archiver 之中,您可能會希望自行編譯 deb 套件。但如何編譯新版的套件會是個不小的挑戰,以下為個人的作法:

首先,先取得 deb 套件原始碼:
apt-get source zsnes
然後,取得新版的 zsnes 的原始碼,(否則 dpkg-buildpackage 會出現警告訊息…但因為只是警告訊息,所以其實不改也無所謂。感謝 caleb 的指正!):
wget http://zsnes.sf.net/zsnes151bsrc.tar.bz2
tar xvjf zsnes151bsrc.tar.bz2
並將原本 deb 套件原始碼中的 debian 目錄複製到新版本的目錄裡:
cp -a zsnes-1.510/debian/ zsnes_1_51b
然後,進入套件的目錄,並修改 debian/changelog 以反應新版本的變化:
vi debian/changelog

dch -i

在此建議在 debian/changelog 裡使用像是 1.510+b-0~1 之類的版本號碼,那麼在該新版(Debian 可能會用 1.510+b-1 這個版本號碼)進入 Debian 時,就可以利用 apt-get 直接升級為 Debian 官方的版本了。

接下來,依據新版本的變化修改 debian 目錄裡的檔案,而這可不是件容易事。

完成後,下達以下指令,就應該能產生新的 deb 套件了:

dpkg-buildpackage -rfakeroot -us -uc
當然,過程肯定不會如此輕鬆寫意,您必須對如何打包 deb 套件有一定的認識才能讓以上過程更容易些。但其實大部份套件在版本間的變化不會太過劇烈,以上步驟的成功機率其實蠻高的。
自行編譯 deb 套件懶人法
如果您對於如何打包 deb 套件一無所知,但您又不希望使用 ./configure; make; make install 來安裝軟體,Debian 也提供了一個 deb 套件懶人法。

LilyTerm 為例,您按照其網站上的說明,安裝了 libvte-devautoconfautomakegettextlibxml-parser-perlintltool 等套件,並執行 ./autogen.sh 來產生 configure 檔案,並進行編譯。然後 不要下達 make install,取而代之的是執行 checkinstall 指令:
bash . /autogen.sh

./configure --prefix=/usr \
            --mandir=/usr/share/man \
            --infodir=/usr/share/info \
            --sysconfdir=/etc

make

checkinstall
在回答幾個問題後,不一會兒一個懶人版的 lilyterm_0.9.7-1_i386.deb 就會出現了。這個作法雖然不盡完美,但實在十分的方便,您或許想要嘗試看看。
自行編譯 Linux Kernel
如果您想要自行編譯 Linux Kernel,Debain 也提供了極便利的作法。

首先,就如同一般編譯 Linux Kernel 的做法,您得先取得 Linux Kernel 的原始碼,然後解壓縮。當然,您可以去 Linux Kernel 官方站台下載;但在 Debian 裡也提供了個方便的方法:
apt-get install linux-source-2.6.29

它會把 Linux Kernel 放在 /usr/src 裡。

接下來,依您的需求套用像 L7-filter 或是 reiser4 之類的 patch,在此就不贅述了。

然後,進入 Linux Kernel 的原始碼目錄裡,下達:
make menuconfig

來指定 Kernel 的編譯項目。Debian Kernel 的官方 config 可於 /boot 下找到。

在設定完成後,下達:

make-kpkg --config oldconfig --rootcmd fakeroot --uc --us --initrd kernel_image modules_image
就會開始編譯 Kernel 的 deb 檔了。依您的編譯選項及機器等級,有時得需數個小時才能完成編譯工作。
自行編譯 Kernel Module
Debian 對於如何編譯 Kernel Module 也提供了很方便的作法:利用 module-assistant

首先,安裝 module-assistant 套件:
apt-get install module-assistant
然後,準備好 module-assistant 編譯環境:
module-assistant prepare
然後,試著找出 module-assistant 所使用的模組名稱:
# module-assistant search nvidia
nvidia-kernel-source (source package not installed):
-- Binary package(s) for kernel(s):
   + (2.6.26-1-vserver-686):
接下來,指定 module-assistant 編譯該套件即可:
# module-assistant auto-build nvidia-kernel-source
Extracting the package tarball, /usr/src/nvidia-kernel.tar.bz2, please wait...
Done with /usr/src/nvidia-kernel-2.6.26-1-vserver-686_173.14.09-5+2.6.26-13_i386.deb .

之後安裝那個由 module-assistant 所生成的 deb 套件就大功告成了。

如果您不是使用 chroot 環境來編譯模組的話,您或許想使用以下指令:

# module-assistant auto-install nvidia-kernel-source

它會自動編譯 deb 套件,並在編譯完成後,自動安裝該 deb 套件,並一併把所有相依套件都自動裝進來。

不過以上作法僅可用於 Debian 有提供的 *-source 套件。至於 Debian 沒有提供的套件,請參考上文中的 make-kpkgcheckinstall 吧!

系統預設指令

有些指令,像是 visudo 或是 crontab -e,它們會呼叫『預設文字編輯器』來編輯設定檔。

在 Debian 裡,使用了一套『替代指令』來讓使用者可以方便的指定這些系統的預設指令。例如,您想指定要將哪個指令做為預設文字編輯器:

update-alternatives --config editor
或是要指定系統的預設 Window Manager:
update-alternatives --config x-window-manager
或是要指定系統的預設 X Terminal Emulator:
update-alternatives --config x-terminal-emulator
或是重設系統的所有預設指令:
update-alternatives --all
而哪些套件可當做系統預設指令基本上是由套件的維護者指定的,不過您也可以手動設定。請參考 update-alternatives 的說明文件以取得更多的資訊。
錯誤回報
當然,Debian 絕非盡善盡美的系統。如果您發現了 Debian 套件裡的任何錯誤,或是希望 Debian 套件提供什麼功能時,您可以利用 reportbug 向 Debian bug tracking system (BTS) 回報。例如,向 gcin 的 Debian Package Maintainer 回報錯誤:
reportbug gcin

您可以在 ~/.reportbugrc 中設定您的名字及 E-mail 帳號:

realname "Tetralet"
email "[email protected]"
一般而言,您還必須同時設定您的 SMTP Server。以 GMAIL 為例:
smtphost smtp.gmail.com:587
smtpuser [email protected]
smtppasswd XXX
smtptls
另外,像是 Debian Package 的翻譯檔也都可以利用 BTS 來提交。個人認為,Debian 的錯誤回報系統正是 Debian 如此與眾不同的主因之一,它的確有助於提昇 Debian 套件的品質。

不過,相反的,因為有了 BTS 這套錯誤回報系統,Debian 的 Package Maintainer 常常會為了修正某些比較罕見的問題而打上一些未經過完整測試的修正檔,這有時會讓 Debian 的套件和其它 Linux 發行版比起來是過於激進了,有時候甚至會造成不小的問題,像之前的 SSH 事件便是一例。

以上所列出的僅是敝人常用的 DPKG/APT 指令,至於其它的指令及參數請參閱各指令的說明文件,在此卓實無法一一列出。

Debian 提供了很強大的套件管理機制,對於一般的使用者而言,只要熟習幾個指令並按照 Debian 的規則走,它是很方便很容易上手的;對於熟習於 Debian 套件管理機制的人,有時要轉換到其它系統去還會適應不良呢!

但相對的,對於已熟習於其它系統的進階使用者或是套件維護者而言,Debian 的套件管理規則就顯得過於複雜且艱澀,也難怪有人在抱怨某些 Debian 套件包得實在不怎麼樣 - 因為 Debian 的規則實在多到讓人很難消化。不過,只要熟悉以上操作,基本上 Debian 的套件系統是很強大很穩定的;就算套件若真有什麼問題,透過 Debian 的 BTS 系統大部份應該都能有效解決;再加上 Debian 的使用者眾多,只要有任何問題大多都會在短期間被發掘出來,也因此 Debian 系統的品質一直是在水準之上的。個人認為,不管對於初學者或進階使用者而言,Debian 絕對是一個很不錯的選擇。

咦?aptitude 呢?個人在使用上,發現 apt 除了在要 hold 套件時沒有比較直覺的指令外,其它的地方都比 aptitude 好用多了。(也許是我不熟悉 aptitude 啦!);反正系統中只需一組套件管理程式就夠了,所以,我安裝好系統的第一件事,就是把 aptutide 給 purge 掉:
apt-get purge aptitude tasksel tasksel-data
嗯,還是單純的命令列比較好用呀! XD