.

.

東京エリア Debian 勉強会
資料.
岩松 信洋 iwamatsu@debian.or.jp
IRC nick: iwamatsu

2009 年 2 月 21 日

.

.
..

設営準備にご協力くださいAgenda

注意事項
特になし

最近の Debian 関連のイベント
前回の勉強会

Debian パッケージングハンズオン

2009 年 01 月
注意事項
飲食禁止
政治/宗教/営利活
動禁止
ustream にて試験
ストリーミング中

最近の Debian 関連のイベント
Lenny release
Linux Consortium
10 Years Event !!
Debian ハックカ
フェ開始

Debian の 2009 年の予定を考える
冬休みの宿題発表

2009 年計画..1. 新年の企画 (あんさんぶる荻窪開催)..2. OSC Tokyo..3. Debian Lisp 環境ハック、研究室のソフトウェアを Debian パッケージにする。
..4. Git Handson (岩松)(あんさんぶる荻窪?)..5. 家 Debian サーバ vs 職場のネットワーク (千代田区都立図書館?1 )..6. Asterisk (東京大学?)..7. スペインにて開催..8. Debconf 報告会..9. OSC Fall?
..10. udev + HAL..11. 3D graphics 開発..12. Debian サーバ+VMware + 各種 OS、他の仮想化ツール (vserver etc.)、忘年会

1

http://www.library.chiyoda.tokyo.jp/

Lennyleasere-Lenny release

めでたく 2009 年 02 月 14 日 (UTC) に Debian GNU/Linux5.0(コードネーム Lenny) がリリースされました。開発に関わった方々、お疲れさまでした。

Debian パッケージン
グハンズオン

本日の目的Debian パッケージ化されていないソフトウェアをパッケージ化して、ビルドテストとパッケージの変更までを体験します。ところどころにトラップがあるので注意しましょう。

本日の流れ... 講師紹介... 作業を始める前の前準備... ソフトウェアのコンパイル... パッケージの雛形... CDBS... debian ディレクトリ以下ファイルの編集... パッケージのビルド... パッケージのインストール... パッケージのビルドテスト... パッケージのインストール/アンインストールテスト... プログラムの編集... 質疑応答
123456789101112

講師紹介

講師紹介

岩松 信洋
私。Debian Maintainer。Debian JP project 副会長、カーネル開発とかその他諸々。

Debian JP Project 有志
その辺のそれっぽい人たち。そっち系のプロの方です。

前回のハンズオン

去年の OSC 2008 TOKYO Spring で開催

39 名参加問題点.... 講師が一人だった... vi が使えない人がいた... 話についてこれない人がいた... ハンズオン会場のネットワークでトラブルがあった.. 時間が足りなかった
1
2
345

対策

... 講師が一人だった
TA を付けました。
... vi が使えない人がいた1

2...
...
...
3

4

5

vi 以外のエディタを追加しました。また、X 上で行うようにしました。
話についてこれない人がいたテキストを用意しました。
ハンズオン会場のネットワークでトラブルがあったネットワークを使わないようにしました。
時間が足りなかった
2 時間枠を取りました。

お願い

お願い

困った事があったら TA の人に聞いてください。
隣の人が困っていたら助けて上げてください。ご協力
お願いします。
トラップが分かってもつっこまないようにしてください。たぶんそれはハンズオンのネタなので、よろしくお願いします。

事前準備

記号の説明$ が付いている場合は、コンソールからの入力を意味します。$は入力せずにコマンドを入力してください。
コマンドラインやファイルの中身で \ が書かれている
場所は行が続いている事を意味します。入力しないでください。
... は省略を意味します。実際には長い出力がある場合に省略している場合に利用しています。

エディタ

本ハンズオンでは、エディタとして vi および mousepad を使えるようにしています。vi が使えない人は、mousepadを使ってください。

ルート権限について

本ハンズオンでは、root 権限を使った作業を行う場合があります。その場合には sudo コマンドを使って作業をします。sudo コマンドが必要な場合にはコマンドラインの説明のところに sudo を指定しています。

