長篇分享

Debian 打包入門指南

最近筆者忙於為一些 Debian 衍生發行版打包軟體包,這些發行版往往都會使用 deb 包作為默認的軟體包,作為 Linux 世界兩大軟體包格式之一(另一個是 RedHat 系的 rpm 包),deb 包的使用場景非常廣泛,本篇文章就來教各位讀者如何修改現有的軟體包並重新構建自己的 deb 包。

環境準備

在開始打包之前,首先需要準備好必須的各種工具,只需要打開終端並輸入如下命令:

 sudo apt-get install build-essential fakeroot devscripts

這條命令會將 build-essential、fakeroot 和 devscripts 安裝到我們的電腦上,之後我們會用到這些軟體。

獲取軟體包

在準備好必須的工具之後,我們還需要獲取準備修改的原始軟體包,有兩種途徑可以獲取:

  1. 直接從軟體源網站上下載
  2. 配置 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

其中我們要關注的是下面四個文件:

  1. changelog 中包含了每次修改的作者、修改內容、時間等信息
  2. control 中則包含了軟體包的名稱、維護者、構建依賴等信息
  3. patches 目錄中包含了軟體包作者們對上游代碼進行的修改
  4. 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 .

再次回到上級目錄,即可看到新生成的 .dscdebian.tar.xz 文件,這些就是應用了我們之前的修改的新 deb 包,要重新編譯,只需要回到源碼子目錄,並重新輸入:

debuild -b -uc -us

接下來坐等收包就好啦!

進階技巧

使用上面的方式直接進行編譯雖然方便,但當我們大規模進行打包的時候就會出現問題了:不同包的依賴不同,反覆安裝不僅非常麻煩,有時還可能造成依賴計算錯誤——明明不需要依賴的軟體包卻成了必須依賴,這樣你打出來的軟體包可能在本機運作一切正常,可放在別人的機器上卻沒法正常編譯和安裝了,這就輪到 pbuildersbuild 出場了:這些工具可以幫助我們建立一個隔離的環境,類似 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

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0

You may also like

Leave a reply

您的電子郵箱地址不會被公開。 必填項已用 * 標註

此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

More in:長篇分享

信息安全

深度解析shellcode原理及編碼技術

本篇文章深度探討了Shellcode的原理,同時對64位和32位系統下的shellcode進行了詳細解讀。並詳細介紹了Shellcode的編碼技術,其中包括手寫Shellcode的兩種思路。對於編碼Shellcode,本文列舉了幾種常見的解碼器的實現,如FNSTENV XOR解碼器和JMP/CALL解碼器。最後,本文列舉了幾種常見的字符集以及Shellcode編碼工具,並推薦了兩個可查找現成Shellcode的資料庫。
教程

將USB設備連接到WSL2:分步教程

這篇教程詳細地介紹了如何在Windows Subsystem for Linux 2(WSL2)中使用USB設備。首先,我們需要安裝在Windows上共享USB設備的軟體usbipd-win,並進行相應的設置。接下來,我們會在WSL內部安裝USB/IP的用戶空間工具和USB硬體標識符的資料庫。再接下來的步驟是配置udev規則以允許非root用戶訪問設備。最後,我們將通過使用usbipd的WSL便利命令來連接設備。在連接或斷開設備後,我們可以在WSL內部檢查已連接的USB設備。