Ubuntu Weekly Recipe

第654回 snapパッケージング入門

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

Ubuntuではディストリビューションを問わず利用できる「ユニバーサルパッケージ」としてsnapパッケージを開発しています。今回はこのsnapパッケージを作るための基本的な手順を紹介しましょう。

今回とそのあと数回で,snapパッケージを作ってSnap Storeに公開するまでの流れを一通り解説しています。

snapcraftコマンドで作るsnapパッケージ

Ubuntuではディストリビューションをまたいで利用できるユニバーサルパッケージシステムとしてsnapを開発しています。これはもともとIoT向けのミニマルなOSと連携して動く,独自のパッケージングシステムとして開発された「Snappy Ubuntu Core」Ubuntu Weekly Topics 2014年12月12日号が,時間を経て通常のUbuntuでも利用できるように進化したパッケージフォーマットです※1⁠。

※1
さらに遡るとその祖先は,Ubuntu Phone用に新規に開発されたClickパッケージシステムになります。

Snapパッケージは,YAMLフォーマットで記述したメタデータを元に,⁠snapcraft」と呼ばれるツールでビルドします。さらにビルドしたパッケージはSnap Store経由で,誰でも配布することが可能です。このためパッケージフォーマットとしては「snapパッケージ」と呼称されることが多いものの,パッケージの情報をまとめたサイトは「snapcraft.io」であり,パッケージングを含めたシステムそのものは「Snaps」と呼ばれることが多いようです※2⁠。

※2
snapcraftの登場に合わせてSnappyと呼ばれることはほぼなくなりました。

「ユニバーサルパッケージ」とはなんぞや,という御託は後回しにすることにして,実際にsnapパッケージを作る方法を今回は紹介していきましょう。

実は第476回Nextcloudに学ぶsnapパッケージ入門ですでにsnapパッケージの作り方は紹介しています。しかしながら,その記事ではすでに存在するパッケージを少しカスタマイズして使う方法の説明でした。今回はイチから手順を紹介することにします。

パッケージ構築環境の準備

snapパッケージをビルドする流れは,公式ドキュメントのSnapcraft overviewによくまとまっています。ビルドに必要なものは次の3種類です。

  • パッケージビルドのためのsnapcraftコマンド
  • ビルド環境を構築するための仮想マシンシステム
  • パッケージ情報を記述したYAMLファイル

snapcraftコマンド自体はsnapパッケージ化されているため,最新のパッケージをsnapコマンドでインストール可能です。またmacOSでもHomebrew経由でインストールできるようです。

$ sudo snap install snapcraft --classic

もうひとつ必要になるのが仮想マシンシステムです。従来のパッケージを作成したことがあるならおそらくご存知だと思いますが,何らかのパッケージを構築するためには,その構築時に必要なツール類をビルド環境にインストールしておく必要があります。たとえばC言語で作られたプログラムならCのコンパイラが必要ですし,特定のライブラリにリンクするソフトウェアならそのライブラリのヘッダーファイルが必要になります。

作ろうとしているパッケージごとに必要となるツールが異なるため,パッケージごとに異なる構築環境を用意する必要が出てきます。Debianパッケージならpbuilderやsbuildをはじめとするツール類によって,比較的簡単に隔離された構築環境を作成できますが,それでもソースパッケージをビルドするためにはホストに「なんやかんや」をインストールしなくてはならないことがままあります。

snapcraftでは,パッケージのビルド作業はすべて仮想マシンの中で行うようにして,構築環境の隔離性,構築作業の再利用性を高めています。特に指定しなければ隔離環境としてMultipassを利用した仮想マシンシステムを作ります。よって仮想化支援機構がついたCPUに,それなりのメモリーサイズとストレージ容量を用意しておいてください※3⁠。

※3
一応構築環境としてLXDとホストを直接利用する2種類の方法も用意されてはいます。ただメインではないため,snapcraftに慣れるまでは仮想マシンを利用する方法をおすすめします。

MultipassはUbuntuだけでなくmacOSやWindowsでも利用できるため,HomebrewでインストールしたsnapcraftでもMultipassを使ってビルドできるというわけです。Multipassそのものについては,第590回のWindows/macOS/Linuxで使える仮想マシン管理ツール『multipass』を参照してください。

Multipassはsnapcraftの初回実行時にインストールするかどうかを問われます。もちろんあらかじめインストールしておいてもかまいませんので,ここではインストール方法を紹介しておきます。

$ sudo snap install multipass --classic

一点,注意が必要です。MultipassはLegacy iptablesのみサポートしており,nftablesはまだ対応できていません。しかしUbuntu 20.10以降はnftablesが使われるようになっています。このため20.10以降でsnapcraft/multipassを使う場合は,Multipassのiptablesルールをnftablesに合わせる必要があります。これをしておかないとインスタンスの中からインターネットへ通信できないので注意してください。

$ for table in filter nat mangle; do \
  sudo iptables-legacy -t $table -S | grep Multipass | \
  xargs -L1 sudo iptables-nft -t $table \
done

もちろんUbuntu 20.04 LTS以前で,なおかつnftablesに手動で移行していない場合は対応不要です。

著者プロフィール

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

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