パッケージメンテナ名の設定

パッケージメンテナの名前とメールアドレスを環境変数に設定します。適当なでエディタを使って、/home/user/.bashrc に以下の例のように変更して保存してください。各項目には自分の名前とメールアドレスをいれてください。
export DEBFULLNAME="Nobuhiro Iwamatsu"
export DEBEMAIL=iwamatsu@nigauri.org

保存できたら、ターミナルを起動し、$ source ~/.bashrcを実行してください。

web サーバの立ち上げ

コンソールから以下のコマンドを実行してください。
$ sudo ruby1.8 ./tools/web.rbapt-line の変更

エディタを使い、/etc/apt/sources.list ファイルを以下のように変更してください。apt-line が書かれていますが、削除してください。
deb http://localhost/debian lenny main

リポジトリ情報のアップデートリポジトリのアップデートを行います。
$ sudo apt-get update

/tmp のマウントオプションの変更/tmp

を nodev オプションなしで remount します。以下のように実行します。
sudo mount -o remount,dev /tmp

今回のサンプル
今回は、cwidget を使ったサンプルプログラム/live/image/osc/data/hello-cwidget-0.1.tar.gz を用意しました。このサンプルプログラムを Debian パッケージ化します。/live/image/osc/data ディレクトリにソースファイルがあるので、ホームディレクトリに展開します。
$ cd$ tar -xzf /live/image/osc/data/hello-cwidget-0.1.tar.gz

このソフトウェアは C++ で記述されており、コンパイルに必要なライブラリやソフトウェアがインストールされている場合には、./configure ; make ; make install でコンパイルおよびインストールまでができるようになっています。

パッケ ージング化
開始ソースを読んでみる

動作しないプログラムをパッケージ化してもしょうがない
ので、先にどのようなソフトウェアなのか理解するためにもパッケージング化する前にソースコードを読んで、ソフトウェアの中身を理解して置きましょう。

とりあえず、コンパイルしてみる

動かないプログラムをパッケージ化してもしょうがないので、動作確認をします。まずは最低限コンパイルに必要なパッケージをインストールする必要があります。それがbuild-essential パッケージです。これは、パッケージ化の場合にも必要です。以下のように実行し、インストールします。
$ sudo apt-get install build-essential先ほど解凍したディレクトリに移動します。移動したら、configure を実行します。
$ cd hello-cwidget-0.1$ ./configure...
Alternatively, you may set the environment variables \SIGC_CFLAGS
and SIGC_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
...

実行すると、エラーになります。エラーは pkg-config とSIGC CFLAGS / SIGC LIBS によるもののようです。

pkg-configはどこにあるのか、調べてみます。
$ which pkg-config

インストールされていないようです。pkg-config はどのパッケージで提供されているのでしょうか。

必要なファイルを探す

Debian で特定のファイルが提供されているパッケージを探す場合には、apt-file を利用します。以下のように実行し、インストールします。
$ sudo apt-get install apt-file

通常は、 この後、apt-file update を実行し、ファイル情報データを取得しますが、既に Live-CD に入れているので省略します。

ファイルを探すには以下のように実行します。
$ apt-file search pkg-config...
nant: /usr/share/doc/nant/help/functions/pkg-config.\
is-max-version.html
pkg-config: /usr/bin/pkg-config
pkg-config: /usr/share/doc/pkg-config/AUTHORS...

実行すると、指定したファイルを提供しているパッケージ名が出力されます。出力されたパッケージをインストールします。
$ sudo apt-get install pkg-config

再度 configure を実行してみましょう。
$ ./configure...
No package ’sigc++-2.0’ foundConsider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
...

まだ足りないパッケージがあるようです。先ほどと同じように apt-file を利用して検索し、インストールします。

$ apt-file search sigc++-2.0.pc
libsigc++-2.0-dev: /usr/lib/pkgconfig/sigc++-2.0.pc$ sudo apt-get install libsigc++-2.0-dev

