16 May 2022

(Linux) equivsを使ってdebパッケージの簡易作成

システムファイルの簡易インストーラを作成したり、他のインストーラに「特定のパッケージがインストール済み」と検知させるダミーdebパッケージを作成したりする方法。

template controlファイルを作成する

パッケージのプロパティや、セットアップスクリプトを指定するtemplate controlファイルは、次のコマンドでテンプレートが自動作成される

$ equivs-control [新規作成するcontrolファイル名]

次のようなファイルが作成される

dummy.ctl
### Commented entries have reasonable defaults.
### Uncomment to edit them.
# Source: <source package name; defaults to package name>
Section: misc
Priority: optional
# Homepage: <enter URL here; no default>
Standards-Version: 3.9.2

Package: <package name; defaults to equivs-dummy>
# Version: <enter version here; defaults to 1.0>
# Maintainer: Your Name <yourname@example.com>
# Pre-Depends: <comma-separated list of packages>
# Depends: <comma-separated list of packages>
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Multi-Arch: <one of: foreign|same|allowed>
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
# Links: <pair of space-separated paths; First is path symlink points at, second is filename of link>
# Files: <pair of space-separated paths; First is file to include, second is destination>
#  <more pairs, if there's more than one file to include. Notice the starting space>
Description: <short description; defaults to some wise words> 
 long description and info
 .
 second paragraph

作成されたパッケージ内のファイルを確認する

$ dpkg-deb --contents dummy-grub2-common_2.06-2ubuntu7_amd64.deb 
drwxr-xr-x root/root         0 2022-05-22 17:55 ./
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/local/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/local/bin/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/local/bin/test/
-rwxr-xr-x root/root        38 2022-05-22 17:55 ./usr/local/bin/test/test04.sh
-rwxr-xr-x root/root        98 2022-05-22 17:55 ./usr/local/bin/test01.sh
-rw-r--r-- root/root       184 2022-05-22 17:55 ./usr/local/bin/test02.txt
-rw-r--r-- root/root       119 2022-05-22 17:55 ./usr/local/bin/test03.txt
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/share/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/share/doc/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/share/doc/dummy-grub2-common/
-rw-r--r-- root/root       756 2022-05-22 17:55 ./usr/share/doc/dummy-grub2-common/README.Debian
-rw-r--r-- root/root       162 2022-05-22 17:55 ./usr/share/doc/dummy-grub2-common/changelog.Debian.gz
-rw-r--r-- root/root       936 2022-05-22 17:55 ./usr/share/doc/dummy-grub2-common/copyright

実際にインストールして、ファイル外としたとおりに作成されたか確認する

$ sudo dpkg --install dummy-grub2-common_2.06-2ubuntu7_amd64.deb 
以前に未選択のパッケージ dummy-grub2-common:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 293043 個のファイルとディレクトリがインストールされています。)
dummy-grub2-common_2.06-2ubuntu7_amd64.deb を展開する準備をしています ...
dummy-grub2-common:amd64 (2.06-2ubuntu7) を展開しています...
dummy-grub2-common:amd64 (2.06-2ubuntu7) を設定しています ...

$ ll /usr/local/bin/test*
-rwxr-xr-x 1 root root   98 2022-05-22 17:55:00 /usr/local/bin/test01.sh*
-rw-r--r-- 1 root root  184 2022-05-22 17:55:00 /usr/local/bin/test02.txt
-rw-r--r-- 1 root root  119 2022-05-22 17:55:00 /usr/local/bin/test03.txt

/usr/local/bin/test:
合計 12
drwxr-xr-x 2 root root 4096 2022-05-22 17:55:55 ./
drwxr-xr-x 4 root root 4096 2022-05-22 17:55:55 ../
-rwxr-xr-x 1 root root   38 2022-05-22 17:55:00 test04.sh*

template controlファイルを編集する

最低限の部分を編集する。今回は、grub2-common パッケージの値をコピペしてみる

dummy.ctl
### Commented entries have reasonable defaults.
### Uncomment to edit them.
# Source: <source package name; defaults to package name>
Section: misc
Priority: optional
# Homepage: <enter URL here; no default>
Standards-Version: 3.9.2

Package: dummy-grub2-common
Version: 2.06-2ubuntu7
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
# Pre-Depends: <comma-separated list of packages>
# Depends: <comma-separated list of packages>
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
Architecture: amd64
Multi-Arch: same
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
# Links: <pair of space-separated paths; First is path symlink points at, second is filename of link>
# Files: <pair of space-separated paths; First is file to include, second is destination>
#  <more pairs, if there's more than one file to include. Notice the starting space>
Description: GRand Unified Bootloader (common files for version 2) 
 This package contains common files shared by the distinct flavours of GRUB.
 The files in this package are specific to GRUB 2, and would break GRUB

空のダミー パッケージの作成

$ equivs-build [controlファイル]

作成されたdebパッケージのプロパティ値を確認する

