Ubuntu Weekly Recipe

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

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

第485回で紹介したaptlyを使えば,かんたんに自分専用のリポジトリを構築できます。作ったリポジトリを有効活用するためにはパッケージが必要です。そこで今回はARM用のバイナリパッケージをx86マシン上でビルドする方法を紹介しましょう。

Ubuntuにおける「バックポート」

Ubuntuの公式リポジトリにはバックポートという概念が存在します。Ubuntuにおけるバックポートリポジトリとは,より新しいリリースのUbuntuで提供されているパッケージを,ソースコードはそのままに古いリリース上でビルドしなおした上で古いリリースの公式リポジトリからも提供する仕組みです。

ここから先は,なぜバックポートが存在するのかという点を説明します。すぐにビルド環境を用意したい場合は,次のページに移動してください。

何のためにこの仕組みが存在するのでしょうか。まず前提として,Ubuntuでは公式のパッケージリポジトリを運用しています。何かソフトウェアをインストールしたい場合は,原則としてそのパッケージリポジトリから取得・インストールを行うのです※1)⁠公式のリポジトリでは,パッケージのバージョンアップや不具合に修正にあわせて公式のビルドサーバーがビルドを行ったバイナリパッケージを提供します。またその提供されるパッケージのバージョンはリリース毎に異なります。

※1
もちろん「原則」であって,ユーザーがそれを順守しなくてはならないということはありません。使いたいソフトウェアに応じてインストールする方法を変えるほうが便利なことも多いでしょう。最近は公式のツールですらsnapパッケージとしてインストールする方法を推奨するケースも増えています。

そのUbuntuリポジトリには「リリースしたあとはパッケージとして提供するソフトウェアのバージョンをあげない」という原則が存在します。より正確には6ヶ月の開発期間の後半ぐらいでリポジトリの「フリーズ」が宣言され,リリースまでは不具合修正に専念するため,リリース前からバージョンの固定が行われます。これはリリース後にむやみにバージョンを上げると,ディストリビューションの安定性に懸念が生じる可能性があるためです。もちろんまったくパッケージを更新しなくなるわけではありません。セキュリティアップデートへの対応,リリース後に見つかった不具合の修正などは,Ubuntuのサポート期間を通じて行われますし,それによって新しいパッケージが配布されることになります。

セキュリティ・不具合対応においては,なるべくパッケージの変更点を小さくなるように対応します。ソフトウェアの開発元が最新版のみ修正している場合は,修正箇所を抽出して取り込みます。よってパッケージそのもののバージョンはあがりますが,ソフトウェア本体のバージョンは原則として変わりません。これにより特定のリリース版を使い続けているそのソフトウェアについて詳しくないユーザーに対して,予期しないアップグレードによる混乱を与えないようにしているわけです。

とはいえ,最近はソフトウェアエンジニアリングの進歩により,個々のソフトウェアのリリース周期が非常に短くなっています。次のUbuntuリリースが行われた半年後には数十バージョンぐらい離されていたというケースもざらにあります。状況によってはFirefoxのように,一部のソフトウェアに対して例外的に新しいバージョンをそのまま既存のリリースに取り込むこともあります。しかし新しいバージョンを取り込む場合は,多くのユーザーに影響を与えるため,それなりに慎重な動作確認が必要になります。動作確認している間に次のリリースが出てしまう可能性だって起こりえます。

そこで出てくるのが「バックポートリポジトリ」です。このリポジトリは「バージョンをあげない」という制約を限定的に回避する公式の手段です。もしそのパッケージが,システムの他のコンポーネントに影響を与えない,もしくは最小限の影響にとどまるのであれば,Ubuntuでは比較的簡単な手続きでより新しいリリースからパッケージを公式リポジトリにバックポートできます。つまりUbuntu 17.10で使われているバージョンのソフトウェアを,そのままUbuntu 16.04 LTS上でリビルドして提供するのです。Ubuntuの不具合修正はスイートとして「RELEASE-updates」を,セキュリティ対応は「RELEASE-security」を指定しますが,バックポートの場合は「RELEASE-backports」を指定する必要があります。

この「RELEASE-backports」は他のスイートと比べると優先度が低くなっています。つまり「RELEASE-backports」がより新しいバージョンのパッケージを提供していたとしても,ユーザーが明示的に指定しない限り「RELEASE-backports」からはインストールしないのです。

たとえばUbuntu 16.04 LTSのLXDパッケージの場合,⁠xenial-backports」からより新しい2.17が提供されています。しかしながら,実際にインストールされるのはもっとも優先度が高いスイートの,一番新しいバージョンである2.0.10です。もし「xenial-backports」パッケージをインストールしたければ,インストール時や更新時に-t xenial-backportsと明示的にスイートを指定する必要があります。

$ apt policy lxd
lxd:
  インストールされているバージョン: 2.0.10-0ubuntu1~16.04.1
  候補:               2.0.10-0ubuntu1~16.04.1
  バージョンテーブル:
     2.17-0ubuntu2~ubuntu16.04.1 100
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
 *** 2.0.10-0ubuntu1~16.04.1 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     2.0.2-0ubuntu1~16.04.1 500
        500 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages
     2.0.0-0ubuntu4 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

ただし一度バックポートしてしまえば,公式リポジトリから普通のaptコマンドを使ってインストールできます。特別なリポジトリやリポジトリの鍵を追加する必要も何かインストールスクリプトをダウンロードする必要もないのです。これがPPAなどのサードパーティのリポジトリとの一番の違いでしょう。

当然のことながらバックポートパッケージを導入することは,程度の差こそあれ,Ubuntuの安定性を犠牲にすることでもあります。ユーザーは本当に必要なバックポートパッケージだけ導入するべきですし,必要かどうか判断できない場合は導入を避けるべきです。またバックポートによって更新されたパッケージは,Ubuntuのセキュリティチームによるセキュリティアップデートの対象外となることにも注意が必要です。

著者プロフィール

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

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

コメント

コメントの記入