独自Debパッケージやaptリポジトリを使ったサーバー管理術

 DebianやUbuntuでは、Debパッケージという形式でソフトウェアが配布されているが、これらを自分で作成して利用することも可能だ。本記事では独自のDebパッケージを作成する方法や、apt-getコマンドで独自に作成したパッケージをインストールできる独自リポジトリの作成方法を紹介する。

独自のDebパッケージを作るメリットとは

 DebianやUbuntuなどDebianから派生したディストリビューションでは、dpkgなどのツールを使ったパッケージ管理が行われている。これにより、Debパッケージ(拡張子は.deb)という形式で配布されているソフトウェアやファイルをインストールしたり、インストールしたソフトウェアのアップデートやアンインストールなどの管理を行える。

 一般的に使われているソフトウェアの多くは、各ディストリビューションによってそのDebパッケージが作成され配布されている。しかし、ユーザーが独自にDebパッケージを作成することも可能だ。DebianやUbuntuでは非常に多くのパッケージが提供されているため、独自のDebパッケージを作成する機会は多くない。しかし、提供されているパッケージのものよりも新しいバージョンのソフトウェアが必要な場合や、ソフトウェアを独自にカスタマイズしたい場合などもあるだろう。このような場合、ソフトウェアをソースコードからビルドしたのち、パッケージの形にしてインストールすることが推奨されている。パッケージを作成することでインストール/アンインストールやバージョン管理、依存性管理が容易になるほか、ほかのマシンへのインストールも簡単にできるようになるというメリットがあるからだ。

 Debパッケージの作成手順は複雑で、一からパッケージを作成するとなるとそれなりの知識や手間が必要だ。そのため、本記事ではDebパッケージ作成の第一歩として、既存のパッケージを修正して独自パッケージを作る方法と、設定ファイルやスクリプトなどをパッケージとして配布する方法について説明する。

既存のパッケージを修正して独自パッケージを作成する

 Debian系のディストリビューションでは、各パッケージについてバイナリパッケージだけでなく、そのパッケージをビルドするための「素材」である「ソースパッケージ」も同時に配布されるのが一般的だ。既存のパッケージをカスタマイズするには、このソースパッケージを利用するのが簡単だ。ソースパッケージは通常、表1の3つのファイルから構成される。

表1 ソースパッケージを構成するファイル
ファイルの説明 拡張子
アップストリームのソースアーカイブ .orig.tar.gz
パッケージに関する設定情報ファイル .dsc
オリジナルソースコードに適用するためのパッチ .diff.gz

 なお、パッケージ化するソフトウェアについて、そのオリジナルの開発者らが配布しているものを「アップストリーム(上流)」と呼ぶ。つまり、「アップストリームのソースアーカイブ」というのは、オリジナルの開発者らが配布しているソースアーカイブのことを指す。

ソースパッケージの入手

 ソースパッケージを入手するには、「apt-get source <パッケージ名>」コマンドを実行すれば良い。たとえば、Apache HTTP Serverをインストールするためのapache2パッケージのソースパッケージを入手するには、以下のようにする。

$ apt-get source apache2

 すると、リポジトリからソースパッケージがダウンロードされるとともに、コマンドを実行したディレクトリにパッケージ作成作業に使われる作業ディレクトリが作成され、そこにソースコードなどが展開される。以後、このディレクトリをソースディレクトリと呼ぶ。

 なお、apt-getコマンドを利用せずに、ミラーサイトなどから手動でソースパッケージを入手しても構わない。この場合、.orig.tar.gzファイルと.dscファイル、.diff.gzファイルを同じディレクトリに格納した上で以下のようにdpkg-sourceコマンドを実行することで、ソースディレクトリへのソースコードの展開やパッチの適用などが行える。

$ dpkg-source -x <パッケージの.dscファイル>

パッケージのビルド

 apt-get sourceコマンドによって作成されたディレクトリ内には、debパッケージの作成に必要なすべての要素が含まれており、このディレクトリ内で「debuild」コマンドを実行することでバイナリパッケージを作成できる。なお、debuildコマンドは「devscripts」パッケージに含まれているので、実行の際はこのパッケージをインストールしておく必要がある。

