Debianパッケージのビルド環境として長く利用されてきたツールに
Ubuntu 26.04 LTSまでにsbuildは何が変わったのか
コンピューターの世界で
もっとも、本当にありがたいのは武勇伝そのものではなく
今回紹介する
今回はUbuntu 26.
Debianに限らず、パッケージングを行う上でのポイントは、
Debianの場合はchrootしてビルドすることで、構築時に必要な依存関係を網羅できます。ビルド環境をクリーンに保つためにも、debootstrapを使ってルートファイルシステムを作成し、管理する仕組みも必要です。そこで出てくるのが今回紹介する
その中でもsbuildはDebianのパッケージビルドサーバーであるbuilddでも公式に使われていることもあって、DebianやUbuntuでは
sbuildと必要なパッケージをインストールする
最近のsbuildにおける、最大の変更点はunshareバックエンドのサポートと、mmdebstrapによるルートファイルシステムの構築でしょう。
従来のsbuildはビルド用のルートファイルシステム
それに対してunshareバックエンドは、Linuxカーネルが備える名前空間機能を利用して、root権限を持たないユーザーのまま隔離されたビルド環境を構築します[1]。さらにunshareバックエンドでは、ルートファイルシステムそのものは直接変更せず、tmpfsに展開してビルドを行います。そのため、ストレージにダメージを与えることなく、毎回クリーンな状態からビルドできます。
それに対してmmdebstrapは、debootstrapとは別のDebianルートファイルシステムの構築ツールです。本連載でも第594回aptコマンドを積極的に活用することで、APTの設定を利用したより複雑なルートファイルシステムを高速に作成できるのです。
このunshareバックエンドはsbuild 0.
まずは必要なパッケージをインストールしましょう。
$ apt show sbuild Package: sbuild Version: 0.91.2ubuntu3 (中略) Depends: libsbuild-perl (= 0.91.2ubuntu3), iproute2 | sbuild-schroot, uidmap | sbuild-schroot, perl:any Recommends: sbuild-schroot Suggests: autopkgtest, piuparts, mmdebstrap (>= 1.4.0) (後略)
パッケージの情報を見る限り、ユーザー名前空間を利用するuidmapのほうが優先されていることがわかります。またmmdebstrapはあくまで
$ sudo apt install sbuild mmdebstrap git-buildpackage ubuntu-dev-tools $ sbuild --version sbuild (Debian sbuild) 0.91.2ubuntu3 (11 February 2026) (snip)
「git-buildpackage」
「ubuntu-dev-tools」
unshareバックエンドを活用する
ようやくパッケージの構築に入れます。pbuilderだと
$ pull-lp-source hello resolute Found hello 2.10-5build1 in resolute $ ls -tr1 hello_2.10-5build1.dsc hello_2.10.orig.tar.gz hello_2.10.orig.tar.gz.asc hello_2.10-5build1.debian.tar.xz hello-2.10
ubuntu-dev-toolsに含まれるpull-lp-sourceコマンドは、パッケージ名とリリース名を指定することで、必要なソースパッケージを取得してくれるツールです。ここではUbuntu 26.
dscファイルがソースパッケージのメタデータで、orig.hello-2.」
ただビルドするだけであればこのファイル一式があれば十分です。さっそくビルドしてみましょう。
$ sbuild -d resolute hello_*.dsc sbuild (Debian sbuild) 0.91.2ubuntu3 (11 February 2026) on ms01 +==============================================================================+ | hello 2.10-5build1 (amd64) Tue, 07 Jul 2026 02:56:47 +0000 | +==============================================================================+ Package: hello Version: 2.10-5build1 Source Version: 2.10-5build1 Distribution: resolute Machine Architecture: amd64 Host Architecture: amd64 Build Architecture: amd64 Build Type: binary I: No tarballs found in /home/shibata/.cache/sbuild I: resolute matched resolute -- adding extra arguments: --components=main,universe I: Creating chroot on-demand by running: mmdebstrap --variant=buildd --arch=amd64 --skip=output/mknod --format=tar resolute - --components=main,universe (中略) +------------------------------------------------------------------------------+ | Summary Tue, 07 Jul 2026 02:58:34 +0000 | +------------------------------------------------------------------------------+ Build Architecture: amd64 Build Type: binary Build-Space: 9512 Build-Time: 37 Distribution: resolute Host Architecture: amd64 Install-Time: 10 Job: /home/shibata/Packages/lp/hello_2.10-5build1.dsc Lintian: pass Machine Architecture: amd64 Package: hello Package-Time: 75 Source-Version: 2.10-5build1 Space: 9512 Status: successful Version: 2.10-5build1 -------------------------------------------------------------------------------- Finished at 2026-07-07T02:58:02Z Build needed 00:01:15, 9512k disk space
いろいろな情報が流れますが、Summary欄でStatus: successful」
$ ls -tr1 hello_2.10-5build1.dsc hello_2.10.orig.tar.gz hello_2.10.orig.tar.gz.asc hello_2.10-5build1.debian.tar.xz hello-2.10 hello_2.10-5build1_amd64.build hello_2.10-5build1_amd64.changes hello-dbgsym_2.10-5build1_amd64.ddeb hello_2.10-5build1_amd64.buildinfo hello_2.10-5build1_amd64.deb hello_2.10-5build1_amd64-2026-07-07T02:56:47Z.build
buildがビルド時のログファイルで、最新のログへのシンボリックリンクになっています。changesはビルドしたバイナリパッケージのメタデータで、buildinfoがビルド時の情報です。そしてdebファイルが実際に作られたパッケージです。
さて、ビルドログの最初のほうを見てみましょう。
I: No tarballs found in /home/shibata/.cache/sbuild I: resolute matched resolute -- adding extra arguments: --components=main,universe I: Creating chroot on-demand by running: mmdebstrap --variant=buildd --arch=amd64 --skip=output/mknod --format=tar resolute - --components=main,universe
ここで~/.cache/」mmdebstrapコマンドを使って作成しようとしていることもわかります。
ただし実際に~/.cache/」
ちなみにこのとき使用する構築システムはソースパッケージ内部のdebian/ファイルの先頭エントリーで決定されます。言い方を変えるとdebian/がない環境でビルドするためには、ディストリビューション名-d コードネーム」-d resolute」
sbuildの設定ファイル
sbuildの設定ファイルは次の2種類です。
- システム全体:
/etc/sbuild/ sbuild. conf - ユーザー固有:
~/.config/sbuild/ config. pl
歴史的経緯からユーザー固有の設定ファイルとして~/.sbuildrc」~/.config/」~/.config/」~/.sbuildrc」
I: consider moving your ~/.sbuildrc to /home/shibata/.config/sbuild/config.pl
ちなみに拡張子からわかるように設定ファイルは事実上Perlスクリプトです。Perlスクリプトの変数に値を入れていく形で設定します。
ビルド環境を保存する
前述したようにsbuildの初期設定ではビルド環境を毎回作り直します。これは$unshare_」
$ echo '$unshare_mmdebstrap_keep_tarball = 1' \ >> ~/.config/sbuild/config.pl
この設定を入れると次回からビルド環境が~/.cache/」resolute-amd64.」
なお、このファイルはあくまで
強制的にビルド環境を再構築したいのであれば、このファイルを削除してください。
古くなったビルド環境を再構築する
ビルド環境を保存することの問題点は
Debian/
そのような事情もあって、$unshare_」
$unshare_mmdebstrap_max_age = 604800
これは指定した秒数以上古いイメージを、強制的に再構築するオプションです。構築時に7日間
もしローカルのビルド用で最新版であることが必須でないのであれば、もう少し大きな値を指定しても良いでしょう。ちなみに負の値を設定すると、強制再構築を無効化します。
lintianのインストールと実行を抑止する
現在のsbuildはパッケージビルド時に必ずDebianパッケージのlintツールであるlintianパッケージをインストールし、実行します。しかしながらlintianは依存パッケージが多く、毎回164パッケージほどをダウンロードすることになります。トライアンドエラーを繰り返す際には邪魔です。
sbuild実行時に--no-run-lintian」
$run_lintian = 0;
「0」--run-lintian」
特定のパッケージ・ディレクトリを構築時に参照したい
パッケージfooのバージョン1.
このときlibbar1のパッケージを作ったあとにfooを作るわけですが、libbar1が正式にリポジトリに取り込まれないと、fooをビルドできません。そこで出てくるのが--extra-packages」EXTRA_設定です。
これは何かというと
$ sbuild -d resolute --extra-package=../libbar1*.deb foo_*.dsc
複数のパッケージを使いたければ、すべてを単一のディレクトリに置いておいて、--extra-package=<directory>」
sbuild.
$extra_packages = ['<libbar1のdebファイルのパス>', 'リポジトリ扱いにしたいディレクトリ'];
別のリポジトリを登録する
ローカルのパッケージファイルではなく、PPAのような別のリポジトリを登録したいことがあります。社内にあるプライベートリポジトリを使いたいこともあるでしょう。その場合は--extra-repository」EXTRA_設定を使います。
$ sbuild -d resolute --extra-repository="deb http://archive.ubuntu.com/ubuntu resolute-proposed main" foo_*.dsc
これでresolute-proposedにあるパッケージも参照できます。sbuild.
$extra_repositories = ['deb http://archive.ubuntu.com/ubuntu resolute-proposed main'];
ちなみにこのリポジトリはtrusted=yes」--extra-repository-key」
用途別にルートファイルシステムを分ける
最初に説明したように、sbuildはコードネームとアーキテクチャーで自動的に作成するルートファイルシステムアーカイブの名前を決定します。
特定の用途向けのルートファイルシステムを別名で作成し、保存しておきたい場合は-c 名前」~/.cache/」
このようにUbuntu 26.