GNU/Linux >> Linux の 問題 >  >> Ubuntu

Flatpak を使用したクロスディストリビューション Linux アプリケーションの構築

フラグメンテーションは、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.Platformorg.gnome.Platform 、および 2 つの SDK:org.freedesktop.Sdkorg.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 です 、 waylandpulseaudio .最初の 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 の例をご覧ください。


Ubuntu
  1. Linux上のFlatpak:それは何であり、それを使ってアプリをインストールする方法

  2. Linux で起動アプリケーションを遅延して起動する方法

  3. Xamarin で Linux アプリケーションを開発できますか?

  1. Flatpakを使用してLinuxにアプリをインストールする

  2. LVMを使用してLinuxをインストールする

  3. Linuxでduをdustに置き換えます

  1. Linuxに最適な写真アプリケーション

  2. 例を含むLinuxソースコマンド

  3. 例を含むwcLinuxコマンド