再度 configure を実行します。
$ ./configure...
checking for CWIDGET... configure: error: Package \requirements(cwidget) were not met:
No package ’cwidget’ foundConsider adjusting the PKG_CONFIG_PATH environment variable \if you
installed software in a non-standard prefix.
...

エラーになります。まだ足りないようなので、再度検索してインストールします。

$ apt-file search cwidget.pc
libcwidget-dev: /usr/lib/pkgconfig/cwidget.pc$ sudo apt-get install libcwidget-dev./configure...
config.status: WARNING: Makefile.in seems to ignore the \--datarootdir setting
config.status: creating src/Makefile
config.status: WARNING: src/Makefile.in seems to ignore the \--datarootdir setting
config.status: creating config.hconfigure が正常に終了しました。終了すると、Makefile が作成されています。make を実行し、コンパイルします。

$ make...
make[1]: ディレクトリ ‘/home/user/hello-cwidget-0.1’ \に入ります
Making all in src
make[2]: ディレクトリ ‘/home/user/hello-cwidget-0.1/src’ \に入ります
g++ -DHAVE_CONFIG_H -I. -I. -I..
-g -O2 -I/usr/ \include/sigc++-2.0 \-I/usr/lib/sigc++-2.0/include-I/usr/lib/cwidget-I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include \-c hello.cc
g++ -g -O2 -I/usr/include/sigc++-2.0 -I/usr/lib/ \sigc++-2.0/include\-I/usr/lib/cwidget -I/usr/include/sigc++-2.0-I/usr/lib/sigc++-2.0/include \-o hello hello.o -lsigc-2.0-lcwidget -lncursesw \-lsigc-2.0
make[2]: ディレクトリ ‘/home/user/hello-cwidget-0.1/src’ \から出ます
make[2]: ディレクトリ ‘/home/user/hello-cwidget-0.1’ に入ります
make[2]: ディレクトリ ‘/home/user/hello-cwidget-0.1’ から出ます
make[1]: ディレクトリ ‘/home/user/hello-cwidget-0.1’ から出ますコンパイルも正常に終了したので、試しに実行してみます。
$ ./src/helloここまではサンプルプログラムの動作確認です。動作しないプログラムをパッケージ化してもしょうがないので、先にどのようなソフトウェアなのか理解するためにもパッケージング化する前にソースコード等を読んでおくことをお勧めします。

パッケージの雛形

dh make コマンドでパッケージの雛形を作成することができます。dh make は、dh-make パッケージで提供されています。以下のコマンドを実行し、インストールします。
$ sudo apt-get install dh-make雛形の作成は以下のコマンドを実行します。
$ dh_make --createorig -s–createorig オプションはオリジナルソースコードの tar.gz
イメージを構築します。 今回はシングルバイナリパッケー
ジ（一つのソースコードから一つのバイナリパッケージが作成される）なので-s を指定します。実行すると以下のようなメッセージが表示されるので、Enter キーを押します。
Maintainer name : Nobuhiro Iwamatsu
Email-Address: iwamatsu@nigauri.org
Date: Sun, 15 Feb 2009 23:51:58 +0900
Package Name: hello-cwidget
Version: 0.1
License: blank
Using dpatch: no
Using quilt: noType of Package : Single
Hit <enter> to confirm:

debian ディレクトリ

うまく動作すると、debian ディレクトリが作成され、この中に雛形が作成されます。パッケージメンテナはこのディレクトリの中以外は触りません。

.
|-- README.Debian (Debian パッケージの README)|-- changelog(Debian パッケージのチェンジログ)|-- compat(Debian パッケージのバージョン)|-- control(Debian パッケージ情報)|-- copyright(コピーライト情報)|-- cron.d.ex(cron を使うパッケージ用設定ファイル)|-- dirs(作成するディレクトリ名を指定する)|-- docs(インストールするドキュメントファイルを指定する)|-- emacsen-install.ex (emacs 用設定ファイル)|-- emacsen-remove.ex (emacs 用設定ファイル)|-- emacsen-startup.ex (emacs 用設定ファイル)|-- hello-cwidget.default.ex (debfonf 用)|-- hello-cwidget.doc-base.EX (doc-base 用)