# apt-get install devscripts

 また、パッケージによっては、ビルドの際に特定のパッケージやファイルなどを必要とする場合がある。このような依存パッケージは、「apt-get build-dep <ビルドするパッケージ名>」コマンドでインストールできる。たとえばapache2パッケージのビルド時に必要なパッケージをインストールするには、以下のようにする。

# apt-get build-dep apache2

 パッケージを作成するための準備が整ったら、ソースディレクトリ内で以下のようにdebuildコマンドを実行すると、バイナリパッケージの作成が実行される。

$ debuild -uc -us -b

 ここで、「-uc」および「-us」オプションはパッケージへの署名を省略するオプション、「-b」オプションはバイナリパッケージのみの生成を指定するオプションだ。このコマンドを実行すると、configureやmakeなどビルドに必要な処理が実行され、生成されたバイナリがソースディレクトリの親ディレクトリ内に作成される。

 なお、ビルド後にはdebianディレクトリ内に作業ファイルや中間ファイルが残されるが、これを削除するには以下のコマンドをソースディレクトリ内で実行すれば良い。

$ fakeroot debian/rules clean

ビルド設定や設定ファイルなどをカスタマイズする

 ソースディレクトリ内にあるdebianディレクトリには、ビルドの際のconfigure設定や独自に追加するファイル、パッチファイルなどが格納されている。パッケージをカスタマイズしたい場合は、ここにある設定ファイルを編集したり、ファイルを追加することで対応できる。

 ビルドの設定については、debianディレクトリ内にある「rules」ファイルに記述されている。このファイルはmake(GNU make)で使われるMakefileと同じ書式の設定ファイルとなっており、configureの際のオプションやビルドルールなどが記述されている。

 rulesファイルにはいくつかのターゲットが記載されており、debuildコマンドやdebuildコマンドが内部的に利用するdpkg-buildpackageコマンドなどは指定されたオプションに応じてこれらのターゲットを適宜実行する(表2)。

表2 rulesファイルに記載されているターゲット
ターゲット名 説明 必須かどうか
clean ビルド時に生成されるファイルを全削除する 必須
build ソースコードやドキュメントをビルドする 必須
build-arch アーキテクチャに依存するプログラムをビルドする 必須
build-indep アーキテクチャに依存しないプログラムやドキュメントなどをビルドする 必須
install ビルドしたバイナリやドキュメントを作業用ディレクトリにインストールする 任意
binary バイナリパッケージを作成する 必須
binary-arch アーキテクチャに依存するバイナリパッケージを作成する 必須
binary-indep アーキテクチャに依存しないバイナリパッケージを作成する 必須
get-orig-source 最新のオリジナルソースアーカイブをダウンロードする 任意
patch 追加で必要となるアーカイブをダウンロードしたり、パッチを実行する 任意

 たとえばパッケージのconfigure設定を変更するには、rulesファイル内でconfigure設定を定義している個所を修正すればよい。また、独自のパッチを適用したい場合などは、rulesファイル内のbuildルールなどを参照し、ビルドを実行する前にソースコードにパッチを適用するよう設定を追加すれば良い。

 なお、rulesファイル内では「dh_clear」や「dh_testdir」といった「dh_」で始まるコマンドが使われていることがある。これらはパッケージ作成を支援する「debhelper」パッケージに含まれるコマンドだ。また、rulesファイルの記述を簡略化するために「CDBS(Common Debian Build System)」といったツールが利用されている場合もある。rulesファイル内に「include /usr/share/cdbs/1/class/makefile.mk」や「include /usr/share/cdbs/1/rules/debhelper.mk」といった記述がある場合、cdbsが使われていることになる。そのほか、「dpatch」や「quilt」というパッチ管理システムツールが使われていることもある。これらのパッチ管理システムが使われている場合は、debian/patchesディレクトリにパッチが格納されている。これら支援ツールについてはここでは解説しないので、適宜ドキュメントなどを参照してほしい。