$ dpkg-deb --info dummy-grub2-common_2.06-2ubuntu7_amd64.deb 
 new Debian package, version 2.0.
 size 2260 bytes: control archive=652 bytes.
     425 バイト、   11 行      control              
     245 バイト、    3 行      md5sums              
 Package: dummy-grub2-common
 Version: 2.06-2ubuntu7
 Architecture: amd64
 Maintainer: Ubuntu Developers 
 Installed-Size: 9
 Section: misc
 Priority: optional
 Multi-Arch: same
 Description: GRand Unified Bootloader (common files for version 2)
  This package contains common files shared by the distinct flavours of GRUB.
  The files in this package are specific to GRUB 2, and would break GRUB

空のダミー パッケージに含まれるファイル一覧を表示する

$ dpkg-deb --contents dummy-grub2-common_2.06-2ubuntu7_amd64.deb 
drwxr-xr-x root/root         0 2022-05-16 22:29 ./
drwxr-xr-x root/root         0 2022-05-16 22:29 ./usr/
drwxr-xr-x root/root         0 2022-05-16 22:29 ./usr/share/
drwxr-xr-x root/root         0 2022-05-16 22:29 ./usr/share/doc/
drwxr-xr-x root/root         0 2022-05-16 22:29 ./usr/share/doc/dummy-grub2-common/
-rw-r--r-- root/root       756 2022-05-16 22:29 ./usr/share/doc/dummy-grub2-common/README.Debian
-rw-r--r-- root/root       161 2022-05-16 22:29 ./usr/share/doc/dummy-grub2-common/changelog.Debian.gz
-rw-r--r-- root/root       936 2022-05-16 22:29 ./usr/share/doc/dummy-grub2-common/copyright

ファイルを追加する

equivs-buildのmanページでは、次の2つのタイプのファイル作成が可能

File: フィールド
File:
Files to be copied into some directory of the created package, specified inline in the source control file. The field syntax is the name of the files to be created, followed by lines indented by 1 space denoting file content; leading space will be trimmed. An octal file mode may be specified after the filename; it defaults to 644, and will be normalised to 644 or 755.

Example:

File: /usr/local/bin/true 755
 #!/bin/sh
 exit 0

作成されるファイルの属性は、デフォルトで644となる。実行フラグを付けるには、明示的に755を指定する。これ以外の属性はサポートされていないようだ。

Files: フィールド
Files:
Files to be copied into some directory of the created package. Each line contains a source filename and a destination directory, space-separated. As with other multi-line headers, all lines but the first must be indented.

Example:

Files: foo-cron /etc/cron.d/
 foo-cron-helper /usr/local/bin/

ファイル属性は、「コピー元のファイル属性」がコピーされる。

それでは、実際にサンプルdebパッケージを作成してみることとする。

追加したいファイル(test03.txtとtext04.sh)を作業ディレクトリに置いて、controlファイルに次のように記述する

dummy.ctl
 〜 省略 〜
#  <more pairs, if there's more than one file to include. Notice the starting space>
Description: GRand Unified Bootloader (common files for version 2) 
 This package contains common files shared by the distinct flavours of GRUB.
 The files in this package are specific to GRUB 2, and would break GRUB
### ファイル直接作成設定(ファイル1個目)
File: /usr/local/bin/test01.sh 755
 #!/bin/sh
 # 属性は明示的に指定した755になるはずです
 echo "Hello World !"
 exit 0
### ファイル直接作成設定(ファイル2個目)
File: /usr/local/bin/test02.txt
 これはテキストファイルです(属性をデフォルトの644です)
 次の行は空白行です(先頭にスペース1個入れること)
 
 equivsで作成しました
### 次行からファイルコピー設定
Files: test03.txt /usr/local/bin/
 test04.sh /usr/local/bin/test/

作成したdebパッケージに、意図した通りファイルが格納されているか確認する

$ equivs-build dummy.ctl 

$ dpkg-deb --contents dummy-grub2-common_2.06-2ubuntu7_amd64.deb 
drwxr-xr-x root/root         0 2022-05-22 17:55 ./
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/local/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/local/bin/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/local/bin/test/
-rwxr-xr-x root/root        38 2022-05-22 17:55 ./usr/local/bin/test/test04.sh
-rwxr-xr-x root/root        98 2022-05-22 17:55 ./usr/local/bin/test01.sh
-rw-r--r-- root/root       184 2022-05-22 17:55 ./usr/local/bin/test02.txt
-rw-r--r-- root/root       119 2022-05-22 17:55 ./usr/local/bin/test03.txt
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/share/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/share/doc/
drwxr-xr-x root/root         0 2022-05-22 17:55 ./usr/share/doc/dummy-grub2-common/
-rw-r--r-- root/root       756 2022-05-22 17:55 ./usr/share/doc/dummy-grub2-common/README.Debian
-rw-r--r-- root/root       162 2022-05-22 17:55 ./usr/share/doc/dummy-grub2-common/changelog.Debian.gz
-rw-r--r-- root/root       936 2022-05-22 17:55 ./usr/share/doc/dummy-grub2-common/copyright

