Raspberry Pi Debian独自パッケージの作成方法(インストールパッケージ)

Raspberry Pi

はじめに

Debianパッケージをソースパッケージから作成する方法について記載したページは散見されますが、ここでは、ソースをビルドする必要のない設定ファイルやスクリプト等のインストールのみを行うDebianバイナリパッケージの作成方法について記載します。
シェルをインストールするDebianバイナリパッケージの作成方法を例に記載します。また、作成するパッケージは、公開せずローカル環境で使用するものとします。
作成したパッケージを公開する場合は、Debianポリシーマニュアルに記載されている仕様に準拠する必要がありますので、そちらをご一読ください。

環境

  1. ボード
    Raspberry Pi 4 Model B
  2. OS
    Raspberry Pi OS (32-bit) Lite
    Minimal image based on Debian Buster
    Version: August 2020
    Release date: 2020-08-20
    Kernel version: 5.4

事前準備

パッケージをビルドする際に必要となるパッケージをインストールします。

pi@raspberrypi:~ $ sudo apt-get install dh-make devscripts
pi@raspberrypi:~ $

パッケージの作成方法

作成するパッケージ名を「samplepackage」、アップストリームバージョンを「0.1」とします。また、インストールするシェルは、「test.sh」とします。

ソースディレクトリの作成

ソースディレクトリは、パッケージを作成する際の起点となる作業ディレクトリです。
ソースディレクトリを作成し、そのディレクトリに移動します。
dh_makeは、現在のディレクトリ名をdebian/controlファイルの特定のフィールドで使用します。このため、-フォーマットでディレクトリを作成する必要があります。
dh_makeを実行する際に、-pオプション(–packagename)を指定することにより、
ディレクトリ名とは異なる名前に変更することができます。

pi@raspberrypi:~ $ mkdir samplepackage-0.1
pi@raspberrypi:~ $ cd samplepackage-0.1/
pi@raspberrypi:~/samplepackage-0.1 $

パッケージに含めるシェルのコピー

パッケージでインストールするシェルをソースディレクトリにコピーします。

pi@raspberrypi:~/samplepackage-0.1 $ cp ~/test.sh .
pi@raspberrypi:~/samplepackage-0.1 $

ディレクトリツリーは、以下のようになります。

pi@raspberrypi:~ $ tree
.
`-- samplepackage-0.1
    `-- test.sh
pi@raspberrypi:~ $

DEBEMAIL、DEBFULLNAME環境変数の作成

この環境変数は、debian/control及びdebian/changelogファイルで使用されます。

pi@raspberrypi:~ $ cat >>~/.bashrc < DEBEMAIL="hoge@example.tld"
> DEBFULLNAME="Hoge Tester"
> export DEBEMAIL DEBFULLNAME
> EOF
pi@raspberrypi:~ $ . ~/.bashrc
pi@raspberrypi:~ $

オリジナルソースパッケージと制御ファイルの作成

samplepackage-0.1ディレクトリで、dh_makeコマンドを以下のオプションを記載して実行します。
–indepオプションは、CPUのアーキテクチャに依存しないパッケージを作成します。
–createorigオプションは、パッケージをビルドするために必要なオリジナルソースのアーカイブを作成します。
ソースアーカイブは、親ディレクトリに作成されます。(../sampmlepackage_0.1.orig.tar.gz)

pi@raspberrypi:~/samplepackage-0.1 $ dh_make --indep --createorig
Maintainer Name     : Person Tester
Email-Address       : person@company.tld
Date                : Wed, 27 May 2020 11:08:45 +0900
Package Name        : samplepackage
Version             : 0.1
License             : blank
Package Type        : indep
Are the details correct? [Y/n/q]
Currently there is not top level Makefile. This may require additional tuning
Done. Please edit the files in the debian/ subdirectory now.

pi@raspberrypi:~/samplepackage-0.1 $

dh_makeコマンドを実行した後のディレクトリツリーは、以下のようになります。

pi@raspberrypi:~/samplepackage-0.1 $ tree ../
.
|-- samplepackage-0.1
|   |-- debian
|   |   |-- README.Debian
|   |   |-- README.source
|   |   |-- changelog
|   |   |-- compat
|   |   |-- control
|   |   |-- copyright
|   |   |-- manpage.1.ex
|   |   |-- manpage.sgml.ex
|   |   |-- manpage.xml.ex
|   |   |-- menu.ex
|   |   |-- postinst.ex
|   |   |-- postrm.ex
|   |   |-- preinst.ex
|   |   |-- prerm.ex
|   |   |-- rules
|   |   |-- samplepackage-docs.docs
|   |   |-- samplepackage.cron.d.ex
|   |   |-- samplepackage.doc-base.EX
|   |   |-- source
|   |   |   `-- format
|   |   `-- watch.ex
|   `-- test.sh
`-- samplepackage_0.1.orig.tar.xz

pi@raspberrypi:~/samplepackage-0.1 $

不要な設定ファイルの削除

debianディレクトリにある使用しない設定ファイル(.exや.EXファイルやREADMEs)を削除します。

pi@raspberrypi:~/samplepackage-0.1/debian $ rm README.* *.ex *.EX
pi@raspberrypi:~/samplepackage-0.1/debian $

「debian/install」設定ファイルの作成

debian/install設定ファイルは、debuildコマンドにパッケージに含めたいファイルを伝えるために使用します。
debian/install設定ファイルは、dh_makeコマンドでは作成されません。このため、別途作成する必要があります。
ここでは、test.shを/usr/binにインストールすることにします。