パッケージの情報を変更する

 rulesファイルなどを変更してパッケージの内容を変更したら、それに併せてパッケージの情報も変更しておく必要がある。パッケージに関する情報が記述されているのは、debianディレクトリ内にある表3の3つの設定ファイルだ。

表3 Debパッケージの作成に最低限必要なファイル
ファイル名 記述される内容
control パッケージの説明や各種情報
changelog パッケージの変更履歴
copyright パッケージの著作権関連情報

 まずcontrolファイルには、パッケージの説明や各種情報が含まれている。ここでは、以下のような形式で情報が記述されている。

<項目名>: <値>

 controlファイルは空行で区切られた複数のブロックで構成されており、1つ目のブロックにはパッケージやその作成者に関する情報を記述する。このブロックには、表4の項目を記述するようになっており、その一部は必須となっている。

表4 controlファイルのソースパッケージ項目に記述する必須・推奨項目
項目名 説明 必須/推奨
Source ソースパッケージの名称 必須
Maintainer メンテナの名前とメールアドレス(「名前<メールアドレス>」の形式で表記) 必須
Section パッケージの分類 推奨
Priority パッケージの重要度 推奨
Standards-Version 対応するDebian Policyのバージョン 推奨
Build-Depends ビルドに必要なパッケージ 任意

 なお、「Standards-Version」で指定するDebian Policyのバージョン番号はDebian Policy Manualの末尾に記載されている。本記事執筆時のバージョンは3.9.4.0だ。

 また、2つめ以降のブロックには作成するバイナリパッケージに関する情報を記述する。1つのソースパッケージからは複数のバイナリパッケージがビルド可能であるため、このブロックは複数置くことが可能だ。ここで記述できる主な項目は表5のものがある。

表5 controlファイルのバイナリパッケージ項目に記述する必須・推奨項目
項目名 説明 必須/推奨
Package バイナリパッケージの名称 必須
Architecture 対応するアーキテクチャ 必須
Section パッケージの分類 推奨
Priority パッケージの重要度 推奨
Depends パッケージのインストール時に必須のパッケージ 任意
Description バイナリパッケージに関する説明 必須

 最後の「Description」だけはほかの項目と異なり、次のような書式で情報を記述する。複数行での説明部分の行頭は必ず半角スペース1個で始まるようになっている。

Description: <1行で収まる簡単な説明>
 <複数行での詳しい説明>
 
 

 「Architecture」では、特定のアーキテクチャのみに対応する場合はそのアーキテクチャ名を、任意のアーキテクチャに対応するのであれば「any」を、アーキテクチャ非依存であれば「all」が指定される。また、Priorityには「required」「important」「standard」「optional」「extra」のどれかになっているはずだ。「Section」で指定できるセクションについてはDebianのWebサイトなどを参照してほしい。

 そのほか、必要に応じてパッケージのアップロード者を示す「Uploaders」やWebサイトを示す「Homepage」、ソースコードのリポジトリなどを示す「Vcs-Broser」や「Vcs-svn」、競合するパッケージを示す「Conflicts」や「Build-Conflicts」、置き換えるパッケージを示す「Replaces」、同時にインストールすることを推奨するパッケージを示す「Recommends」や「Suggests」といった項目が記述される場合もある。これらについてはDebianのドキュメントなどを参照してほしい。

 たとえば以下の例は、apache2パッケージに含まれるcontrolファイルの一部だ。

Source: apache2
Section: httpd
Priority: optional
Maintainer: Debian Apache Maintainers <debian-apache@lists.debian.org>
Uploaders: Tollef Fog Heen <tfheen@debian.org>, Thom May <thom@debian.org>, Peter Samuelson <peter@p12n.org>, Stefan Fritsch <sf@debian.org>, Steinar H. Gunderson <sesse@debian.org>
Build-Depends: debhelper (>= 7.4.3), dpatch, lsb-release, libaprutil1-dev (>= 1.3.4), libapr1-dev (>= 1.2.7-6), openssl, libpcre3-dev, mawk, zlib1g-dev, libssl-dev (>= 0.9.8m), sharutils, libcap-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], autoconf
Build-Conflicts: autoconf2.13
Standards-Version: 3.9.1
Vcs-Browser: http://svn.debian.org/wsvn/pkg-apache/trunk/apache2
Vcs-svn: svn://svn.debian.org/pkg-apache/trunk/apache2
Homepage: http://httpd.apache.org/