実際にdebパッケージをインストールし、/usr/local/bin 以下に意図したとおりファイルが作成されたか確認する

$ sudo dpkg --install dummy-grub2-common_2.06-2ubuntu7_amd64.deb 
以前に未選択のパッケージ dummy-grub2-common:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 293043 個のファイルとディレクトリがインストールされています。)
dummy-grub2-common_2.06-2ubuntu7_amd64.deb を展開する準備をしています ...
dummy-grub2-common:amd64 (2.06-2ubuntu7) を展開しています...
dummy-grub2-common:amd64 (2.06-2ubuntu7) を設定しています ...

$ ll /usr/local/bin/test*
-rwxr-xr-x 1 root root   98 2022-05-22 17:55:00 /usr/local/bin/test01.sh*
-rw-r--r-- 1 root root  184 2022-05-22 17:55:00 /usr/local/bin/test02.txt
-rw-r--r-- 1 root root  119 2022-05-22 17:55:00 /usr/local/bin/test03.txt

/usr/local/bin/test:
合計 12
drwxr-xr-x 2 root root 4096 2022-05-22 17:55:55 ./
drwxr-xr-x 4 root root 4096 2022-05-22 17:55:55 ../
-rwxr-xr-x 1 root root   38 2022-05-22 17:55:00 test04.sh*

シンボリック リンクを作成する

manページの解説は次のようなもので

引用記事
Links:
Links to be created in some directory of the created package. Each line contains two paths. The first is the path that the generated symlink points at; the second is the name of the symlink file (The same order as 'ln -s'). As with other multi-line headers, all lines but the first must be indented.

Example:

Links: /usr/aarch64-linux-gnu/lib/libfoo.so /usr/lib/aarch64-linux-gnu/libfoo.so
 /file/to/symlink/to /symlink/file/name

実際にcontrolファイルに記述してみる

dummy.ctl
 〜 省略 〜
#  <more pairs, if there's more than one file to include. Notice the starting space>
Description: GRand Unified Bootloader (common files for version 2) 
 This package contains common files shared by the distinct flavours of GRUB.
 The files in this package are specific to GRUB 2, and would break GRUB
### シンボリック リンクの作成
Links: /bin/nano /usr/local/bin/test05.nano
 /usr/bin/ssh /usr/local/bin/test06.ssh 

作成したdebパッケージに、意図した通りファイルが格納されているか確認する

$ equivs-build dummy.ctl 

$ dpkg-deb --contents dummy-grub2-common_2.06-2ubuntu7_amd64.deb 

$ dpkg-deb --contents dummy-grub2-common_2.06-2ubuntu7_amd64.deb 
drwxr-xr-x root/root         0 2022-05-22 19:15 ./
drwxr-xr-x root/root         0 2022-05-22 19:15 ./usr/
drwxr-xr-x root/root         0 2022-05-22 19:15 ./usr/local/
drwxr-xr-x root/root         0 2022-05-22 19:15 ./usr/local/bin/
drwxr-xr-x root/root         0 2022-05-22 19:15 ./usr/share/
drwxr-xr-x root/root         0 2022-05-22 19:15 ./usr/share/doc/
drwxr-xr-x root/root         0 2022-05-22 19:15 ./usr/share/doc/dummy-grub2-common/
-rw-r--r-- root/root       756 2022-05-22 19:15 ./usr/share/doc/dummy-grub2-common/README.Debian
-rw-r--r-- root/root       162 2022-05-22 19:15 ./usr/share/doc/dummy-grub2-common/changelog.Debian.gz
-rw-r--r-- root/root       936 2022-05-22 19:15 ./usr/share/doc/dummy-grub2-common/copyright
lrwxrwxrwx root/root         0 2022-05-22 19:15 ./usr/local/bin/test05.nano -> /bin/nano
lrwxrwxrwx root/root         0 2022-05-22 19:15 ./usr/local/bin/test06.ssh -> /usr/bin/ssh

実際にdebパッケージをインストールし、/usr/local/bin 以下に意図したとおりファイルが作成されたか確認する

$ sudo dpkg --install dummy-grub2-common_2.06-2ubuntu7_amd64.deb 
以前に未選択のパッケージ dummy-grub2-common:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 293043 個のファイルとディレクトリがインストールされています。)
dummy-grub2-common_2.06-2ubuntu7_amd64.deb を展開する準備をしています ...
dummy-grub2-common:amd64 (2.06-2ubuntu7) を展開しています...
dummy-grub2-common:amd64 (2.06-2ubuntu7) を設定しています ...

$ ll /usr/local/bin/test*
lrwxrwxrwx 1 root root  9 2022-05-22 19:15:00 /usr/local/bin/test05.nano -> /bin/nano*
lrwxrwxrwx 1 root root 12 2022-05-22 19:15:00 /usr/local/bin/test06.ssh -> /usr/bin/ssh*