Ubuntu Weekly Recipe

第919回Ubuntu 26.04 LTSとsbuildで始めるパッケージビルド生活

Debianパッケージのビルド環境として長く利用されてきたツールにsbuildが存在します。このsbuildは最近大きな機能追加がいくつか行われ、Ubuntu 26.04 LTSではより手軽で扱いやすいツールとなりました。今回は新しいsbuildについて、インストールからセットアップ、パッケージビルド環境の活用方法について紹介しましょう。

Ubuntu 26.04 LTSまでにsbuildは何が変わったのか

コンピューターの世界で「昔は大変だった」という話を始めると、だいたい誰かの武勇伝になります。不思議なもので、昔の苦労というのは時間が経つほど少しだけ格好よく見えてくるようです。

もっとも、本当にありがたいのは武勇伝そのものではなく今はそんな苦労をしなくてよくなったという事実でしょう。

今回紹介するsbuildも、この10年でそんな変化を遂げたツールのひとつです。本連載でも2017年に一度紹介しましたが、現在ではunshareやmmdebstrapを利用することで、以前よりずっと手軽にクリーンなビルド環境を利用できるようになりました。

今回はUbuntu 26.04 LTSで採用されたsbuild 0.91を前提に、⁠今どきのsbuild」のセットアップから便利な使い方までを紹介します。

Debianに限らず、パッケージングを行う上でのポイントは、⁠よりクリーンな環境でビルドできるかどうか」です。つまりあなたの環境ではビルドできるかもしれないが、少なくとも私の環境ではビルドできないなんて言われてしまう状況を如何に避けられるかが重要になってきます。

Debianの場合は「debootstrap」と呼ばれるツールを使うことで最小のDebianシステムを構築し、その環境の中にchrootしてビルドすることで、構築時に必要な依存関係を網羅できます。ビルド環境をクリーンに保つためにも、debootstrapを使ってルートファイルシステムを作成し、管理する仕組みも必要です。そこで出てくるのが今回紹介するsbuildや、第829回のsystemd-nspawn+pbuilderでパッケージのビルド環境を整え、別PCからビルドするなどで紹介されているpbuilderです。他にもCopy on Writeによりビルド環境の展開を高速化したcowbuilderや、Dockerを利用したwhalebuilderなども存在します。

その中でもsbuildはDebianのパッケージビルドサーバーであるbuilddでも公式に使われていることもあって、DebianやUbuntuでは「標準のツール」の地位を確立しています。特に最近はunshareやmmdebstrapのサポートが行われたことで、ただパッケージをビルドしたいだけの利用者にも使いやすいツールに進化しました。

sbuildと必要なパッケージをインストールする

最近のsbuildにおける、最大の変更点はunshareバックエンドのサポートと、mmdebstrapによるルートファイルシステムの構築でしょう。

従来のsbuildはビルド用のルートファイルシステム(ビルド環境)に入る仕組みとしてschrootを利用する構成が一般的でした。schrootはchrootをよりセキュアにしたツールです。しかしながらschrootを使うためには管理者権限かそれに準ずる権限への昇格・グループの参加が必要でした。

それに対してunshareバックエンドは、Linuxカーネルが備える名前空間機能を利用して、root権限を持たないユーザーのまま隔離されたビルド環境を構築します[1]。さらにunshareバックエンドでは、ルートファイルシステムそのものは直接変更せず、tmpfsに展開してビルドを行います。そのため、ストレージにダメージを与えることなく、毎回クリーンな状態からビルドできます。

それに対してmmdebstrapは、debootstrapとは別のDebianルートファイルシステムの構築ツールです。本連載でも第594回mmdebstrapで最小のルートファイルシステムを作るなどで紹介しました。mmdebstrapはルートファイルシステム構築時にaptコマンドを積極的に活用することで、APTの設定を利用したより複雑なルートファイルシステムを高速に作成できるのです。

このunshareバックエンドはsbuild 0.87.0から導入され、sbuild 0.90.0からデフォルトで使用されるようになりました。つまりUbuntu 26.04 LTSでsbuildをインストールすると、最初からunshare + mmdebstrapを使えます[2]

まずは必要なパッケージをインストールしましょう。