Package: apache2.2-common
Architecture: any
Depends: ${misc:Depends}, apache2.2-bin (= ${binary:Version}), apache2-utils, libmagic1, mime-support, lsb-base, procps [!hurd-i386], perl
Recommends: ssl-cert
Suggests: www-browser, apache2-doc, apache2-suexec | apache2-suexec-custom
Conflicts: apache2-common, apache
Replaces: apache2-common
Description: Apache HTTP Server common files
 The Apache Software Foundation's goal is to build a secure, efficient and
 extensible HTTP server as standards-compliant open source software. The
 result has long been the number one web server on the Internet.
 .
 This package contains the configuration and support scripts.
 However, it does *not* include the server itself; for this you need to
 install one of the apache2-mpm-* packages, such as worker or prefork.
 
 

パッケージの変更履歴を記述する

 続いてchangelogファイルだが、こちらはその名の通り、パッケージの変更履歴を格納するものだ。このファイルは、以下のような書式のブロックが1つ以上続く構成となっている。

<パッケージ名> (<バージョン番号>) <ディストリビューション> <緊急度>

 * 変更点1
 * 変更点2
 
 

-- <著者> <<メールアドレス>> <タイムスタンプ>

 パッケージに変更を加えた場合は、ここに必ず変更点を記述しておくようにする。たとえば、先に紹介したapache2の場合、changelogファイルは以下のようになっている。

apache2 (2.2.16-6+squeeze11) squeeze-security; urgency=high

  * CVE-2013-1048: Fix symlink vulnerability when creating /var/lock/apache2
  * CVE-2012-3499, CVE-2012-4558: Fix XSS flaws in various modules.

 -- Stefan Fritsch <sf@debian.org>  Sun, 03 Mar 2013 12:25:22 +0100

