pbuilderのchroot環境にレポジトリを追加する

はじめに

pbuilder を使っていくつかdebパッケージを作ってみて、chroot環境をカスタマイズするベストプラクティスが自分の中で出来たのでメモです。

というニーズを満たすためのものです。

ベースの chroot 環境の作成手順

試行錯誤の結果、 Ubuntu Xenial と同じ apt-line の chroot 環境の作成手順は以下のように落ち着きました。

$ sudo pbuilder create \
        --mirror http://jp.archive.ubuntu.com/ubuntu/ \
        --distribution xenial \
        --components "main restricted universe multiverse"
$ sudo mkdir -p /var/cache/pbuilder/scripts
$ cat <<'EOS' | sudo tee /var/cache/pbuilder/scripts/add-updates-backports-security.sh
echo 'deb http://jp.archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse' \
        > /etc/apt/sources.list.d/xenial-updates.list
echo 'deb http://jp.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse' \
        > /etc/apt/sources.list.d/xenial-backports.list
echo 'deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse' \
        > /etc/apt/sources.list.d/xenial-security.list
apt update -y
apt upgrade -y
EOS
$ sudo pbuilder execute --save-after-exec \
        -- /var/cache/pbuilder/scripts/add-updates-backports-security.sh

追加の apt-line は pbuilder create--othermirror オプションで | で区切って複数指定する方法もあります。 しかし、ローカルにある自作debパッケージを使いたいとき、ビルド時に pbuilder build--override-config オプションとともに --othermirror オプションで変更したいのですが、上記の xenial-updates などの追加レポジトリも全て書く必要があって面倒です。

そこで、 xenial-updates などのレポジトリは --othermirror オプションを使わずに上記の手順で追加するようにしました。

作った chroot 環境の中身を確認するのは sudo pbuilder login で出来ます。 /etc/apt/sources.list.d/xenial-updates.list などが意図通りに追加されていることを確認したら Ctrl-D で抜けます。

gcc-7を使う際の chroot 環境の作成手順

/var/cache/pbuilder/base.tgz をコピーして /var/cache/pbuilder/gcc7.tgz を作り変更していきます。

$ sudo cp /var/cache/pbuilder/base.tgz /var/cache/pbuilder/gcc7.tgz
$ cat <<'EOS' | sudo tee /var/cache/pbuilder/scripts/add-gcc-7-repo.sh
apt-key adv --keyserver keyserver.ubuntu.com --recv BA9EF27F
echo 'deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main' \
        > /etc/apt/sources.list.d/ubuntu-toolchain-r-ubuntu-test-xenial.list
apt update -y
EOS
$ sudo pbuilder execute --basetgz /var/cache/pbuilder/gcc7.tgz --save-after-exec \
        -- /var/cache/pbuilder/scripts/add-gcc-7-repo.sh

/var/cache/pbuilder/scripts/add-gcc-7-repo.sh でのレポジトリの追加は add-apt-repositoryを使わずにPPAをapt-lineに追加する方法 で説明した方法を使っています。

ここで作った chroot 環境の中身は sudo pbuilder login --basetgz /var/cache/pbuilder/gcc7.tgz で確認できます。

pbuilder の chroot 環境の手動更新

chroot 環境は一度作成すると更新されないので、ときどき以下の手順で apt updateapt upgrade 相当の更新をする必要があります。

/var/cache/pbuilder/base.tgz を更新する場合は以下のコマンドを実行します。

$ sudo pbuilder update

/var/cache/pbuilder/gcc7.tgz を更新する場合は以下のコマンドを実行します。

$ sudo pbuilder update --basetgz /var/cache/pbuilder/gcc7.tgz

ビルド時に apt update するための設定

~/.pbuilderrc に以下の設定を追加します。

HOOKDIR="/var/cache/pbuilder/hook.d"

mkdir -p /var/cache/pbuilder/hook.d でディレクトリを作成し、以下の内容で /var/cache/pbuilder/hook.d/D70apt-update というファイルを作成し実行パーミションを付与します。

#!/bin/sh
/usr/bin/apt update

ローカルにある自作debパッケージを使いたい場合のビルド手順

ローカルにある自作パッケージをビルド時に含める方法は How to include local packages in the build に書かれていました。

上記のように chroot 環境を作っておけば、gcc-7 を使いつつローカルにある自作debパッケージのレポジトリ http://localhost/my-debs/cache をレポジトリとして追加してビルドするには以下のようにします。

$ sudo pbuilder build --basetgz /var/cache/pbuilder/gcc7.tgz \
        --override-config \
        --othermirror 'deb [trusted=yes] http://localhost/my-debs/cache xenial main' \
        dscファイル名

なお、上記の「ビルド時に apt update するための設定」を行っておく必要があります。

ビルド時にエラーになったときに chroot 環境に入る設定

上記の「ビルド時に apt update するための設定」の ~/.pbuilderrc の設定追加と HOOKDIR のディレクトリを作成するのをやった上で、以下のコマンドで /var/cache/pbuilder/hook.d/C10shell というシンボリックリンクを作成します。

$ sudo ln -s /usr/share/doc/pbuilder/examples/C10shell /var/cache/pbuilder/hook.d/