|-- init.d.ex(init.d を使うパッケージ用設定ファイル)|-- init.d.lsb.ex (init.d を使うパッケージ用設定ファイル)|-- manpage.1.ex(manpage の雛形)|-- manpage.sgml.ex(manpage の雛形)|-- manpage.xml.ex (manpage の雛形)|-- menu.ex(メニューの雛形)|-- postinst.ex(postinst メンテナファイルの雛形)|-- postrm.ex(postrm メンテナファイルの雛形)|-- preinst.ex(preinst メンテナファイルの雛形)|-- prerm.ex(prerm メンテナファイルの雛形)|-- rules(パッケージビルドスクリプト)‘-- watch.ex(アップストリームチェック用ファイル)

CDBS./configure ; make ; make install でパッケージのコンパイルができるソフトウェアは cdbs を使った方が容易に Debianパッケージ化できます。

一回 hello-cwidget ディレクトリを削除する

現状では先ほどの dh make の結果が残っているので一回、サンプルプログラムのディレクトリごと削除し、再度展開します。
$ cd$ rm -rf hello-cwidget-0.1.*$ tar -xzf /live/image/osc/data/hello-cwidget-0.1.tar.gz$ cd hello-cwidget-0.1

dh make を実行し、パッケージの雛形を作成す
る

CDBS を使う Debian パッケージの雛形作成は以下のコマンドを実行します。
$ dh_make --createorig -b-b オプションを指定すると、CDBS を使った雛形を作成します。

Maintainer name : Nobuhiro Iwamatsu
Email-Address: iwamatsu@nigauri.org
Date: Sun, 15 Feb 2009 23:51:58 +0900
Package Name: hello-cwidget
Version: 0.1
License: blank
Using dpatch: no
Using quilt: noType of Package : cdbs
Hit <enter> to confirm:不要なファイルの削除