apache2 (2.2.16-6+squeeze10) squeeze-security; urgency=low

  [ Arno T<C3><B6>ll ]
  * Backport disable-ssl-compression.patch from Wheezy. This patch disabled
    SSL compression upon request by introducing a "Compression on|off"
    directive to mod_ssl. This is to mitigate impact of CRIME attacks to SSL -
    which is a browser issue, however.
    See also Debian bug #674142 and #689936.

  [ Stefan Fritsch ]
  * CVE-2012-4557: mod_proxy_ajp: Remote denial of service (temporary, until
    mod_proxy_ajp's retry timeout expired).

 -- Stefan Fritsch <sf@debian.org>  Fri, 30 Nov 2012 09:26:36 +0100
 
 

著作権やライセンスを記載するcopyrightファイル

 copyrightファイルには、パッケージの著作権やライセンスに関する情報が記載されている。このファイルについては、特に決まったフォーマットは定められていないものの、下記の情報を必ず含めることとされている。

  • 著作者名
  • 著作権の発生年
  • 使用しているライセンスの情報
  • アップストリームのソースコードの入手先URL

 もしパッケージに独自ライセンスのファイルやパッチなどを追加した場合は、ここにその旨を記述しておく必要がある。

 なお、パッケージをインストールすると/usr/share/doc/<パッケージ名>ディレクトリ以下にインストールされる。copyrightファイルの例としては、Debianの開発者向けメーリングリストに投稿されたHow (not) to write copyright files - take twoというメールが参考になるだろう。また、Machine-readable debian/copyright fileというのも提案されているようだが、まだあまり採用は進んでいないようだ。

独自のパッケージを一から作成する

 以上は既存のパッケージを修正・改造する場合の例であったが、続いては独自のパッケージを一から作る場合の手順についても簡単に解説しておこう。

 パッケージの作成には、先に説明した下記の4つのファイルが必要だ。

  • rules
  • control
  • changelog
  • copyright

 このうち、controlやchangelog、copyrightといったファイルについては、先に解説したとおりのフォーマットで作成するパッケージに合わせたものを作成すればよい。しかし、rulesファイルについては、パッケージ化するソフトウェアやファイルのビルド方法によってその内容が大きく異なる。そこで、以下ではビルドは不要でファイルを特定のディレクトリにインストールするだけのシンプルなパッケージと、configureを使ってビルドを行うソフトウェアの2つについて、rulesファイルの例を挙げて説明しよう。

 なお、以下ではrulesファイルの作成を簡素化するため、rulesファイル作成支援ツールであるCDBS(Common Debian Build System)を利用している。この場合、controlファイルのBuild-Depends項目に「cdbs」および「debhelper」を追加しておく必要がある(CDBSはバイナリパッケージのビルド支援ツールであるdebhelperを利用するため)。

ファイルを特定のディレクトリにインストールするだけのパッケージを作る

 それでは、まずは/etc/apache2/sites-enabledディレクトリ以下に「example.conf」という設定ファイルをインストールするだけのパッケージの作成について説明しよう。パッケージ名は「example-siteconfig」とし、またバージョンは0.1とする。今回は「example-siteconfig」というディレクトリを作成し、そこにインストールする設定ファイルやパッケージ作成用の各種ファイルを配置する。具体的には、以下のようなファイルを用意することとなる。

$ find example-siteconfig
example-siteconfig
example-siteconfig/example.conf
example-siteconfig/debian
example-siteconfig/debian/rules
example-siteconfig/debian/control
example-siteconfig/debian/changelog
example-siteconfig/debian/copyright

 さて、このパッケージの情報を記述したcontrolファイルは以下のようになる。

Source: example-siteconfig
Maintainer: Hiromichi Matsushima <hylom@example.com>
Build-Depends: cdbs, debhelper
Standards-Version: 3.9.4

Package: example-siteconfig
Architecture: all
Description: config files for apache2 to use example web site
 Config files for apache2 to use example Web sites.
 This package installs config files to /etc/apache2/sites-enabled
 directory.

 このパッケージはアーキテクチャに依存しない設定ファイルのみが含まれるので、「Architecture」には「all」を指定している。

 また、rulesファイルは以下のようになる。

#!/usr/bin/make -f
#

include /usr/share/cdbs/1/rules/debhelper.mk  ←CDBSの設定ファイルをインクルードする

install/example-siteconfig::
        install -pd $(DEB_DESTDIR)/etc/apache2/sites-enabled
        install -pm 644 example.conf $(DEB_DESTDIR)/etc/apache2/sites-enabled/

 CDBSを利用する場合、「install/<パッケージ名>::」がそのパッケージをインストールする際に実行されるターゲットとなる。また、インストール先としては「$(DEB_DESTDIR)」に続けてファイルの実際のインストール先を指定する。この例の場合、まず「install -pd」コマンドでインストール先ディレクトリである「/etc/apache2/sites-enabled」を作成し、続いて「install -pm」コマンドでこのディレクトリに「644」というパーミッションでexample.confというファイルをインストールするよう指定している。

 また、changelogファイルは以下のとおりだ。

example-siteconfig (0.1-1) unstable; urgency=low

  * Initial Release

 -- Hiromichi Matsushima <hylom@example.com>  Sat, 06 Jul 2013 20:58:11 +0900

 このファイル中に記載されているバージョン番号がパッケージのバージョン番号として使われるため、バージョン番号の指定には注意しよう。今回は「バージョン0.1」の「1回目のリリース」という意味で「0.1-1」という番号を指定している。

 そのほか、ライセンスなどを記述したcopyrightファイルと、インストールする設定ファイルであるexample.confを適宜用意する。

 以上のファイルがそろったら、example-siteconfigディレクトリでdebuildコマンドを実行すると、パッケージが作成される。

$ debuild -us -uc
This package has a Debian revision number but there does not seem to be
an appropriate original tar file or .orig directory in the parent directory;
(expected one of example-siteconfig_0.1.orig.tar.gz, example-siteconfig_0.1.orig.tar.bz2,
example-siteconfig_0.1.orig.tar.lzma,  example-siteconfig_0.1.orig.tar.xz or example-siteconfig.orig)
continue anyway? (y/n) y  ←「y」を入力してEnterを押す
 dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: source package example-siteconfig
dpkg-buildpackage: source version 0.1-1
 
 

 なお、アップストリームのソースアーカイブがないため確認メッセージが表示されるが、こちらは無視して「y」を入力して進めて構わない。

configureやbuildが必要なパッケージを作る

 続いて、ソースコードからのビルドが必要なパッケージを作るためのrulesファイルについても説明しておこう。UNIX/Linux向けの一般的なソフトウェアでは、まずconfigureコマンドを使って設定を行い、続いてmakeコマンドでビルドを実行し、最後にmake installコマンドでファイルをインストールする、といった作業でインストールを行うのが一般的だ。このようなプログラムをDebパッケージ化する場合、以下のようなrulesファイルを用意すれば良い。

#!/usr/bin/make -f
#

include /usr/share/cdbs/1/rules/debhelper.mk

clean::
        -$(MAKE) distclean

configure/<パッケージ名>::
        ./configure --prefix=/usr

build/<パッケージ名>::
        $(MAKE)

install/<パッケージ名>::
        $(MAKE) install DESTDIR=$(CURDIR)/debian/<パッケージ名>

 ここで、実際のrulesファイル内では「<パッケージ名>」の部分は作成するパッケージ名に置き換えて使用する。CDBSを利用する場合、「configure/<パッケージ名>::」というターゲットでconfigureなどのビルド前に実行すべき作業を、「build/<パッケージ名>::」というターゲットでmakeなどのビルド作業を、「install/<パッケージ名>::」というターゲットでインストール作業を指定する。なお、インストール先には「$(CURDIR)/debian/<パッケージ名>」を指定する。

 ソースディレクトリ(configureファイルが格納されているディレクトリ)以下にdebianディレクトリを作成し、このrulesファイルとcontrolファイルやchangelogファイル、copyrightファイルを格納したうえでソースディレクトリでdebuildコマンドを実行すれば、パッケージが作成される。

aptの独自リポジトリを作成する

 最後に、先のような手順で作成した独自のDebパッケージを公開するための独自リポジトリの作成方法について説明しよう。

 apt-get向けの独自リポジトリを作成するには、apt-ftparchiveコマンドを利用する。たとえば、「/var/www/debian」ディレクトリに公開したいパッケージが格納されている場合、このディレクトリで以下のようにapt-ftparchiveコマンドを実行すれば良い。

$ apt-ftparchive packages . | gzip > Packages.gz

 ここで作成された「Packages.gz」ファイルが、パッケージ情報を格納したファイルとなる。なお、パッケージについてはサブディレクトリに格納されていても問題ない。

独自リポジトリを利用する

 作成した独自リポジトリからapt-getコマンドなどを使ってパッケージをインストールできるようにするには、/etc/apt/sources.list.dディレクトリ以下に設定ファイルを作成し、そこに追加するリポジトリ情報を記述する必要がある。たとえば、作成したaptリポジトリが「http://example.com/debian/」というディレクトリとして公開されている場合、/etc/apt/sources.list.dディレクトリ内に「example.com.list」といったようなファイルを作成し、以下のような内容を記述すれば良い。

deb http://example.com/debian ./

Debパッケージ作成のハードルは高いが、慣れてしまえば運用の手間を簡略化可能

 このようにDebパッケージの作成にはやや面倒な手順が必要だが、その代わり実行できる処理の自由度は非常に高い。ソフトウェア本体だけでなく、設定ファイルなどの配布も可能なので、うまく利用することでサーバーのデプロイや運用の際の作業負荷を大きく軽減できるだろう。うまく活用してほしい。

 なお、Debianは歴史の古いLinuxディストリビューションの1つであり、そのパッケージシステムであるdpkgも長い歴史を持つ。そのため、さまざまな支援ツールが作られており、使用するツールによってパッケージの作成手順などもやや異なる場合がある。今回はその中でも、現時点で広く使われていると思われるものを紹介したが、パッケージによってはこれ以外の手段で作成されている場合もあるので、既存パッケージを改造する場合などはrulesファイルなどを各自確認してほしい。