Debian 打包入門指南
最近筆者忙於為一些 Debian 衍生發行版打包軟體包,這些發行版往往都會使用 deb 包作為默認的軟體包,作為 Linux 世界兩大軟體包格式之一(另一個是 RedHat 系的 rpm 包),deb 包的使用場景非常廣泛,本篇文章就來教各位讀者如何修改現有的軟體包並重新構建自己的 deb 包。
環境準備
在開始打包之前,首先需要準備好必須的各種工具,只需要打開終端並輸入如下命令:
sudo apt-get install build-essential fakeroot devscripts
這條命令會將 build-essential、fakeroot 和 devscripts 安裝到我們的電腦上,之後我們會用到這些軟體。
獲取軟體包
在準備好必須的工具之後,我們還需要獲取準備修改的原始軟體包,有兩種途徑可以獲取:
- 直接從軟體源網站上下載
- 配置 apt 源 並使用 apt source 下載
筆者更喜歡用第一種方式(因為比較方便),不過更正規的方式是使用 apt source
下載,因此接下來就向各位介紹這種方法。
首先,我們需要修改 apt 的軟體源列表,因為在默認情況下,apt 不會下載原始軟體包。打開 /etc/apt/sources.list
文件,並檢查下面的這行代碼是否已經取消注釋:
deb-src http://httpredir.debian.org/debian unstable main
如果沒有,去掉這行的注釋,保存並退出,之後運行:
sudo apt update
apt 就會更新剛才取消注釋的軟體源,以便之後進行下載。
選取軟體包
本次我們選取 node-pretty-ms 作為演示,首先使用 apt source
將該軟體包下載至本地:
apt source node-pretty-ms
下載完成後,使用 ls 命令查看當前目錄,應該會多出三個文件:
node-pretty-ms_7.0.1-1.debian.tar.xz
node-pretty-ms_7.0.1-1.dsc
node-pretty-ms_7.0.1.orig.tar.gz
這三個文件共同構成了 deb 包,其中第一個壓縮包中包含了 deb 包的補丁、打包規則等,第二個文件是 deb 包的元數據文件,第三個壓縮包則是原始上游源碼,要對這個包進行修改,我們可以使用如下命令:
dpkg-source -x node-pretty-ms_7.0.1-1.dsc
這條命令會在當前目錄下生成一個名為 node-pretty-ms-7.0.1
的子目錄,使用 cd 命令進入該子目錄後再使用 ls 命令,即可看到原始 deb 包的結構,最核心的就是 debian 目錄,其中包含了製作一個 deb 包所需的各種文件。
lrzlin@LionBattery:~/article/node-pretty-ms-7.0.1/debian$ ls
changelog control copyright docs gbp.conf patches rules salsa-ci.yml source tests upstream watch
其中我們要關注的是下面四個文件:
- changelog 中包含了每次修改的作者、修改內容、時間等信息
- control 中則包含了軟體包的名稱、維護者、構建依賴等信息
- patches 目錄中包含了軟體包作者們對上游代碼進行的修改
- rules 中是該軟體包的構建腳本
這些文件基本就是 deb 包的核心部分,也是我們之後對軟體包進行修改主要涉及的部分。
初次構建
瀏覽完軟體包的整體結構之後,我們就可以嘗試對該軟體包進行構建了,不過在此之前,我們首先需要安裝它所需的各種構建依賴,使用如下命令即可:
sudo apt build-dep node-pretty-ms
apt 會自動按照軟體包 control 文件中描述的構建依賴幫助我們安裝需要的依賴,下載安裝完成之後,使用 debuild 命令進行構建:
debuild -b -uc -us
等待命令運行完成後,即可在上級目錄找到編譯完成的 deb 包。
修改源碼
當然,我們本次的目標並不止於原封不動的重新編譯 deb 包,畢竟如果這樣的話為什麼不直接從伺服器下載呢?我們要做的是對源碼進行修改並重新編譯:
cd node-pretty-ms-7.0.1
vim index.js
將其中的
throw new TypeError('Expected a finite number');
修改為
throw new TypeError('Expected a finite number!');
保存並退出,使用如下命令編寫日誌
dch -i -Dunstable
此處的 unstable 指的是軟體發行通道,同時因為我們並非官方的維護者,因此由我們做出的更改會默認加入 * Non maintainer upload.
這樣的說明,我們需要在下一行寫明我們對源碼做的修改:
寫完 changelog 之後,就可以退出編輯器,使用如下命令生成補丁:
dpkg-source -b . --commit
輸入補丁名稱並確認,這條命令就會將我們之前所做的修改保存至 debian/patches
目錄下,並在編譯源碼時自動應用。
完成上述的修改之後,使用如下命令重新生成 dsc 源碼
dpkg-source -b .
再次回到上級目錄,即可看到新生成的 .dsc
和 debian.tar.xz
文件,這些就是應用了我們之前的修改的新 deb 包,要重新編譯,只需要回到源碼子目錄,並重新輸入:
debuild -b -uc -us
接下來坐等收包就好啦!
進階技巧
使用上面的方式直接進行編譯雖然方便,但當我們大規模進行打包的時候就會出現問題了:不同包的依賴不同,反覆安裝不僅非常麻煩,有時還可能造成依賴計算錯誤——明明不需要依賴的軟體包卻成了必須依賴,這樣你打出來的軟體包可能在本機運作一切正常,可放在別人的機器上卻沒法正常編譯和安裝了,這就輪到 pbuilder
和 sbuild
出場了:這些工具可以幫助我們建立一個隔離的環境,類似 chroot
或者 docker
,不過對打包做了更多的特定優化,以下就以 pbuilder
為例作為演示,
要安裝 pbuilder
,只需要在終端輸入如下指令:
sudo apt install pbuilder
安裝完成之後,使用如下命令創建編譯環境
sudo pbuilder create
這一步會為我們配置一個完整的環境用於之後的編譯,等待創建完成之後,運行如下的命令即可完成編譯
pbuilder build node-pretty-ms_7.0.1-1.dsc
這就是關於 deb 打包的簡短教程了,至於 pbuilder 更加進階的用法,就等各位讀者進一步挖掘了。
參考文章:
https://wiki.debian.org/BuildingTutorial
https://www.cnblogs.com/Gui-Yue/articles/16967031.html