snapはCanonicalとUbuntuコミュニティが開発・推進している「ユニバーサルパッケージ」です。いわゆるLinuxディストリビューションを問わずに利用できるパッケージフォーマットであり、強力な権限管理機能を備えています。今回はこのsnapを、Ubuntu以外のディストリビューションにインストールしつつ、コンテナ管理システムであるLXDのsnap版パッケージをインストールしてみましょう。
snapはいろいろなディストリビューションで利用可能
snapはCanonicalとUbuntuコミュニティが推進する「ユニバーサルパッケージ」です。依存するソフトウェアをすべてパッケージに含めることで、依存関係を気にせずあらゆるディストリビューションでインストール可能なバイナリパッケージとして利用できます。
まずはsnapを説明する上で出てくる用語を整理しておきましょう。ごたくはいいからインストール方法を知りたい人は「ディストリビューションごとのインストール方法」までジャンプしてください。
- 「snap」はパッケージフォーマットであり、またコマンド名です。
- snapパッケージをインストールする上でシステムに必要になるのがデーモンサービスである「snapd」です。
- snapパッケージを構築するツールが「snapcraft」です。
- snapパッケージを配布するリポジトリサービスを「Snap Store」と呼びます。
開発者はsnapcraftで構築したsnapパッケージをSnap Storeにアップロードします。Snap StoreへのアップロードはUbuntu Oneアカウント(Launchpadアカウント)だけあれば十分です。AndroidのGoogle Playと同様に誰でも任意のソフトウェアをアップロード・配信できます。将来的には有償配信にも対応する予定です。
利用者はsanpdをシステムにインストールした上で、snapコマンドもしくはUbuntuソフトウェアアプリからsnapパッケージをインストールします。既存のパッケージ管理システムに対して、snapは次のような機能が備わっています。
- 1つ前のバージョンへのロールバック
- 複数のリリースブランチの配信機能(channel)
- AppAprmor/seccomp等を利用したホストに対する隔離機能
- 細かい権限管理(interface)
- 複数のバージョンの並行利用
一部は他のユニバーサルパッケージでもできたり、ものによっては既存のパッケージ管理システムでもできるものもあります。ただしすべてをひとつのソフトウェアで実現可能なのはおそらくsnapだけでしょう。
ちなみに複数バージョンの並行利用は比較的最近に実験的に実装された機能になります。同じシステム上で同じソフトウェアの異なるバージョンを使い分けたいときに便利です。
最近はいろいろなソフトウェアがsnapで配信されるようになってきたので、本連載でもたびたびsnapパッケージのインストールを紹介しています。代表的になのはLXDですが、第499回のShotCutや第560回のmicrok8sなどがそれに該当しますね。第515回にも紹介されているように、最近のUbuntuではいくつかのGUIアプリについてはsnap版がインストールされるようになりました。また、第476回ではsnapパッケージの作り方が紹介されています。
なお、UbuntuデスクトップやUbuntuサーバーにおいてdeb/APTをすべてsnapで置き換える予定は今のところありません。これはsnapとdeb/APTで目的やターゲットが異なり、それぞれできること・できないことがあり、得意不得意な部分が異なるためです。Debianパッケージを簡単にsnapパッケージにする仕組みは存在するものの、あくまでそれはsnap化に向いているパッケージのみの仕組みであり、Debianパッケージをすべてsnap化しようとすると多大な労力が必要になる割に、得られるものはそこまで多くないでしょう[1]。
更新頻度の高い、単独のCLI/GUIアプリなどはsnap化に向いています。それに対して、いろいろなアプリケーションからライブラリ的に使われるようなソフトウェアはDebianパッケージ化したほうが皆が幸せになれるでしょう。
なぜユニバーサルパッケージなのか
Linuxディストリビューションを使用している人の大半は、個々のディストリビューションのパッケージ管理システムにお世話になっていることでしょう。特に依存関係まで含めて必要に応じてインストールやビルドを行ってくれるその仕組みは、ソフトウェアの再配布やソースコードの取得の自由が保証されているFLOSSで構築されているがゆえの利点であるとも言えます。
ただし一般的に異なるパッケージ管理システム同士に互換性はありません。そもそもパッケージ名の命名ルール自体が異なります。さらにバイナリ配布がメインとなっているパッケージ管理システムのほとんどは特定のパッケージに対しては特定のバージョンのみインストールできる仕組みです。結果として、次のような問題が起こりえます。
- 特定のディストリビューション・パッケージ管理システム向けにしか提供されないソフトウェアがある
- 同じソフトウェアでもディストリビューションごとて提供されるバージョンが異なる
- あるソフトウェアを構築する際に必要なライブラリなどのバージョンがとても古い
いずれも利用者が自分自身で解決できる問題ではあるものの、手間はそれなりにかかります。さらに大変なのはLinux向けのソフトウェアを開発する側です。もし最新バージョンのバイナリパッケージをリリースするのであれば、各ディストリビューションのリリースごとのパッケージ・バージョンの違いを意識しながら構築しなくてはならないからです[2]。
UbuntuであればPPAが活用できます。それなりに体力があるところは、RHEL/CentOS系とDebian/Ubuntu系のそれぞれの独自リポジトリを構築して提供しているかもしれません。ディストリビューションのパッケージに依存せずに利用できるソフトウェアであれば、特定の言語のエコシステムを利用する手もあるでしょう。
どの方法もどうしても開発側に「ディストリビューションごとのパッケージング」の知識が必要になってしまいます。結果的にソフトウェアごとに「提供するディストリビューションが異なる」状況が発生する状態です。ユニバーサルパッケージはそのような状況を打破するために作られました。たとえばsnapパッケージを作りたいのであれば、snapcraft.yml
という名前のファイルに必要な情報を埋めるだけです。ビルド自身はDockerやLXDのコンテナの中で実行可能です。
といっても考え方自体はそこまでものでもありません。たとえばユニバーサルパッケージ的な機能を備えたAppImage(旧称klik)は2004年のリリースです。
今だとsnapと双璧をなすFlatpak(旧称xdg-app)もユニバーサルパッケージを実現する存在です。FlatpakはどちらかというとGUIアプリケーションをメインターゲットとしていますが、こちらも開発は活発なのでいずれCLIでのUXも改善することでしょう。第513回でも紹介しているように、Flatpakで提供されているソフトウェアは増えています。
ディストリビューションごとのインストール方法
能書きはこれくらいにして、実際に各ディストリビューションでsnapを使える方法を説明しましょう。最低限必要なのがsnapdです。このデーモンだけはsnapパッケージとして配布できないので、各ディストリビューションのパッケージとして配布されています。
ちなみにsnapの権限管理機能を利用するためにはAppArmorといくつかのカーネルコンフィグが必要です。これらについてはディストリビューションによって対応がまちまちなので、snapdはAppArmorがなくても動作するようになっています。AppArmorがない場合、snapパッケージはホストシステムへのリソースにアクセス可能なdevmodeとして動作します。
今回インストールする対象は次のディストリビューションです。
Ubuntuを始めとしていくつかの派生ディストリビューションには最初からsnapdがインストールされています。それ以外のインストール方法は「snapcraftの公式ドキュメント」にまとまっていますので、そちらも参照してください。
Debian 10へのインストール
DebianはDebian 9からリポジトリにsnapdが存在しています。よってaptコマンドからsnapdをインストール可能です。
ただ、どうしてもsnapdのバージョンは古くなってしまいがちです。
snapパッケージは「/snap/bin/
」以下に実行バイナリへのシンボリックリンクを配置します。「/etc/profile.d/apps-bin-path.sh
」でPATHの設定をしていますので、一度ログインし直してください。
実際にsnapパッケージをインストールし、実行してみましょう。
coreパッケージはsnapアプリケーションを動かすためのベースシステムです。
CentOS 7へのインストール
CentOSやRHELは7.6以降であればEPELリポジトリにあるsnapdパッケージを利用可能です[3]。よってあらかじめEPELリポジトリを有効化しておいてください。
snapパッケージをインストールするためにはsnapdが起動していなくてはなりません。snapd.socketをアクティベーションしておくと、必要に応じてsnapdを起動してくてくれます。
また、/snap
ディレクトリは作られませんので自分で作成します。
Debianと異なり、CentOSの場合は「/etc/profile.d/snapd.sh
」で/snap/bin
のPATH設定などを行います。よってやはりログインし直してください。
パッケージインストール時にsnapdが起動しているため、Debianとは少し異なるメッセージですね。警告は/var/lib/snapd/snap/bin
がsudo時のPATHとして設定されていないことによる警告です。
openSUSE Leap 15.1へのインストール
openSUSE Leap/Tumbleweedは、snappyリポジトリからsnapdのインストールが可能です。よってまずはsnappyリポジトリを有効化します。
上記はopenSUSE Leap 15.1にインストールした例です。他のリリースを使う場合は適宜URLを変更してください。
snapdパッケージをインストールしましょう。
openSUSEの場合は、snapdそのものを有効化する方法が紹介されています。
Tumbleweedの場合は、snapd.apparmorも有効化する必要があるようです。
CentOSと同様にPATH設定するためにログインし直してください。
実際にsnapパッケージをインストールし、実行してみましょう。
Arch Linuxへのインストール
Arch Linuxへのインストールは、snapcraft.ioよりはArch Wikiのほうがかなり詳しく紹介されています。
以前はリポジトリにsnapdパッケージがあったのですが、今はAUR経由のインストールになっているので、gitやbase-develグループが必要になります。
次に必要なパッケージデータをダウンロードしてビルド・インストールしましょう。
CentOSと同様に、snapd.socketを有効化し、「/snap
」を作成しましょう。
「/snap/bin
」へのPATH設定のために再ログインしてください。そのあとの実行方法は他のディストリビューションと同じです。
snapの実行パスについて
snapはシステムからの隔離を目的の一つにあげています。よって標準の設定では、アプリの中からシステムのファイルシステムにはアクセスできないようになっています。このため実行バイナリは一般的な実行PATHにはインストールしていません。snapパッケージでインストールされた実行コマンドは「/snap/bin
」(からリンクしている「/snap/パッケージ名/バージョン/bin
」)にありますので、/snap/bin
をPATHに追加する必要があります。
どのディストリビューション向けのsnapdパッケージも、「/etc/profile
」以下のファイルとして上記PATH設定を行うファイルがインストールされます。よって一般ユーザーであれば、この設定で問題ありません。
気をつけなくてはいけないのは、sudoでコマンドを実行する際です。sudoのとき実行PATHはスクリーニングされますので、「/snap/bin
」を明示的に指定しなくてはなりません。Ubuntuの場合は/etc/sudoers
に次のような「/snap/bin
」を追加する設定がありますので、必要に応じて他のディストリビューションでも同じ設定を行っておくと良いでしょう。
AppArmorが動かない環境でのsnapの制限
前述のようにsnapはAppArmorやseccompを利用して隔離環境を実現しています。つまりAppArmorが動いていない環境ではsnapの隔離機能は動作しません。システムで動作している隔離機能のリストは次のように確認できます。
特に注意すべきは「confinement-options」です。これの「strict」が有効になっていないと、完全な隔離は実行されません。今回インストールした環境だと、残念ながらAppArmorが動いている環境も含めて、いずれもstrictは有効化されませんでした。
ちなみにstrictな環境だとhello-worldパッケージと一緒にインストールされる、hello-world.evilコマンドがエラーになります。
上記のようなエラーメッセージが表示されない場合、何がしかの隔離機能が無効化されていると言えます。
snap版LXDをいろいろなディストリビューションにインストールする
最後にsnapdをインストールした環境にシステムコンテナマネージャーであるLXDをインストールしましょう。LXDは第521回でも紹介しているように、Linux上でシステムコンテナを動かすためのツールです。ホストから隔離された軽量の環境を、かんたんに構築できます。
LXDは現在snapパッケージへの移行しています。よって最新のLXDやLTS版のLXDをインストールしたいならsnap版が便利です。
snapは「channel」という仕組みで、複数のリリースブランチを管理できます。LXDの場合はstable/candidate/beta/edgeをフィーチャーリリースのリリースブランチとして利用し、それとは別に最新の3.x系、LTSリリースである3.0と2.0のリリースブランチを用意しています。
今回はUbuntu 18.04 LTSにインストールされているバージョンと同じLTSリリースである3.0系の最新安定版をインストールしましょう。
詳しくは第521回を参照していただくとして、LXDを利用するにはまず初期設定を行いましょう。基本的に標準の設定を使えば問題ありません。
早速コンテナを構築・起動します。
lxc list
で起動したコマンドを確認できます。
たとえばlxc exec
でコンテナの中のコマンドを実行可能です。
LXDの詳しい使い方は第521回から始まるシリーズをご確認ください。
ぜひ他のディストリビューションのユーザーも、snapやLXDを活用いただけたらうれしいです。