Ubuntu Weekly Recipe

第487回 ARM向けバックポートパッケージをsbuildでビルドする

この記事を読むのに必要な時間:およそ 10 分

sbuild環境のカスタマイズ

このようにsbuildを使えば,公式のリポジトリを用いて簡単にビルドできます。しかしながら,PPAからパッケージを取得したい,ローカルミラーを使いたいなど,公式リポジトリ以外も使いたい場合は,別途設定を行わなくてはなりません。そこで最後にsbuild環境のカスタマイズ方法をいくつか紹介しておきましょう。

ビルド環境の中身を変更する

sbuildはビルド環境の構築にschrootというコマンドを使用しています。schrootは普通のchrootコマンドと異なりセッションという概念を持っており,schrootを実行した段階でセッションを開始し,セッションを終了した時点でセッション内で行われた変更を破棄します。このセッションのマスターイメージ(ソース)となるのが,/var/lib/schroot/chroots/以下にあるディレクトリです。もしビルド環境を恒久的に書き換えたい場合は,次のように,sourceタイプの名前空間を指定した上でchroot環境にログインしましょう。

$ sudo schroot -c source:xenial-armhf -u root
W: Failed to change to directory ‘/home/shibata’: No such file or directory
I: The directory does not exist inside the chroot.  Use the --directory option to run the command in a different directory.
W: Falling back to directory ‘/root’
(xenial-armhf)root@ubuntu-desktop:~#
(何か変更を加える)
(xenial-armhf)root@ubuntu-desktop:~# exit

ポイントはsource:xenial-armhfの部分です。source:プレフィックスをつけることで,マスターイメージを指定することになります。ちなみにschrootコマンドはchrootしたら,カレントディレクトリに移動しようとするため,上記のように警告メッセージが出てしまいます。

なお,schrootの-cで指定できるchroot環境は,-lでリストアップできます。

$ schroot -l
chroot:xenial-amd64
chroot:xenial-armhf
source:xenial-amd64
source:xenial-armhf

chroot:は名前空間を指定しなかったときに使われる環境です。もし特にマスターイメージに変更を加える必要がなく,単純にchroot環境内での動作を確認したいだけであれば,次のようにプレフィックスなしで実行しましょう。

$ schroot -c xenial-armhf

このセッションで行った変更は,exitすると基本的に破棄されます。rootとしてログインしたければ,-u rootをつけてください。

sbuild実行時に一時的に環境を変更したい場合は,sbuildの「EXTERNAL COMMANDS」の機能を利用できます。かなり細かく制御できますので,詳細についてはsbuildのmanページのEXTERNAL COMMANDSを参照してください。

パッケージリポジトリのURLを変更する

「jp.archive.ubuntu.com」のような公式ミラーを使いたい場合や,apt-cacher-ngなどで作ったミラー・キャッシュリポジトリを参照したい場合,/etc/apt/sources.listを書き換える必要があります。一度作ったschroot環境であれば,前項のようにマスターイメージを書き換えるという手が使えます。

mk-sbuildの時点で変更したい場合は,オプションもしくは環境変数でリポジトリのURLを変更できます。

  • オプションの場合は--debootstrap-mirror=http://jp.archive.ubuntu.com/ubuntu
  • 環境変数の場合はDEBOOTSTRAP_MIRROR=http://jp.archive.ubuntu.com/ubuntu

毎回指定するのが面倒であれば,~/.mk-sbuild.sources/etc/apt/sources.listに相当するファイルを作っておけば,それが使われます。ちなみにRELASEという文字列は自動的にmk-sbuild時に指定したリリース名に置き換わります。

ちなみに~/.mk-sbuild.rcに環境変数を設定しておくと,mk-sbuild時はそのファイルが読み込まれますので,そちらを使うという手もあります。

パッケージリポジトリを追加する

ミラーではなく,PPAなどの外部のパッケージリポジトリを追加したい場合は,sources.listの変更に加えてリポジトリ鍵の追加が必要になります。恒久的に追加したい場合はやはりマスターイメージを書き換えるのが一番確実です。

もしあるパッケージをビルドしたいときに,一時的に有効にしたい場合であれば,sbuildのオプションを指定するという手もあります※7)⁠この方法であれば,sbuildコマンド時に指定することになるので,マスターイメージは書き換わりません。

※7
たとえばあるライブラリパッケージと,それに依存するもうひとつのパッケージをビルドしたい場合などが相当します。ライブラリパッケージができたら,それをPPAやローカルリポジトリにアップロードした上で,そのリポジトリを指定してもうひとつのパッケージをビルドする手順が必要です。
  • リポジトリのURL:--extra-repository="deb http://ppa.launchpad.net/USER/PPA/ubuntu RELEASE main"
  • リポジトリのGPG鍵:--extra-repository-key=KEY.asc

上記はPPAの例です。USERはPPAを提供するユーザーの,PPAはそのPPAの名前を,RELASEはインストール先のリリース名になります。実際の例は対象のPPAのページの「Technical details about this PPA」をクリックすると,sources.listに記載する内容が示されていますので,それを参考にしてください。

リポジトリを追加する場合は,原則としてそのリポジトリのGPG鍵を設定する必要があります※8)⁠PPAの場合は,上記と同様にPPAのページから鍵IDを確認できますので,keyserverから取得するという手があります。

※8
apt-add-repositoryコマンドは,このあたりをうまいこと隠蔽しています。
$ gpg --keyserver keyserver.ubuntu.com --recv 鍵ID
$ gpg --export --armour '鍵ID' > KEY.asc
$ gpg --delete-key '鍵ID'

PPA以外であれば,何らかの方法でリポジトリのGPG鍵を提供しているはずなので,それを利用してください。

ちなみに--extra-package=PACKAGE.debを指定すると,そのパッケージファイルがリポジトリに存在するかのように設定されます。一時的に特定のパッケージだけ,依存関係として指定したい場合に便利です。

sbuildの全体の動作を設定する

sbuildはビルドサーバーとして使われていることもあって,ビルド時のイベントごとのフックやユーザー管理などを細かく設定できます。基本的に/etc/sbuild/sbuild.confに設定することになるのですが,個々のユーザーごとの設定を~/.sbuildrcとして記述することも可能です。

設定例やデフォルト値は/etc/sbuild/sbuild.conf/usr/share/doc/sbuild/examples/example.sbuildrcを参照してください。たとえばビルド完了時のメール通知や,lintian,piupartsの実行なども設定で変更できますし,先ほどの「EXTERNAL COMMANDS」も設定ファイルの中に落としこむことが可能です。

このようにsbuildを使うと,本格的なパッケージビルドサーバーとしても運用できるのです。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入