$ 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はあくまで「Suggests(提案⁠⁠」であるため、そのままでは一緒にインストールされません。そこで、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」はGitで管理されているパッケージをビルドするために使うツールです。sbuildを使う上で必須ではありませんが、Debianのソースパッケージを管理する際に便利ですので、一緒にインストールしておくことをおすすめします。

「ubuntu-dev-tools」はUbuntuにおいてパッケージングを行う上で便利なツール一式が入ったパッケージです。こちらはなくてもいいのですが、pull-lp-sourceなどソースパッケージを取得するのに便利なスクリプトも多いため、インストールしておくことをおすすめします。ちなみにubuntu-dev-toolsを入れない場合は、代わりにdevscriptsをインストールしておきましょう。

unshareバックエンドを活用する

ようやくパッケージの構築に入れます。pbuilderだと「pbuilder create」であらかじめルートファイルシステムを作る形になりますが、unshare + mmdebstrap版のsbuildだと、パッケージのビルド時には自動的に作成されます。そこでまずはソースパッケージを入手しましょう。

$ 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.04 LTS(resolute)のGNU helloパッケージをダウンロードしています。

dscファイルがソースパッケージのメタデータで、orig.tar.gzはオリジナルのソースアーカイブ、orig.tar.gz.ascがその署名です。debian.tar.xzにはパッケージングに必要なファイルやオリジナルのソースアーカイブからの差分が含まれています。hello-2.10はこれらソースパッケージを展開したディレクトリです。

ただビルドするだけであればこのファイル一式があれば十分です。さっそくビルドしてみましょう。

$ 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/sbuild/以下に、ビルド用のルートファイルシステムを作っています。さらにmmdebstrapコマンドを使って作成しようとしていることもわかります。

ただし実際に~/.cache/sbuild/以下を見てみると中身は空です。ルートファイルシステムはどこにいったのでしょうか。実はsbuildの初期設定では、ビルド環境を毎回作り直します。これは設定で変更可能です。次項で解説しましょう。

ちなみにこのとき使用する構築システムはソースパッケージ内部のdebian/changelogファイルの先頭エントリーで決定されます。言い方を変えるとdebian/changelogがない環境でビルドするためには、ディストリビューション名(Debian/Ubuntuのコードネーム)-d コードネームで指定しなくてはなりません。Debianのunstable向けのパッケージを明示的にUbuntu 26.04 LTSでビルドしたい場合は、-d resoluteと指定してください。⁠resolute」の部分は開発コードネームになります。

sbuildの設定ファイル

sbuildの設定ファイルは次の2種類です。

  • システム全体:/etc/sbuild/sbuild.conf
  • ユーザー固有:~/.config/sbuild/config.pl

歴史的経緯からユーザー固有の設定ファイルとして~/.sbuildrcも利用可能ですし、manページなど各種ドキュメントもそのようになっています。ただし現在では~/.config/sbuild/config.plの利用が推奨されており、~/.config/sbuild/config.plが存在せず~/.sbuildrcが存在する場合は、次のようなメッセージが表示されます。

I: consider moving your ~/.sbuildrc to /home/shibata/.config/sbuild/config.pl

ちなみに拡張子からわかるように設定ファイルは事実上Perlスクリプトです。Perlスクリプトの変数に値を入れていく形で設定します。

ビルド環境を保存する

前述したようにsbuildの初期設定ではビルド環境を毎回作り直します。これは$unshare_mmdebstrap_keep_tarballで変更可能です。

$ echo '$unshare_mmdebstrap_keep_tarball = 1' \
  >> ~/.config/sbuild/config.pl

この設定を入れると次回からビルド環境が~/.cache/sbuild/${release}-${arch}.tarとして保存されます。Ubuntu 26.04 LTSのamd64アーキテクチャーならresolute-amd64.tarです。

なお、このファイルはあくまで「ビルド環境のベースシステム」です。つまりパッケージ構築時に追加でインストールしたファイルは保存されません。毎回インストールすることになります。

強制的にビルド環境を再構築したいのであれば、このファイルを削除してください。

古くなったビルド環境を再構築する

ビルド環境を保存することの問題点は最新ではない環境でビルドしてしまうことです。

Debian/Ubuntuの開発者の観点だと、Debianの開発版(unstable/sid)やUbuntuの開発版(2026年7月時点ならstonking)を用いてパッケージを開発します。またこれらの開発版は常時各種ソフトウェアやライブラリが更新され続けます。つまりリリースに向けてパッケージングを行っていくのであれば、より新しい(=リリースに近い)環境でビルドすべきです。

そのような事情もあって、$unshare_mmdebstrap_keep_tarballの初期値は0になっています。これを1に変えてしまうと、今度は古い環境を使い続けてしまい、最新の環境ではビルドできない可能性が発生します。そこでsbuildでは、ビルド環境の寿命も設定しています。

$unshare_mmdebstrap_max_age = 604800

これは指定した秒数以上古いイメージを、強制的に再構築するオプションです。構築時に7日間(604800秒)経過していたら、強制的に再構築することになります。

もしローカルのビルド用で最新版であることが必須でないのであれば、もう少し大きな値を指定しても良いでしょう。ちなみに負の値を設定すると、強制再構築を無効化します。

lintianのインストールと実行を抑止する

現在のsbuildはパッケージビルド時に必ずDebianパッケージのlintツールであるlintianパッケージをインストールし、実行します。しかしながらlintianは依存パッケージが多く、毎回164パッケージほどをダウンロードすることになります。トライアンドエラーを繰り返す際には邪魔です。

sbuild実行時に--no-run-lintianを指定すればこれを抑止できます。もし繰り返し入力するのが面倒であれば、設定ファイルで抑止できます。

$run_lintian = 0;

「0」なら「実行しない」で、⁠1」なら「実行する」です。実行しない設定にした場合は、--run-lintianでlintianを実行してくれます。

特定のパッケージ・ディレクトリを構築時に参照したい

パッケージfooのバージョン1.0をビルドする場合に、パッケージlibbar1のバージョン1.0が必要ではあるものの、libbar1そのもの、または必要なバージョンがDebian/Ubuntuのリポジトリに存在しない場合を考えてみましょう。

このときlibbar1のパッケージを作ったあとにfooを作るわけですが、libbar1が正式にリポジトリに取り込まれないと、fooをビルドできません。そこで出てくるのが--extra-packagesオプションと、EXTRA_PACKAGES設定です。

これは何かというと指定したdebファイルもしくはディレクトリを、仮想的なリポジトリとして構築し、パッケージビルド時にそれを参照できる機能です。具体的には次のように指定します。

$ sbuild -d resolute --extra-package=../libbar1*.deb foo_*.dsc

複数のパッケージを使いたければ、すべてを単一のディレクトリに置いておいて、--extra-package=<directory>と指定しましょう。

sbuild.confに次のように書けば、常にそのディレクトリ・パッケージファイルを参照してくれます。

$extra_packages = ['<libbar1のdebファイルのパス>', 'リポジトリ扱いにしたいディレクトリ'];

別のリポジトリを登録する

ローカルのパッケージファイルではなく、PPAのような別のリポジトリを登録したいことがあります。社内にあるプライベートリポジトリを使いたいこともあるでしょう。その場合は--extra-repositoryオプションか、EXTRA_REPOSITORIES設定を使います。

$ sbuild -d resolute --extra-repository="deb http://archive.ubuntu.com/ubuntu resolute-proposed main" foo_*.dsc

これでresolute-proposedにあるパッケージも参照できます。sbuild.confで書くなら次のようになります。

$extra_repositories = ['deb http://archive.ubuntu.com/ubuntu resolute-proposed main'];

ちなみにこのリポジトリはtrusted=yesで登録されます。つまりリポジトリの署名検証はしません。もし検証したい場合は、--extra-repository-keyオプションも併用することになります。

用途別にルートファイルシステムを分ける

最初に説明したように、sbuildはコードネームとアーキテクチャーで自動的に作成するルートファイルシステムアーカイブの名前を決定します。

特定の用途向けのルートファイルシステムを別名で作成し、保存しておきたい場合は-c 名前オプションを使用してください。このとき~/.cache/sbuild/名前.tarが作成されます。


このようにUbuntu 26.04 LTSのsbuildは、パッケージメンテナーでなくても直感的に使いやすいツールとなっています。unshare + mmdebstrapの組み合わせで特権への昇格かそれに準ずる操作も不要になりました。日常的にパッケージングをしている人は、26.04へと移行した際にぜひsbuildも試してみてください。

おすすめ記事

記事・ニュース一覧