ユニバーサルパッケージとは
最後にsnapパッケージやそれに類いするパッケージフォーマットで言及されることの多い,
「ユニバーサルパッケージ」
- ※5
- ユニバーサルパッケージはsnapやflatpakを説明する文脈でよく使われる言葉ではありますが,
必ずしも明確な定義があるわけではありません。
歴史的経緯から,
パッケージングにおいて最もネックになるのが
- ※6
- Debianだと1994年1月に公開された0.
91には, パッケージ管理スクリプトとして 「dpkgコマンド」 を同梱していました。当時はコンパイル済みバイナリを展開するただのシェルスクリプトでした。ちなみにこのdpkgコマンドには 「StopALOP」 と呼ばれるパッケージングシステムにインスパイアされたものと書いてあります。意味は 「脱毛症の阻止」。つまりソフトウェアのインストールは, 当時から毛髪に優しくない作業だったようです。
そんな状況を打破するために考えられたのが
- ディストリビューションをまたいで,
同じバイナリパッケージをインストール可能 - 依存関係は原則存在せず,
必要なものはすべてパッケージの中に取り込んだ状態で提供する - サンドボックス化によるセキュリティの向上と,
ディストリビューションとアプリケーションの分離の推進
ソフトウェアは多かれ少なかれ何らかの別のソフトウェアに依存しています。Linux上で動くELFバイナリであれば,
- ※7
- そもそもの話として
「バージョン」 の定義も曖昧です。たとえばアップストリームでは新しいバージョンにのみ適用されているパッチが, ディストリビューションのパッケージでは古いバージョンにも適用されていることはよくあります。脆弱性情報で 「xx以降のバージョンで解決済み」 と表記されているとき, 必ずしもそれをそのままパッケージのバージョンと比較するわけにはいかないことに注意が必要です。
また
結果として任意のバイナリパッケージは,
ユニバーサルパッケージでは,
依存関係に基づくバージョンもパッケージを作る側でコントロールできるため,
しかしながらこれらのメリットを実現するためには,
- パッケージサイズが大きくなる
- ライブラリとの柔軟な組み合わせができない
- パッケージ管理システムそのものの複雑性が増える
- サードパーティのパッケージの利用に対する是非
ディストリビューションのパッケージは,
この品質の高さが従来のパッケージ管理システムの強みであり,
- ソフトウェア開発者:ユニバーサルパッケージフォーマットを用いて,
常に最新のディストリビューションに依存しないパッケージを提供する - ディストリビューター:従来のパッケージフォーマットを用いて柔軟に組み合わせ可能で,
なおかつディストリビューションの中において一貫性の高いパッケージを提供する
ユーザーは用途に応じて2種類のパッケージを使い分けることになります。まず,
Snap以外のユニバーサルパッケージ
さて,
- Nix
-
おそらくユニバーサルパッケージ的な考え方の先駆けとも言うべき存在で,
2000年代前半から存在していたようです。 - AppImage
-
これも比較的早くから存在していた仕組みで,
アプリケーションをISOイメージに閉じ込めることで, 「パッケージ管理」 が不要になっています。 - Flatpak
-
FedoraおよびRHELが強力に推進しているフォーマットで,
今のところGUIアプリケーションをメインターゲットにしているようです。 - Snaps
-
Ubuntu/
Canonicalが推進しているフォーマットです。他と比べると強力な権限管理機能が売りとなっています。 - Docker
-
言わずとしれたコンテナプラットフォームの主役です。最近は任意のアプリケーションの実行環境としての地位も確立しているため,
DockerHubて配布されているコンテナイメージはある種のユニバーサルパッケージと言えるでしょう。
Flatpakについては第513回の
今回紹介したSnapsは,
- ※8
- Fedora/
RHELが推進していることからもわかるように, ここだけの話 「将来主流になる可能性が高いほう」 という観点だとSnapsよりはFlatpakに分がある印象です。Flatpakはサーバー向けやCLIツールには弱いですが, そちらはDockerをはじめとするCRI準拠の各種ランタイムが覇権を握りつつあります。
たとえばLXD,
IoTからサーバー,