フラグメンテーションは、Linux エコシステムでかなり長い間問題でした。現在、さまざまなディストリビューションが存在し、独自のパッケージ マネージャーと、「ベース システム」を構成する独自の概念を備えています。これは、アプリケーション開発者にとって面倒です。ディストリビューション固有のパッケージをビルドしてリポジトリを維持した後、ディストリビューション固有のバグが発生した場合は修正する必要があります。また、iOS や Android などのモバイル プラットフォームとは異なり、Linux アプリケーションはサンドボックス化されずに実行され、ベース システムのすべての機能にアクセスできます。
これらの問題に対処するために、さまざまなソリューションが提案されています。この記事では、アプリケーションを配布し、制限されたサンドボックスで実行する方法である Flatpak について見ていきます。
フラットパックとは?
Flatpak は、アプリケーションを構築、配布、インストール、および実行するためのテクノロジであり、主に Linux デスクトップを対象としています。これにより、アプリケーションは依存関係をバンドルしてランタイムと共に出荷できるため、アプリケーションが特定のディストリビューションの癖に依存することはありません。さらに、Linux アプリケーションをサンドボックスに分離することで、アプリケーションのセキュリティを強化します。
Flatpak アプリケーションのアーキテクチャは、以下の図に示すとおりです:
すべての Flatpak アプリケーションは、アプリケーションが使用する基本的な依存関係を含む「ランタイム」によって支えられています。これらのランタイムはアプリケーション間で共有されます。複数のランタイム、さらには同じランタイムの異なるバージョンでも、システム上で同時に共存できます。このようにして、アプリケーションは信頼できるかなり一貫したベース システムを持ちます。
このランタイム用のアプリケーションを構築するために、SDK (ソフトウェア開発キット) と呼ばれる特別なランタイムが提供されます。これらには、コンパイラや開発ヘッダーなどのツールが含まれています。アプリケーションがランタイムにバンドルされていないライブラリに依存している場合は、アプリケーションとともに SDK を使用してそれらをコンパイルする必要があります。
さらに、ランタイムとアプリケーションのオプションのアドオンである「拡張機能」があります。ほとんどの場合、元のランタイムまたはアプリケーションから翻訳およびデバッグ情報を分離するために使用されます。
Flatpak の目的の 1 つは、アプリケーションを互いに分離することでアプリケーションのセキュリティを強化することです。デフォルトでは、Flatpak はホスト システムのリソースへの非常に制限されたアクセスを提供します。明示的に要求されない限り、アプリケーションは、ネットワークの使用、ベース システム上のファイルへのアクセス、または X、DBus、Pulseaudio などのサービスとの通信を許可されていません。さらに、「ポータル」により、高レベル API を介してリソースへの選択的なアクセスが可能になります。
インストール、Flatpak コマンド、命名規則
Flatpak は、ほとんどのディストリビューションのリポジトリで利用できます。 Arch Linux と Fedora では、flatpak
をインストールする必要があります flatpak
をインストールするパッケージ アプリケーションのインストールとビルドに役立つコマンドです。
sudo dnf install flatpak # Fedora sudo pacman -S flatpak # Arch
Ubuntu ユーザーはデフォルトのリポジトリにそれを持っていないため、インストールはもう少し複雑です。まず、この PPA をシステムに追加する必要があります:
sudo add-apt-repository ppa:alexlarsson/flatpak
次に、次の方法でパッケージをインストールできます:
sudo apt update sudo apt install flatpak
flatpak
コマンドは確かにアプリケーションの構築に役立ちますが、最も便利な方法ではありません。 flatpak-builder
という名前の別のツールがあります これにより、JSON ファイルから Flatpak アプリケーションを構築できます。 (このツールについては、この記事の後半で説明します。) このツールは次の方法でインストールできます。
sudo dnf install flatpak-builder # Fedora sudo pacman -S flatpak-builder # Arch sudo apt install flatpak-builder # Ubuntu
ここで、アプリケーションまたはランタイムをインストールするには、Flatpak のリモート リストにリポジトリを追加する必要があります。これらのリモートは、ローカル ディレクトリまたはオンラインでホストできます。ランタイム/アプリケーションは、com.booleanworld.foo
のような逆 DNS アドレスを使用して識別されます .状況によっては、ランタイムのアーキテクチャと「ブランチ」も指定する必要がある場合があります。これは、com.booleanworld.foo/x86_64/1.3
のように、スラッシュで区切られたトリプレットを使用して行われます .
flatpak
コマンドは通常、すべてのユーザーのソフトウェアとリポジトリを追加します。ただし、これは試しには不向きなので、--user
を使用します。 そのような変更を現在のユーザーのみに制限するためのフラグ。
基本が整ったので、Flatpak アプリケーションの構築に関するいくつかの理論を見ていきます。
Flatpak アプリケーションの構造
アプリケーションを Flatpak にバンドルすると、次のディレクトリ構造が自動的に作成されます:
-
metadata
:このファイルには、アプリケーションが実行される SDK とランタイムに関する情報と、アプリケーションがアクセスする必要がある基本システム リソースのリストが含まれています。 -
files
:このディレクトリには、アプリケーション データなど、アプリケーションを構成するファイルが含まれています。bin
このサブディレクトリには、アプリケーションの実行可能ファイルが含まれています。 -
export
:このディレクトリには、基本システムがアクセスする必要があるすべてのファイルが含まれています。例には、AppStream データ、.desktop
が含まれます ファイルとアプリケーション アイコン。ここに配置するファイルには、識別子をプレフィックスとして付ける必要があります。たとえば、デスクトップ ファイルの名前はcom.booleanworld.foo.desktop
です。 .
この構造を手動で構築することもできますが、これは必須ではありません。 Flatpak には、この構造を自動的に作成するのに役立つツールがあり、典型的な autotools ベースのプロジェクトの場合、構成はほとんど必要ありません。非 autotools ベースのプロジェクトでは、通常、「プレフィックス」ディレクトリを /app
に設定する必要があります
前提条件
この記事の次のセクションでは、Flatpak アプリケーションを構築する例をいくつか紹介します。前述したように、アプリケーションを実行するにはランタイムとビルド プロセス用の SDK が必要です。したがって、最初のステップは、それらが利用可能なリポジトリを追加することです。使用するために、sdk.gnome.org で利用可能なリポジトリを追加します。
flatpak remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo --user
以下の例をビルドするには、2 つのランタイムが必要です:org.freedesktop.Platform
と org.gnome.Platform
、および 2 つの SDK:org.freedesktop.Sdk
と org.gnome.Sdk
.ここでは、Freedesktop および Gnome ランタイム/SDK のバージョン 1.6 および 3.24 を使用しました。
flatpak install --user gnome org.freedesktop.Platform/x86_64/1.6 org.freedesktop.Sdk/x86_64/1.6 org.gnome.Plaform/x86_64/3.24 org.gnome.Sdk/x86_64/3.24
次に、この記事を進めるために必要なすべてのリソースが含まれている flatpak-resources リポジトリを確認してください。
git clone https://github.com/boolean-world/flatpak-resources cd flatpak-resources
次のセクションでは、アプリケーションを構築する 2 つの例を見ていきます。
軽い「猫」である「子猫」を作る
このセクションでは、基本的な Flatpak アプリケーションを構築する方法を学びます。アプリケーションは cat
の小さなバージョンです kitten
という名前のコマンド .
まず、先ほど説明したディレクトリ構造を作成する必要があります。 build-init
コマンドでこれを行うことができます。ビルド ディレクトリ、アプリケーションの名前、使用する SDK とランタイムを (この順序で) 指定する必要があります。オプションで「支店名」を追加することもできますが、この例では省略します。
flatpak build-init kitten-build com.booleanworld.kitten org.freedesktop.Sdk org.freedesktop.Platform
前述したように、Flatpak アプリケーションのプレフィックス ディレクトリは /app
です。 、そして bin
を作成する必要があります その中のディレクトリ。ビルド ディレクトリ内でコマンドを実行する場合は、build
を使用します。 コマンド:
flatpak build kitten-build mkdir -p /app/bin
次のステップは、kitten.c
をコンパイルすることです。 gcc
で :
flatpak build kitten-build gcc kitten.c -o /app/bin/kitten
その後、build-finish
でビルドを完了できます。 .コマンドは kitten
になります 、ホストのファイルシステムにアクセスする必要があります (ホストシステム上の任意のファイルを表示できるようにするため)。したがって、これらのパラメーターを設定してビルドを完了することができます:
flatpak build-finish kitten-build --filesystem=host --command=kitten
ここで、アプリケーションをテストする場合は、インストールする必要があります。最初のステップは、アプリケーションをローカル リポジトリにエクスポートすることです。この例では、リポジトリ フォルダーは my-repo
です。 :
flatpak build-export my-repo kitten-build
次に、test-repo
という名前のリポジトリを追加します。 . GPG 署名を使用していないため、Flatpak に --no-gpg-verify
で知らせます。 切り替えます。
flatpak remote-add --user --no-gpg-verify test-repo my-repo
最後に、以下でインストールできます:
flatpak install --user test-repo com.booleanworld.kitten
これで、次のように実行して動作するかどうかをテストできます:
flatpak run com.booleanworld.kitten ~/.bashrc
これまでのすべての手順を正しく行っていれば、.bashrc
の内容が表示されます。 ファイル:
初めての Flatpak アプリの作成、おめでとうございます!
ここまでの手順はかなり単純でしたが、build-finish
コマンドについては、さらに議論する必要があります。これは、次のセクションで行うことです。
「build-finish」コマンドの詳細
Flatpak の主な目標の 1 つは、アプリケーションをサンドボックス化し、ホスト システムのリソースへの最小限のアクセスのみを提供することです。前の例では、「kitten」アプリが build-finish
でシステム上の任意のファイルにアクセスできるようにしました。 .さまざまなリソースへのアクセスを許可するために使用できるスイッチを以下に示します:
--filesystem={path}
このスイッチは、システム上の特定のパスへのアクセスを許可します。特定のパスを指定できます(/usr/share
など) )。 home
ユーザーのホームディレクトリ、および host
へのアクセスを許可します システム上のすべてのファイルへのアクセスを許可します。さらに、:ro
でパスを読み取り専用にすることもできます .例:--filesystem=/usr/share:ro --filesystem=home
/usr/share
への読み取り専用アクセスを許可します ユーザーのホーム ディレクトリへの読み書きアクセス。
--share={type}
このスイッチは、特定のリソースへのアクセスを許可します。最も一般的に使用されるタイプは ipc
です と network
、IPC およびネットワーク アクセスを許可します。ほとんどの GUI アプリケーションでは、--share=ipc
X 共有メモリが機能するために使用され、パフォーマンスが向上します。
--socket={type}
このスイッチを使用すると、特定のソケットを使用できます。最も一般的にアクセスされるソケット タイプは x11
です 、 wayland
と pulseaudio
.最初の 2 つはアプリケーションが GUI 要素をレンダリングするために使用され、後者は Pulseaudio デーモンを介してオーディオを再生するために使用されます。
--device={device}
これにより、アプリケーションは一部のデバイスに選択的にアクセスできます。ほとんどの場合、dri
ここでは、アプリケーションが OpenGL レンダリングを使用できるようにするために使用されます。
-
--talk-name={name}
および--system-talk-name={name}
これらのスイッチにより、アプリケーションは DBus のセッション バスとシステム バスを介して名前付きサービスと通信できます。
--env={varname}={value}
env
スイッチを使用すると、環境変数をエクスポートできます。 {varname}
指定された {value}
に設定される変数名です。 .
アプリケーションが dconf へのアクセスを必要とする場合は、次のスイッチを使用する必要があります:
--filesystem=xdg-run/dconf --filesystem=~/.config/dconf:ro --talk-name=ca.desrt.dconf --env=DCONF_USER_CONFIG_DIR=.config/dconf
これらのスイッチを含む実際の例については、後のセクションで説明します。
アプリケーションの自動ビルド:flatpak-builder
Flatpak アプリケーションの構築に必要な手順は非常に単純ですが、段階的に構築するのは依然として面倒です。 flatpak-builder
は、JSON マニフェストを使用してアプリケーションを宣言的に構築できるツールです。ソース コードが「ビルド API」に従って配置されている限り、ビルダーはソース アーカイブからアプリケーションをコンパイルおよびインストールできます。ほとんどの autotools ベースのソフトウェアは既に API に準拠しているため、通常はそれ以上の構成は必要ありません。
通常、典型的なマニフェスト ファイルは次のようになります:
{ "app-id": "com.booleanworld.kitten", "runtime": "org.freedesktop.Platform", "runtime-version": "1.6", "sdk": "org.freedesktop.Sdk", "command": "kitten", "finish-args": [ "--filesystem=host" ], "modules": [ { "name": "kitten", "sources": [ { "type": "archive", "url": "https://opensource.example.com/kitten-0.0.1.tar.gz", "sha256": "38ecfd39b76a2505376f5a57ebcc7b19d35efaf9f8c724a24382c45aa1378018" } ] } ] }
ご覧のとおり、このファイルには、以前にさまざまなコマンドで指定したものと同じ情報が含まれています。さらに、ビルドするモジュールのリストが含まれています。上記の例では、モジュールは 1 つだけです。複数のモジュールに依存する複雑なアプリケーションがある場合は、それらすべてをリストする必要があります。たとえば、gnome-calculator は mpc と mpfr に依存し、マニフェストは次のようになります。
さまざまなソース タイプがサポートされています。もう 1 つの一般的なソース タイプは git
です。 、リポジトリの URL と、必要に応じてチェックアウトする必要があるブランチを指定する必要があります。
マニフェストは非常に強力で、CFLAGS/CXXFLAGS の設定、エクスポート用のファイル名の変更、不要なファイルの削除をサポートしています。次のセクションでは、実用的なアプリケーションを分析し、それを Flatpak 用にパッケージ化する方法を学びます。
実際の例:galculator のパッケージ化
このセクションでは、単純な電卓アプリケーションである galculator を使用して、flatpak-builder
でビルドします。 .名前を変更または削除する必要があるファイルを見つけるために、少し分析を行う必要があります。したがって、最初のステップとして、テスト インストールを行います。次に、必要に応じてマニフェストを作成します。
galculator は GTK アプリケーションであるため、Gnome ランタイムと SDK を使用します。まだインストールしていない場合は、今すぐインストールしてください。さらに、ここからソース アーカイブをダウンロードする必要があります。 (この記事の執筆時点で最新バージョンであるバージョン 2.1.4 を使用しています。)
エクスポート/削除する必要があるファイルの検索
ソース アーカイブをダウンロードして解凍したら、SDK を使用してビルドしてみてください。 Gnome SDK には bash などのツールも含まれているため、以下を使用して起動できます。
flatpak run --command=bash --filesystem=host --devel org.gnome.Sdk/x86_64/3.24
次に、galculator のソース ディレクトリに移動し、通常の呪文を使用してビルドします。プレフィックス ディレクトリを ~/galculator-test
に設定します。 .
./configure --prefix=$HOME/galculator-test make install
これで、galculator-test
内のファイルを調べることができます ディレクトリ。お分かりのように、次のファイルをエクスポートする必要があります:
share/appdata/galculator.appdata.xml
の AppStream 情報share/icons
のアイコンshare/applications/galculator.desktop
のデスクトップ エントリ
残念ながら、アプリケーション名のプレフィックスは付けられていません。したがって、マニフェストで次のプロパティを使用して名前を変更する必要があります:
{ "rename-appdata-file": "galculator.appdata.xml", "rename-icon": "galculator", "rename-desktop-file": "galculator.desktop" }
これらのファイルの名前が変更されると、flatpak-builder
それらを自動的にエクスポートします。 Flatpak パッケージがビルドされると、ベース システムでメニュー エントリを作成するのに役立ちます。
さらに、share/man
そして share/pixmaps
ディレクトリは必要ないので、次のコマンドで削除できます:
{ "cleanup": [ "/share/man", "/share/pixmaps" ] }
サンドボックスの構成
これは GTK アプリケーションであるため、X11 と Wayland へのアクセスを許可し、IPC メカニズムを共有する必要があります。また、OpenGL レンダリングの使用を許可する必要があります。さらに、galculator は dconf にアクセスする必要があり、前述のエントリを追加する必要があります。 build-finish
に渡されるスイッチ finish-args
にリストされています マニフェストのプロパティ:
{ "finish-args": [ "--share=ipc", "--socket=x11", "--socket=wayland", "--device=dri", "--filesystem=xdg-run/dconf", "--filesystem=~/.config/dconf:ro", "--talk-name=ca.desrt.dconf", "--env=DCONF_USER_CONFIG_DIR=.config/dconf" ] }
マニフェストの完成
この時点で、マニフェストの重要な部分のほとんどが構成されています。残りの構成は非常に簡単です。最終的に使用したマニフェストはこちらです。 build-options
のセットを追加しました CFLAGS と CXXFLAGS を -O3
に設定します。 .
アプリケーションのビルドとテスト
最後に、アプリケーションをビルドできます。 flatpak-builder
を実行するだけです ビルド ディレクトリとマニフェストを使用します。この例では galculator
はビルドディレクトリで、org.mnim.galculator.json
マニフェスト ファイルです。
flatpak-builder galculator org.mnim.galculator.json
次に、以前と同様にリポジトリにエクスポートします:
flatpak build-export my-repo galculator
これで、アプリケーションをインストールしてテストできます:
flatpak install --user test-repo org.mnim.galculator
アプリケーションはすぐにインストールされ、通常のアプリケーションのようにデスクトップ エントリも取得できます。メニュー エントリから起動するか、flatpak run
で実行できます。
アプリケーションの配布
アプリケーションを構築したら、それをどのように配布しますか?これを行う最も簡単な方法は、リポジトリ ディレクトリをサーバーに転送し、Web 経由で提供することです。次に、ユーザーにリポジトリをリストに追加するように依頼し、その方法でアプリケーションをインストールできます。
多くの人は、GPG で署名されたソフトウェアをインストールすることを好みます。これは、アプリケーションが実際に元のメンテナーから提供されたものであることを証明するためです。 gpg2
で簡単に GPG キーを作成できます コマンド:
gpg2 --quick-key-gen [email protected]
キー ID は後で必要になるため、必ず書き留めておいてください。この例では、キー ID が A318C188C20D410A
であると仮定します .
build-export
を実行すると、GPG 署名付きリポジトリを作成できます。 そのように:
flatpak build-export my-repo galculator --gpg-sign=A318C188C20D410A
既存の未署名のリポジトリがある場合は、次のように署名できます:
flatpak build-sign my-repo --gpg-sign=A318C188C20D410A flatpak build-update-repo my-repo --gpg-sign=A318C188C20D410A
リポジトリを公開する場合は、必ず公開鍵のコピーをユーザーに提供してください。公開鍵をエクスポートするには、次を実行します:
gpg2 --export A318C188C20D410A > public.gpg
このキーを Web サイトで公開する必要があります。ユーザーがリポジトリを追加したい場合は、公開鍵をダウンロードする必要があります。ユーザーが public.gpg
という名前のキーをダウンロードした場合 、実行してリポジトリを追加できるようになりました:
flatpak remote-add --gpg-import=public.gpg test-repo https://software.example.com/repo/
ただし、この方法はユーザーにとって非常に不便です。幸いなことに、ドキュメントで詳しく説明されている flatpakref ファイルと flatpakrepo ファイルを作成することで、プロセスを簡素化できます。
結論
この記事では、Flatpak と、この新しいテクノロジを使用してソフトウェアを配布する方法について学びました。 AppImage などの従来の方法と比較して、よりセキュリティ指向であり、より優れた統合および更新機能を備えています。
このトピックについて詳しく知りたい場合は、開発者向けドキュメントと flatpak-manifest
man ページは、開始するのに適した場所です。マニフェスト/flatpakref ファイルのより複雑な例を読みたい場合は、Gnome-apps リポジトリと Flathub の例をご覧ください。