pi@raspberrypi:~/samplepackage-0.1 $ touch debian/install
pi@raspberrypi:~/samplepackage-0.1 $ vi debian/install
【debian/installファイルの記載内容】
test.sh usr/bin
pi@raspberrypi:~/samplepackage-0.1 $

各行は、「インストールするプログラムパス」<スペース>「実際にインストールするパス」というフォーマットで記載します。
「インストールするプログラムパス」は、ソースディレクトリ(samplepackage-0.1)を起点としたパスを記載します。
「実際にインストールするパス」は、ルートパスを起点として記載します。
また、複数のシェルをパッケージに含めたい場合は、ソースディレクトリにそのシェルを移動し、上記と同様にdh_makeコマンドを実行します。その後、/debian/install設定ファイルに追記します。

【debian/installファイルの記載例】

test.sh usr/bin
test2.sh usr/bin
test3.sh usr/bin

パッケージの作成

以上でパッケージを作成する準備が整いましたので、debuildツールを使用してインストールパッケージを作成します。
-us及び-ucオプションは、GPGによる署名を行わないことをdebuildツールに伝えるオプションです。
ローカル環境での使用のため、署名を省略しています。

pi@raspberrypi:~/samplepackage-0.1 $ debuild -us -uc
 dpkg-buildpackage -us -uc -ui
dpkg-buildpackage: info: source package samplepackage
dpkg-buildpackage: info: source version 0.1-1
dpkg-buildpackage: info: source distribution unstable
dpkg-buildpackage: info: source changed by Person Tester 
 dpkg-source --before-build .
dpkg-buildpackage: info: host architecture armhf
 fakeroot debian/rules clean
dh clean
   dh_clean
 dpkg-source -b .
dpkg-source: info: using source format '3.0 (quilt)'
dpkg-source: info: building samplepackage using existing ./samplepackage_0.1.orig.tar.xz
dpkg-source: info: building samplepackage in samplepackage_0.1-1.debian.tar.xz
dpkg-source: info: building samplepackage in samplepackage_0.1-1.dsc
 debian/rules build
dh build
   dh_update_autotools_config
   dh_autoreconf
   create-stamp debian/debhelper-build-stamp
 fakeroot debian/rules binary
dh binary
   dh_testroot
   dh_prep
   dh_install
   dh_installdocs
   dh_installchangelogs
   dh_perl
   dh_link
   dh_strip_nondeterminism
   dh_compress
   dh_fixperms
   dh_missing
   dh_installdeb
   dh_gencontrol
   dh_md5sums
   dh_builddeb
dpkg-deb: building package 'samplepackage' in '../samplepackage_0.1-1_all.deb'.
 dpkg-genbuildinfo
 dpkg-genchanges  >../samplepackage_0.1-1_armhf.changes
dpkg-genchanges: info: including full source code in upload
 dpkg-source --after-build .
dpkg-buildpackage: info: full upload (original source is included)
Now running lintian samplepackage_0.1-1_armhf.changes ...
W: samplepackage source: superfluous-clutter-in-homepage 
W: samplepackage source: bad-homepage 
E: samplepackage source: debian-rules-is-dh_make-template
W: samplepackage source: space-in-std-shortname-in-dep5-copyright  (paragraph at line 5)
W: samplepackage: wrong-bug-number-in-closes l3:#nnnn
W: samplepackage: new-package-should-close-itp-bug
E: samplepackage: changelog-is-dh_make-template
E: samplepackage: helper-templates-in-copyright
W: samplepackage: copyright-has-url-from-dh_make-boilerplate
E: samplepackage: copyright-contains-dh_make-todo-boilerplate
E: samplepackage: description-is-dh_make-template
E: samplepackage: section-is-dh_make-template
W: samplepackage: superfluous-clutter-in-homepage 
W: samplepackage: bad-homepage 
W: samplepackage: script-with-language-extension usr/bin/test.sh
W: samplepackage: binary-without-manpage usr/bin/test.sh
Finished running lintian.
pi@raspberrypi:~/samplepackage-0.1 $

ソースディレクトリに、「samplepackage_0.1-1_all.deb」Debianバイナリパッケージが作成されます。
ディレクトリツリーは、以下のようになります。

pi@raspberrypi:~ $ tree -L 1
.
|-- samplepackage-0.1
|-- samplepackage_0.1-1.debian.tar.xz
|-- samplepackage_0.1-1.dsc
|-- samplepackage_0.1-1_all.deb
|-- samplepackage_0.1-1_armhf.build
|-- samplepackage_0.1-1_armhf.buildinfo
|-- samplepackage_0.1-1_armhf.changes
`-- samplepackage_0.1.orig.tar.xz

1 directory, 7 files
pi@raspberrypi:~ $

作成パッケージの確認

作成されたバイナリパッケージのインストールを行います。

pi@raspberrypi:~ $ sudo dpkg -i samplepackage_0.1-1_all.deb
以前に未選択のパッケージ samplepackage を選択しています。
(データベースを読み込んでいます ... 現在 47723 個のファイルとディレクトリがイン ストールされています。)
samplepackage_0.1-1_all.deb を展開する準備をしています ...
samplepackage (0.1-1) を展開しています...
samplepackage (0.1-1) を設定しています ...
pi@raspberrypi:~ $

インストールディレクトリ及び実行権限の確認を行います。

pi@raspberrypi:~ $ ls -l /usr/bin/test.sh
-rwxr-xr-x 1 root root 25  5月 27 11:49 /usr/bin/test.sh
pi@raspberrypi:~ $

実行できるか確認します。

pi@raspberrypi:~ $ test.sh
Hello!!
pi@raspberrypi:~ $

参考

タイトルとURLをコピーしました