今回のパッケージ化に必要ではないファイルを debian ディレクトリ以下から削除します。
$ rm -rf debian/*.ex debian/*.EX

debian/changelog ファイルの編集

debian/changelog ファイルには ITP(Intent To Package) のバグが既に書かれているで削除します。以下のように変更します。
hello-cwidget (0.1-1) unstable; urgency=low* Initial release.
-- Nobuhiro Iwamatsu <iwamatsu@nigauri.org> \Wed, 18 Feb 2009 16:31:25 +0000

debian/copyright ファイルの編集
This package was debianized by Nobuhiro Iwamatsu \<iwamatsu@nigauri.org> on
Wed, 18 Feb 2009 16:31:25 +0000.
It was downloaded from <http://www.nigauri.org/~iwamatsu/>
Upstream Author:
Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Copyright:
Copyright (C) 2009 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
License:GPLv2
The Debian packaging is (C) 2009, Nobuhiro Iwamatsu \<iwamatsu@nigauri.org> andis licensed under the GPL, see ‘/usr/share/common-licenses/GPL’.

debian/control ファイルの編集

Source: hello-cwidget
Section: devel
Priority: extra
Maintainer: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Build-Depends: cdbs, debhelper (>= 7), autotools-dev
Standards-Version: 3.8.0
Homepage: http://www.nigauri.org/~iwamatsu/
Package: hello-cwidget
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Debian Packaging Hands-on sample programThis is sample program of Debian Hands-on done withOSC2009 TOKYO Spring.
This is very easy program that uses CWidget.

パッケージのビルド
パッケージのビルドには debuild コマンド を使います。
debuild コマンドは devscripts パッケージで提供されています。また、まだ CDBS パッケージをインストールしていないので、一緒にインストールします。パッケージをインストールしたら、パッケージのビルドをしてみましょう。
$ sudo apt-get install devscripts cdbs
$ debuild -us -uc...
dpkg-buildpackage: full upload (original source is included)
Now running lintian...
W: hello-cwidget: binary-without-manpage usr/bin/hello
W: hello-cwidget: new-package-should-close-itp-bug
Finished running lintian.

パッケージのインストール

パッケージが無事ビルドできたら、実際にインストールしてみます。インストールには dpkg コマンドを使ってインストールします。インストールしたら、実際に動くか確認してみましょう。
$ sudo dpkg -i ../hello-cwidget_0.1-1_i386.deb$ which hello$ helloパッケージのビルドテスト

パッケージができたあとにはパッケージのテストを行います。パッケージのビルドテストには pbuilder を使います。
pbuilder は Debian に必要な最低限の環境からビルドを行い、依存関係等のチェックを行ってビルドテストを行うツールです。

pbuilder パッケージのインストール$ sudo apt-get install pbuilder

pbuilder 環境の構築

ビルドテストを行う前に base システムイメージを構築する必要があります。通常は以下のように実行しますが、$ sudo pbuilder --create --distribution lenny

今回はメモリの制限があるため、既に用意してある base システムイメージを利用します。イメージは/live/image/osc/data/base.tgz にあります。

パッケージのビルドテスト
pbuilder でテストする場合には作成されたパッケージの dscファイルを指定します。このファイルには、Debian パッケージの構成に必要なファイル名が書かれているので、その情報を元に再ビルドを行うことができます。また、実行前に apt-get clean コマンドを実行してキャッシュをクリアしてください。メモリが足りないためです。
$ cd ..
$ sudo apt-get clean$ sudo pbuilder --build --distribution lenny \--basetgz /live/image/osc/data/base.tgz \--buildplace /tmp hello-cwidget_0.1-1.dsc...

なぜエラーになるのか

先ほどの手順でやってもビルドエラーになります。なぜエラーになるのでしょうか。考えてみましょう。

エラーの原因

ビルドに必要なパッケージが指定されていないために、この問題は発生します。正しい hello-cwidget パッケージの依存関係を見てみます。

debian/control ファイルを見てみます。
Source: hello-cwidget
Section: devel
Priority: extra
Maintainer: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Build-Depends: cdbs, debhelper (>= 7), autotools-dev
Standards-Version: 3.8.0
Homepage: http://www.nigauri.org/~iwamatsu/
Package: hello-cwidget
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Debian Packaging Hands-on sample programThis is sample program of Debian Hands-on done withOSC2009 TOKYO Spring.
This is very easy program that uses CWidget.

再ビルドテスト

エラーになる理由は先にインストールしたパッケージ
libcwidget-dev をパッケージビルド時の依存関係を記述するフィールド Build-Depends に追加していないためです。
追加して、再ビルドしてみます。
debian/control ファイルを以下のように修正します。
...
Maintainer: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Build-Depends: cdbs, debhelper (>= 7), autotools-dev, libcwidget-dev...

再ビルドには以下のように実行します。今度はうまくビルドができるはずです。
$ sudo pdebuild -- --distribution lenny --basetgz \/live/image/osc/data/base.tgz --buildplace /tmp

パッケージのインストール/アンインストール
テスト

パッケージがビルドできただけでは喜んではいけません。
インストール/アンインストールのテストも行いましょう。
パッケージのインストール/アンインストールのテストにはpiuparts パッケージを使います。

piuparts のインストール

以下のように実行し、インストールします。
$ sudo apt-get install piuparts

パッケージのインストール/アンインストール
テスト
piuparts も pbuilder と同様に最低限の環境からのインストー
ルをチェックします。よって、base システムイメージが必要です。普段は指定する必要はありませんが、今回は-b オプションを付けて、/live/image/osc/data/base.tgz にあるbase システムイメージを指定して実行します。
$ cd ..
$ sudo piuparts -d lenny -b /live/image/osc/data/base.tgz \hello-cwidget_0.1-1_i386.deb...
0m41.9s DEBUG: Removed directory tree at /tmp/tmpHliOKO
0m41.9s INFO: PASS: All tests.
0m41.9s INFO: piuparts run ends.

プログラムの編集

hello-cwidget を実行して、違和感のある方がおられたと思います。そう、Lenny がリリースされたというのに Etch になっていました。これはよくないので変更してみます。今回はよく利用されている dpatch を使って説明します。

dpatch のインストール

dpatch をインストールするには、以下のように実行します。
$ sudo apt-get install dpatchdpatch を使うための準備
dpatch を使う前に、debian/rules ファイルに dpatch を使うように設定する必要があります。dpatch は一回、パッケージの状態を初期化してから行うためです。
hello-cwidget-0.1 ディレクトリに移動して、debian/rulesを以下のように修正します。
$ cd

hello-cwidget-0.1#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/autotools.mk
include /usr/share/cdbs/1/rules/dpatch.mk
include /usr/share/dpatch/dpatch.makedpatch の実行

dpatch は自パッケージを一回コピーし、dpatch 環境に移行します。その中で変更して、dpatch 環境を終了する時に差分を作成します。dpatch 環境に移行するには
dpatch-edit-patch コマンドに作成する差分を保存するファイル名を指定して実行します。以下のように実行してください。
$ dpatch-edit-patch 01_change_dist

ファイルの変更

今回変更するファイルは src/hello.cc です。エディタを起動し、対象のファイルを変更します。mousepad の場合は以下のように実行します。
$ mousepad ./src/hello.cc

Etch の部分を Lenny に変更したあと、保存してエディタを終了します。

dpatch 環境を終了する

dpatch 環境を終了するには以下のように実行してください。
実行すると、差分をファイルに保存して dpatch 環境を終了します。
$ exit作成された差分 (patch) の中身作成された差分はdebian/patches/01 change dist.dpatch として保存されています。以下のような内容になっているはずです。
#! /bin/sh /usr/share/dpatch/dpatch-run## 01_change_dist.dpatch by Nobuhiro Iwamatsu <iwamatsu@nigauri.org>#### All lines beginning with ‘## DP:’ are a description of the patch.
## DP: No description.
@DPATCH@diff -urNad hello-cwidget-0.1~/src/hello.cc hello-cwidget-0.1/src/hello.cc--- hello-cwidget-0.1~/src/hello.cc 2009-02-15 06:56:01.000000000 +0000+++ hello-cwidget-0.1/src/hello.cc 2009-02-18 16:54:40.668274925 +0000@@ -26,7 +26,7 @@toplevel::init();+widgets::widget_ref dialog =dialogs::ok(L"Hello, Debian GNU/Linux Etch!",dialogs::ok(L"Hello, Debian GNU/Linux Lenny!",
util::arg(sigc::ptr_fun(toplevel::exitmain)));toplevel::settoplevel(dialog);

パッチにはなぜそのような説明をしたのか、説明を書く必要があります。## DP: No description. の部分に説明を書きます。以下のように変更するといいかもしれません。
## DP: Change distributin name from Etch to Lenny.

作成した差分をパッケージに反映させる

差分は作成されましたが、このままではパッケージ作成時に差分が適用されません。dpatch を使って差分をパッケージに適用させるには debian/patches/00list ファイルを作成し、パッケージにパッチをファイルに列挙する必要があります。debian/patches/00list を以下のように変更します。
01_change_dist.dpatch

差分を適用したパッケージを作成する

差分を適用したパッケージを作成するには通常のパッケージ作成と変わりません。debuild コマンドを使って作成します。
$ debuild -us -uc....

パッケージ作成エラーになる

説明どおりに操作している人は、パッケージ作成エラーになると思います。理由は何なのか、考えてみましょう。原因が分かった人は、再ビルドした後に、実際にインストールして、差分が反映されているか確認してください。もちろん pbuilder/piuparts を使ってパッケージのテストを行う事も忘れずに。

質疑応答

以上で、本ハンズオンは終了です。何か質問等はありますか？

パッケージの問題

このパッケージにはまだ説明していない 2 つの問題があります。

dpatch による debian/changelog の変更ができていない
debian/copyright の copyright が間違っている。

次回の勉強会

次回の勉強会

2008 年 3 月 21 日は東京大学で開催予定です。
2008 年３月 7 日に関西エリア Debian 勉強会が行われます。