Debian Package 打包

Yi Jyun
7 min readFeb 28, 2021

--

紀錄如何把依賴 systemd 的 service 打包為一個 Debian package

這邊以 simple http server 做為說明。下載下來後,檔案結構大致上可分為 service 與 debian package 打包兩類。

root@ab3cd464d509:/home/simplehttpserver# tree -L 1
.
|-- Makefile
|-- README.md
|-- debian
|-- simplehttpserver.py
`-- simplehttpserver.service

先安裝所需的 package ,接著在 simplehttpserver目錄內執行 debuild 指令,就可以產生所需要的 debian package

root@ab3cd464d509:/home/# apt install debhelper devscriptsroot@ab3cd464d509:/home/simplehttpserver# debuild -uc -usroot@ab3cd464d509:/home/simplehttpserver# tree  -L 2 ../
../
|-- simplehttpserver
| |-- Makefile
| |-- README.md
| |-- debian
| |-- simplehttpserver.py
| `-- simplehttpserver.service
|-- simplehttpserver_1.0.0.dsc
|-- simplehttpserver_1.0.0.tar.gz
|-- simplehttpserver_1.0.0_all.deb
|-- simplehttpserver_1.0.0_amd64.build
|-- simplehttpserver_1.0.0_amd64.buildinfo
`-- simplehttpserver_1.0.0_amd64.changes

1. Service

root@ab3cd464d509:/home/simplehttpserver# tree -L 1
.
|-- Makefile
|-- README.md
|-- debian
|-- simplehttpserver.py
`-- simplehttpserver.service

service 相關的檔案為

  • simplehttpserver.py

為一個簡單的 http server。

  • simplehttpserver.service

透過 systemd 去控制這個 http server 的 service file。

  • Makefile

debian 打包時候會呼叫此 makefile 去進行編譯、安裝等等的動作。舉例來說,在打包 deb 的時候。debian/rules 會執行 dh_auto_install [1]實際就是呼叫 make install 並挾帶 DESTDIR 變數。

* dh_auto_install usually executes the following if a Makefile exists with the install target (line folded for readability).

make install \
DESTDIR=/path/to/package_version-revision/debian/package

因此在 Makfile 就要使用 DESTDIR 作為安裝檔案的前綴路徑。

BIN_DIR  := ${DESTDIR}/usr/bininstall:
mkdir -p ${BIN_DIR}
install -m 644 *.py ${BIN_DIR}/

由於要使用 debhelper 來幫助處理 service file。這邊直接安裝於 ./debian 目錄即可 [2][3]

install -m 644 simplehttpserver.service ./debian/

2. Debian 部分

root@ab3cd464d509:/home/simplehttpserver# tree debian/
debian/
|-- changelog
|-- compat
|-- control
|-- copyright
|-- postinst
|-- postrm
|-- preinst
`-- rules

這邊描述打包 debian 所需要的檔案

  • debian/chagenlog[4]

描述 package 的版號、修改等資訊

simplehttpserver (1.0.0) unstable; urgency=medium* Releae 1.0.0
Thsi is an example for packing debian package
-- Yi-Jyun Lin <abc@test.com> Mon, 1 Mar 2021 12:00:00 +0800
  • debian/compat [5]

compat 檔案定義了 debhelper 的相容級別

10
  • debian/control [6]

描述 source package 與 binary package 的資訊

Source: simplehttpserver
Maintainer: Yi-Jyun Lin <abc@test.com>
Section: utils
Priority: standard
Build-Depends: debhelper (>= 9)
Standards-Version: 1.0.0
Package: simplehttpserver
Architecture: all
Section: utils
Priority: standard
Depends: ${shlibs:Depends}
Recommends:
Conflicts:
Description: This is sample for packing debian package
  • debian/Copyright [7]

package 發布的許可證

  • debina/rules [8]

簡單說就一個 makefile,定義了許多 recipe 來編譯、打包 package。若是想修改預設的 recipe,加上 override_xxxx 即可。以 dh_auto_install 來說就是 override_dh_auto_install。

#!/usr/bin/make -f
#export DH_VERBOSE = 1
%:
dh $@
  • preinst / postinst / postrm

deb package 安裝於系統時候,所會執行的 hook scripts。這邊若沒有建立相關的 script。debhelper 會自動產生。然而若是有自己的 script 。但是想使用 debhelper 所幫忙產生的 script 。便需在 script 加上 #DEBHELPER# 。這邊 debhelper 所產生的 script 才會被加進來。

# debian/postinst
#!/bin/bash
#DEBHELPER#

這邊加上去的用意是為了把 debhelper 產生的 systemd 相關 script 給引用進來。

Referece

  1. Chapter 4. Required files under the debian directory
  2. dh — with systemd
  3. Debhelper
  4. debian changelog
  5. debian compat
  6. debian contorldebian control(中文)
  7. debian copyright
  8. debian rulesdebian rules(中文)
  9. debhelper

--

--