Flatpak は、Linux デスクトップ向けのソフトウェアデプロイメントおよびパッケージ管理を行うユーティリティソフトウェアです。Flatpak でインストールされたアプリケーションは、実行時にホスト環境から隔離(サンドボックス化)されます。
Flatpakは freedesktop.org のプロジェクトとして開始され。以前は xdg-app という名称でした。
はじめて Flatpak のパッケージをビルドする例として、GNU Hello World の CUI プログラムを扱います。
使用した OS は下記の通りです。
Fedora Silverblue 32 | x86_64 | |
Ubuntu 20.04 | x86_64 | |
CentOS 8 | x86_64 |
Fedora Silverblue は、OS 部分に rpm-ostree による immutable な(変更できない)イメージを、デスクトップアプリケーションには Flatpak パッケージを採用しています。
説明は Fedora Siliverblue の環境で進めますが、Ubuntu と CentOS の場合についても動作確認をしています。
Flatpak の基本的な考え方
※ Basic concepts — Flatpak documentation を日本語にしました。まだ直訳調ですが、こなれた訳になるよう、随時改善していきます。
Flatpak は、いくつかの重要な概念を通して理解することができます。コマンドラインから Flatpak の使い方を学んだり、アプリケーションを構築するために Flatpak を使う前に、これらの概念を知っておくと便利です。
ランタイム
ランタイムは、アプリケーションが使用する基本的な依存関係を提供します。
各アプリケーションはランタイムに対してビルドされなければならず、アプリケーションを実行するためには、このランタイムがホストシステムにインストールされていなければなりません。
Flatpak は、アプリケーションが必要とするランタイムを自動的にインストールすることができます。複数の異なるランタイムを同時にインストールすることができ、同じランタイムの異なるバージョンを含むこともできます。
ランタイムはディストリビューションに依存せず、特定のディストリビューションのバージョンに依存しません。これは、ランタイムがアプリケーションに安定したクロスディストリビューションベースを提供し、オペレーティングシステムのアップデートに関係なくアプリケーションが動作し続けることを可能にすることを意味します。
バンドルライブラリ
アプリケーションがランタイムにない依存関係を必要とする場合、それらをアプリケーションの一部としてバンドルすることができます。これにより、アプリケーション開発者は、使用する依存関係について柔軟に対応することができます。
- ランタイムで利用できないライブラリ
- ランタイムにあるライブラリとは異なるバージョンのライブラリ
- ライブラリのパッチ版
サンドボックス
Flatpakでは、各アプリケーションは「サンドボックス」と呼ばれる隔離された環境でビルドされ、実行されます。各サンドボックスにはアプリケーションとそのランタイムが含まれています。
デフォルトでは、アプリケーションはサンドボックスの内容にのみアクセスできます。ユーザーファイル、ネットワーク、グラフィックソケット、バス上のサブシステム、デバイスへのアクセスは、明示的に許可されなければなりません。他のプロセスのような他のものへのアクセスは、意図的に不可能です。
必要に応じて、サンドボックス内にあるいくつかのリソースは、ホストシステムが使用するために外部に公開する必要があります。これらは「エクスポート」として知られています。これは、サンドボックスからエクスポートされるファイルで、アプリケーションの .desktop ファイルやアイコンのようなものが含まれます。
ポータル
ポータルは、アプリケーションがサンドボックス内からホスト環境と対話するためのメカニズムです。これにより、サンドボックスのパーミッションを追加することなく、データ、ファイル、サービスと対話することができます。
ポータルからアクセスできる機能の例としては、ファイル選択ダイアログからファイルを開いたり、印刷したりすることが挙げられます。インターフェイスツールキットはポータルの透過的なサポートを実装することができるので、サンドボックス外のリソースへのアクセスは安全に、そして箱から出してすぐに動作します。
リポジトリ
Flatpak のアプリケーションやランタイムは通常、リポジトリを使って保存・公開されますが、これは Git リポジトリと非常によく似ています。Flatpak のリポジトリには、単一のオブジェクトや複数のオブジェクトを格納することができ、各オブジェクトはバージョン管理されているため、アップグレードやダウングレードも可能です。
Flatpak を使用している各システムは、任意の数のリモートリポジトリにアクセスできるように設定することができます。システムが「リモート」にアクセスするように設定されると、リモートリポジトリの内容を検査したり検索したりすることができ、アプリケーションやランタイムのソースとして使用することができます。
アップデートが実行されると、インストールされているアプリケーションやランタイムの新バージョンが関連するリモートからダウンロードされます。Git と同様、バージョン間の差分のみがダウンロードされるため、非常に効率的な処理が可能です。
準備
準備として、Flatpak パッケージを扱える環境と、Flatpak パッケージを作成(ビルド)できる環境を整えます。
Flatpak 関連パッケージのインストール
Flatpak のパッケージを作成するには、パッケージを扱う flatpak と、パッケージをビルドする flatpak-builder が必要となります。
Fedora Silverstone
Fedora Silverblue ではどちらもデフォルトでインストールされています。
[bitwalk@silverblue ~]$ rpm -qa | grep flatpak flatpak-builder-1.0.10-1.fc32.x86_64 flatpak-libs-1.6.5-1.fc32.x86_64 flatpak-session-helper-1.6.5-1.fc32.x86_64 flatpak-selinux-1.6.5-1.fc32.noarch flatpak-1.6.5-1.fc32.x86_64 [bitwalk@silverblue ~]$
Ubuntu
Ubuntu では Canonical 社が開発、推進している Snap という類似技術がデフォルトで採用されています。
bitwalk@ubuntu-pc:~$ dpkg -l | grep snap ii chromium-codecs-ffmpeg-extra 1:85.0.4183.83-0ubuntu0.20.04.1 amd64 Transitional package - chromium-codecs-ffmpeg-extra -> chromium-ffmpeg snap ii gir1.2-snapd-1:amd64 1.57-0ubuntu3 amd64 Typelib file for libsnapd-glib1 ii libsnapd-glib1:amd64 1.57-0ubuntu3 amd64 GLib snapd library ii libsnappy1v5:amd64 1.1.8-1build1 amd64 fast compression/decompression library ii snapd 2.45.1+20.04.2 amd64 Daemon and tooling that enable snap packages bitwalk@ubuntu-pc:~$
幸い、Flatpak も併せて利用することができます。
bitwalk@ubuntu-pc:~$ sudo apt search flatpak ソート中... 完了 全文検索... 完了 flatpak/focal-updates 1.6.5-0ubuntu0.1 amd64 Application deployment framework for desktop apps flatpak-builder/focal 1.0.10-1 amd64 Flatpak application building helper ...
flatpak と flatpak-builder をインストールします。
bitwalk@ubuntu-pc:~$ sudo apt install flatpak flatpak-builder パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: elfutils gir1.2-flatpak-1.0 libappstream-glib8 libasm1 libflatpak0 libostree-1-1 ostree 提案パッケージ: brz p7zip-full subversion 以下のパッケージが新たにインストールされます: elfutils flatpak flatpak-builder gir1.2-flatpak-1.0 libappstream-glib8 libasm1 libflatpak0 libostree-1-1 ostree アップグレード: 0 個、新規インストール: 9 個、削除: 0 個、保留: 0 個。 2,362 kB のアーカイブを取得する必要があります。 この操作後に追加で 9,983 kB のディスク容量が消費されます。 続行しますか? [Y/n] y 取得:1 http://jp.archive.ubuntu.com/ubuntu focal/main amd64 libasm1 amd64 0.176-1.1build1 [14.2 kB] ... (以下省略) ... bitwalk@ubuntu-pc:~$
Flatpak のアプリを GUI でインストールできるように GNOME Software のプラグインパッケージもインストールしておきます。
bitwalk@ubuntu-pc:~$ sudo apt install gnome-software-plugin-flatpak
CentOS
CentOS 8 では、デスクトップ環境を使っている場合は flatpak のみインストールされています。
[bitwalk@centos-pc ~]$ rpm -qa | grep flatpak flatpak-1.6.2-3.el8_2.x86_64 flatpak-session-helper-1.6.2-3.el8_2.x86_64 flatpak-libs-1.6.2-3.el8_2.x86_64 flatpak-selinux-1.6.2-3.el8_2.noarch [bitwalk@centos-pc ~]$
flatpak-builder をインストールします。
[bitwalk@centos-pc ~]$ sudo dnf install flatpak-builder [sudo] bitwalk のパスワード: メタデータの期限切れの最終確認: 0:47:05 時間前の 2020年09月13日 10時30分20秒 に実施しました。 依存関係が解決しました。 ==================================================================================================================================== パッケージ アーキテクチャー バージョン リポジトリー サイズ ==================================================================================================================================== インストール中: flatpak-builder x86_64 1.0.9-2.el8 AppStream 213 k 依存関係のインストール中: libserf x86_64 1.3.9-8.module_el8.0.0+45+75bba4f4 AppStream 60 k subversion-libs x86_64 1.10.2-1.module_el8.0.0+45+75bba4f4 AppStream 1.5 M utf8proc x86_64 2.1.1-4.module_el8.0.0+45+75bba4f4 AppStream 67 k 弱い依存関係のインストール中: subversion x86_64 1.10.2-1.module_el8.0.0+45+75bba4f4 AppStream 1.1 M モジュールストリームの有効化中: subversion 1.10 トランザクションの概要 ==================================================================================================================================== インストール 5 パッケージ ダウンロードサイズの合計: 3.0 M インストール済みのサイズ: 11 M これでよろしいですか? [y/N]: y パッケージのダウンロード: (1/5): libserf-1.3.9-8.module_el8.0.0+45+75bba4f4.x86_64.rpm 694 kB/s | 60 kB 00:00 ... (以下省略) ... Installed products updated. インストール済み: flatpak-builder-1.0.9-2.el8.x86_64 libserf-1.3.9-8.module_el8.0.0+45+75bba4f4.x86_64 subversion-1.10.2-1.module_el8.0.0+45+75bba4f4.x86_64 subversion-libs-1.10.2-1.module_el8.0.0+45+75bba4f4.x86_64 utf8proc-2.1.1-4.module_el8.0.0+45+75bba4f4.x86_64 完了しました! [bitwalk@centos-pc ~]$
Flathub リポジトリの追加
Flatpak パッケージをビルドするには、Flatpak の SDK を使用します。ここでは Flathub から入手できる SDK を利用するため、Flathub のレポジトリを登録します。
[bitwalk@silverblue ~]$ sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo [sudo] bitwalk のパスワード: [bitwalk@silverblue ~]$ flatpak remotes Name Options fedora system,oci flathub system
上記は Fedora Silverblue 上での例ですが、 flatpak コマンドを使う限り、Ubuntu あるいは CentOS でも同じ操作になります。ただし、登録されているれリポジトリは、今回が初めてであれば flathub だけです。
Ubuntu
bitwalk@ubuntu-pc:~$ flatpak remotes Name Options flathub system bitwalk@ubuntu-pc:~$
ランタイムと、対応する SDK をインストール
Flatpak は、アプリが依存する基本的なライブラリにアクセスするためにランタイムを使用します。また、Flatpak パッケージをビルドするために、ビルドに必要なヘッダと開発ツールが含まれている SDK, Software Development Kit が必要となります。
必要な SDK はビルドするアプリケーションに依存しますが、ここでは、Freedesktop のランタイム (Freedesktop Platform) と SDK (Freedesktop SDK) を使用します。
Name | Description | Application ID |
---|---|---|
Freedesktop Platform | Shared libraries | org.freedesktop.Platform |
Freedesktop SDK | Tools and headers for developing applications | org.freedesktop.Sdk |
まず、Freedesktop Platform をインストールします。バージョンは 20.08 とします。
[bitwalk@silverblue ~]$ sudo flatpak install flathub org.freedesktop.Platform
[sudo] bitwalk のパスワード:
Looking for matches…
Similar refs found for ‘org.freedesktop.Platform’ in remote ‘flathub’ (system):
1) runtime/org.freedesktop.Platform/x86_64/1.6
2) runtime/org.freedesktop.Platform/x86_64/20.08
3) runtime/org.freedesktop.Platform/x86_64/18.08
4) runtime/org.freedesktop.Platform/x86_64/19.08
Which do you want to use (0 to abort)? [0-4]: 2
ID Branch Op Remote Download
1. [✓] org.freedesktop.Platform.GL.default 20.08 i flathub 42.1 MB / 42.3 MB
2. [✓] org.freedesktop.Platform.Locale 20.08 i flathub 1.6 MB / 321.8 MB
3. [✓] org.freedesktop.Platform.VAAPI.Intel 20.08 i flathub 11.1 MB / 11.2 MB
4. [✓] org.freedesktop.Platform.openh264 2.0 i flathub 1.5 MB / 1.5 MB
5. [✓] org.freedesktop.Platform 20.08 i flathub 218.5 MB / 266.1 MB
Installation complete.
[bitwalk@silverblue ~]$
つづけて Freedesktop 20.08 の SDK, org.freedesktop.Sdk をインストールします。
[bitwalk@silverblue ~]$ flatpak install flathub org.freedesktop.Sdk
Looking for matches…
Similar refs found for ‘org.freedesktop.Sdk’ in remote ‘flathub’ (system):
1) runtime/org.freedesktop.Sdk/x86_64/20.08
2) runtime/org.freedesktop.Sdk/x86_64/19.08
3) runtime/org.freedesktop.Sdk/x86_64/18.08
4) runtime/org.freedesktop.Sdk/x86_64/1.6
Which do you want to use (0 to abort)? [0-4]: 1
ID Branch Op Remote Download
1. [✓] org.freedesktop.Sdk.Locale 20.08 i flathub 69.9 kB / 326.1 MB
2. [✓] org.freedesktop.Sdk 20.08 i flathub 350.9 MB / 566.5 MB
Installation complete.
[bitwalk@silverblue ~]$
念の為 flatpak list コマンドで、インストールされていることを確認します。
[bitwalk@silverblue ~]$ flatpak list Name Application ID Version Branch Origin Installation Platform org.fedoraproject.Platform f32 fedora system Freedesktop Platform org.freedesktop.Platform 20.08.0 20.08 flathub system default org.freedesktop.Platform.GL.default 20.08 flathub system Intel org.freedesktop.Platform.VAAPI.Intel 20.08 flathub system openh264 org.freedesktop.Platform.openh264 2.1.0 2.0 flathub system Freedesktop SDK org.freedesktop.Sdk 20.08.0 20.08 flathub system Baobab org.gnome.Baobab stable fedora system GNOME 電卓 org.gnome.Calculator 3.36.0 stable fedora system ... (途中省略) ... [bitwalk@silverblue ~]$
念の為、Ubuntu の場合を示しました。
Ubuntu
bitwalk@ubuntu-pc:~$ flatpak list Name Application ID Version Branch Installation Freedesktop Platform org.freedesktop.Platform 20.08.0 20.08 system default org.freedesktop.Platform.GL.default 20.08 system Intel org.freedesktop.Platform.VAAPI.Intel 20.08 system openh264 org.freedesktop.Platform.openh264 2.1.0 2.0 system Freedesktop SDK org.freedesktop.Sdk 20.08.0 20.08 system bitwalk@ubuntu-pc:~$
Hello World プログラム
今回は GNU Project のサイトで公開されている hello world のプログラムを扱います [1]。
以下の作業は、あらかじめ準備しておいたプロジェクトフォルダ, $HOME/プロジェクト/org.gnu.Hello 内で行うことにします。
[bitwalk@silverblue ~]$ cd $HOME/プロジェクト/org.gnu.Hello
[bitwalk@silverblue hello_flatpak]$
マニフェスト
Flatpak のアプリをビルドするには、YAML 形式あるいは JSON 形式のマニフェストファイルにビルドに関する情報を記述します。
今回の Hello World プログラムをビルドするためのマニフェストファイルは以下のとおりです。
id: org.gnu.Hello runtime: org.freedesktop.Platform runtime-version: '20.08' sdk: org.freedesktop.Sdk command: hello modules: - name: hello buildsystem: autotools no-autogen: true sources: - type: archive url: https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz sha256: 31e066137a962676e89f69d1b65382de95a7ef7d914b8cb956f41ea72e0f516b
このプログラムは GNU Autotools でビルドするプログラムですので、modules リストにある buildsystem フィールドに autotools を指定しています。他に cmake, meson, qmake などを指定できます。
ソースはビルド時に公開されているサイトからダウンロードします。ダウンロードするファイルのチェックサム(ハッシュ値)が必要だったので、あらかじめダウンロードして sha256sum で調べました。
[bitwalk@fedora-pc ダウンロード]$ sha256sum hello-2.10.tar.gz
31e066137a962676e89f69d1b65382de95a7ef7d914b8cb956f41ea72e0f516b hello-2.10.tar.gz
[bitwalk@fedora-pc ダウンロード]$
ビルド
次のようにアプリをビルドします。
[bitwalk@silverblue org.gnu.Hello]$ flatpak-builder build-dir org.gnu.Hello.yaml
Downloading sources
Downloading https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 708k 100 708k 0 0 419k 0 0:00:01 0:00:01 --:--:-- 419k
Initializing build dir
Committing stage init to cache
Starting build of org.gnu.Hello
========================================================================
Building module hello in /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/build/hello-1
========================================================================
checking for a BSD-compatible install... /usr/bin/install -c
...
(途中省略)
...
make[1]: Leaving directory '/run/build/hello'
compressing debuginfo in: /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-2ZGiis/files/bin/hello
processing: /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-2ZGiis/files/bin/hello
[30] .debug_aranges compressed -> .zdebug_aranges (752 => 216 28.72%)
[31] .debug_info compressed -> .zdebug_info (30938 => 15818 51.13%)
[32] .debug_abbrev compressed -> .zdebug_abbrev (5280 => 1345 25.47%)
[33] .debug_line compressed -> .zdebug_line (12216 => 5368 43.94%)
[34] .debug_str compressed -> .zdebug_str (11700 => 3649 31.19%)
[35] .debug_loc compressed -> .zdebug_loc (40517 => 6932 17.11%)
[36] .debug_ranges compressed -> .zdebug_ranges (6784 => 1138 16.77%)
[39] Updating section string table
stripping /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-2ZGiis/files/bin/hello to /var/home/bitwalk/プロジェクト/org.gnu.Hello/.flatpak-builder/rofiles/rofiles-2ZGiis/files/lib/debug/bin/hello.debug
Committing stage build-hello to cache
Cleaning up
Committing stage cleanup to cache
Finishing app
Please review the exported files and the metadata
Committing stage finish to cache
Pruning cache
[bitwalk@silverblue org.gnu.Hello]$
使用している Fedora Silverblue の OS 環境は、ソフトウェア開発のパッケージがインストールされていませんので、端末エミュレータ上で gcc などのコマンドを利用できません。そういうわけで、確かに SDK を利用してビルドしていることが解ります。
動作確認
次のように build-dir を指定して、直接、動作確認します。
[bitwalk@silverblue org.gnu.Hello]$ flatpak-builder --run build-dir org.gnu.Hello.yaml hello Hello, world! [bitwalk@silverblue org.gnu.Hello]$
ローカル・リポジトリに出力
ローカルのリポジトリを $HOME/repo として、出力先にこのリポジトリを指定して再コンパイルします。
[bitwalk@silverblue org.gnu.Hello]$ flatpak-builder --repo=$HOME/repo --force-clean build-dir org.gnu.Hello.yaml
Emptying app dir 'build-dir'
Downloading sources
Starting build of org.gnu.Hello
...
(途中省略)
...
Content Total: 20
Content Written: 20
Content Bytes Written: 155556 (155.6 kB)
Pruning cache
[bitwalk@silverblue org.gnu.Hello]$
ローカル・リポジトリを登録
Flatpak に登録されているリモートリポジトリは以下のようになっています。
[bitwalk@silverblue org.gnu.Hello]$ flatpak remotes
Name Options
fedora system,oci
flathub system
ローカル・リポジトリ $HOME/repo を、Flatpak のリモート・リポジトリに bitwalk という名前で登録します。
[bitwalk@silverblue org.gnu.Hello]$ flatpak --user remote-add --no-gpg-verify bitwalk $HOME/repo [bitwalk@silverblue org.gnu.Hello]$ flatpak remotes Name Options fedora system,oci flathub system bitwalk user,no-gpg-verify [bitwalk@silverblue org.gnu.Hello]$
ちなみに Ubuntu でも同じです。
Ubuntu
bitwalk@ubuntu-pc:~/プロジェクト/org.gnu.Hello$ flatpak remotes
Name Options
flathub system
bitwalk user,no-gpg-verify
bitwalk@ubuntu-pc:~/プロジェクト/org.gnu.Hello$
アプリのデプロイ(インストール)と実行結果
ビルドした org.gnu.Hello をインストール(デプロイ)します。
[bitwalk@silverblue org.gnu.Hello]$ flatpak --user install bitwalk org.gnu.Hello Looking for matches… ID Branch Op Remote Download 1. [✓] org.gnu.Hello.Locale master i bitwalk 1.0 kB / 52.9 kB 2. [✓] org.gnu.Hello master i bitwalk 1.0 kB / 25.2 kB Installation complete. [bitwalk@silverblue org.gnu.Hello]$
デプロイしたパッケージの一覧を表示します。パッケージは system と user の領域に区別され、user 領域にインストールされた Flatpak パッケージのみ一覧を表示するには --user を付けます。
[bitwalk@silverblue org.gnu.Hello]$ flatpak list --user
Name Application ID Version Branch
Hello org.gnu.Hello master
[bitwalk@silverblue org.gnu.Hello]$
実行してみるとビックリです。メッセージがローカライズされています。
[bitwalk@silverblue org.gnu.Hello]$ flatpak run org.gnu.Hello 世界よ、こんにちは! [bitwalk@silverblue org.gnu.Hello]$
世界よ、ですか、なるほど…。🤔
以上、パッケージのビルドは Fedora Silverblue で説明しましたが、Ubuntu、CentOS でも同じようにビルでできることを確認しています。
参考サイト
- Hello - GNU Project - Free Software Foundation
- Welcome to Flatpak’s documentation! — Flatpak documentation
にほんブログ村
0 件のコメント:
コメントを投稿