Flatpak
関連記事
プロジェクトの README より:
- Flatpak は Linux 上でサンドボックス化したデスクトップアプリケーションをビルド・配布・実行するためのシステムです。
flatpak(1) より:
- Flatpak はアプリケーションやランタイムを管理するためのツールです。Flatpak モデルでは、アプリケーションをホスト環境とは独立してビルド・配布することができます。アプリケーションは実行時にホスト環境から隔離 (サンドボックス化) されます。
- Flatpak は OSTree を使用してデータを配布・デプロイします。Flatpak のリポジトリは OSTree のリポジトリであり、ostree ユーティリティによって操作することが可能です。ランタイムやアプリケーションのインストールは OSTree のチェックアウトと同じです。
目次
- 1 インストール
- 2 リポジトリの管理
- 3 ランタイムとアプリケーションの管理
- 3.1 リモートのランタイムやアプリケーションの検索
- 3.2 利用可能なランタイムとアプリケーションの確認
- 3.3 ランタイムやアプリケーションのインストール
- 3.4 インストールされたランタイムやアプリケーションの確認
- 3.5 アプリケーションの実行
- 3.6 ランタイムやアプリケーションのアップデート
- 3.7 ランタイムやアプリケーションのアンインストール
- 3.8 ランタイムまたはアプリケーションをダウングレードする
- 3.9 ランタイムまたはアプリケーションの更新を防止する
- 3.10 Flatpak の .desktop ファイルをメニューに追加
- 3.11 アプリケーションのサンドボックス権限を表示する
- 3.12 サンドボックスでのアプリケーションの権限を上書き
- 4 カスタムベースランタイムの作成
- 5 トラブルシューティング
- 6 参照
インストール
デスクトップとの統合
flatpak アプリケーションがデスクトップと対話するためには、xdg-desktop-portal を必ずセットアップしてください。デスクトップの実装によっては、アプリケーションがいくつかのポータルにアクセスする前に確認ダイアログが表示されます。
リポジトリの管理
リポジトリの追加
リモートの flatpak リポジトリを追加するには次のコマンドを実行:
$ flatpak remote-add name location
name は新しいリモートリポジトリの名前、location はリポジトリのパスあるいは URL に置き換えてください。
例えば公式の Flathub リポジトリ を追加するには:
$ flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
リポジトリの削除
リモートの flatpak リポジトリを削除するには次のコマンドを実行:
$ flatpak remote-delete name
name は削除したいリモートリポジトリの名前に置き換えてください。
リポジトリの一覧表示
追加されたすべてのリポジトリの一覧を表示するには、次のようにします。
$ flatpak remotes
ランタイムとアプリケーションの管理
リモートのランタイムやアプリケーションの検索
新しく追加したリモートリポジトリのランタイムやアプリケーションを検索するには、リポジトリの appstream データを取得する必要があります:
$ flatpak update
Looking for updates... Updating appstream data for remote name
取得したら flatpak search packagename
でパッケージを検索できます。例えば flathub
リポジトリの libreoffice
パッケージを探すには:
$ flatpak search libreoffice
Application ID Version Branch Remotes Description org.libreoffice.LibreOffice stable flathub The LibreOffice productivity suite
利用可能なランタイムとアプリケーションの確認
remote という名前のリモートリポジトリに存在するランタイムとアプリケーションを確認するには次を実行:
$ flatpak remote-ls remote
ランタイムやアプリケーションのインストール
ランタイムやアプリケーションをインストールするには次を実行:
$ flatpak install remote name
remote はリモートリポジトリの名前に、name はインストールしたいアプリケーションやランタイムの名前に置き換えてください。
インストールされたランタイムやアプリケーションの確認
インストールされたランタイムやアプリケーションを確認するには次を実行:
$ flatpak list
アプリケーションの実行
Flatpak アプリケーションはコマンドラインから起動することもできます:
$ flatpak run name
ランタイムやアプリケーションのアップデート
name という名前のランタイムあるいはアプリケーションをアップデートするには次を実行:
$ flatpak update name
systemd による自動アップデート
システムのランタイムやアプリケーションを自動的に更新するには、以下のファイルを作成します。
/etc/systemd/system/flatpak-update.service
[Unit] Description=Update Flatpak After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/bin/flatpak update --noninteractive --assumeyes AmbientCapabilities= CapabilityBoundingSet=CAP_SYS_ADMIN CAP_NET_ADMIN DevicePolicy=closed InaccessibleDirectories=/home LockPersonality=true MemoryDenyWriteExecute=true NoNewPrivileges=true PrivateDevices=true PrivateIPC=true PrivateTmp=true PrivateUsers=true ProcSubset=all ProtectClock=true ProtectControlGroups=true ProtectHostname=true ProtectKernelLogs=true ProtectKernelModules=true ProtectKernelTunables=true ProtectProc=invisible ProtectSystem=strict ReadOnlyDirectories=/ ReadWriteDirectories=/var/lib/flatpak/ ReadWriteDirectories=/root/.local/share/flatpak/ RemoveIPC=true RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX RestrictRealtime=true RestrictSUIDSGID=true SystemCallArchitectures=native SystemCallFilter=~@clock SystemCallFilter=~@debug SystemCallFilter=~@module SystemCallFilter=~@raw-io SystemCallFilter=~@reboot SystemCallFilter=~@swap SystemCallFilter=~@cpu-emulation SystemCallFilter=~@obsolete UMask=0077 [Install] WantedBy=multi-user.target
/etc/systemd/system/flatpak-update.timer
[Unit] Description=Update Flatpak [Timer] OnBootSec=2m OnActiveSec=2m OnUnitInactiveSec=24h OnUnitActiveSec=24h AccuracySec=1h RandomizedDelaySec=10m [Install] WantedBy=timers.target
systemdのタイマーを有効にするために、実行します。
$ systemctl enable --now flatpak-update.timer
ランタイムやアプリケーションのアンインストール
name という名前のランタイムあるいはアプリケーションをアンインストールするには次を実行:
$ flatpak uninstall name
ランタイムまたはアプリケーションをダウングレードする
ランタイムやアプリケーションをダウングレードするには、まず、関連するコミット ID を探します。
$ flatpak remote-info --log remote name
ここで、remote はリポジトリ (flathub など)、name はアプリケーションまたはランタイムの名前です。そして、コミットをデプロイします。
$ flatpak update --commit=commit name
ここで、commit は希望するバージョンのコミット、 ``name`` は前回と同じです。
この手順は、パッケージを最新版でない希望のバージョンに選択的にアップグレードするのにも使えます。
このパッケージのアップデートを flatpak update
から除外するには、ランタイムまたはアプリケーションの更新を防止する を参照してください。
ランタイムまたはアプリケーションの更新を防止する
ランタイムまたはアプリケーションへの自動および手動更新を防止するには、flatpak mask
コマンドを使用します。
$ flatpak mask name
これにより、選択的なアップグレードとダウングレードも防止されます。
マスクを元に戻し、更新を再度有効にするには、flatpak mask --remove
を使用します。
$ flatpak mask --remove name
Flatpak の .desktop ファイルをメニューに追加
Flatpak ではウィンドウマネージャが XDG_DATA_DIRS 環境変数を参照してアプリケーションを見つけるようになっています。セッションを再起動する必要があったり、ランチャーによっては環境変数がサポートされていない場合があります。スキャンされるディレクトリのリストを編集出来る場合、以下を追加してください:
~/.local/share/flatpak/exports/share/applications /var/lib/flatpak/exports/share/applications
上記の設定で Awesome から Flatpak アプリが起動できるようになります。
アプリケーションのサンドボックス権限を表示する
Flatpak のアプリケーションには、あらかじめサンドボックスのルールが設定されており、アプリケーションがアクセスできるリソースやファイルシステムのパスが定義されています。 特定のアプリケーションのアクセス権を表示するには、次のようにします。
$ flatpak info --show-permissions name
サンドボックスのパーミッション名のリファレンスは、オフィシャル flatpak ドキュメント にあります。
サンドボックスでのアプリケーションの権限を上書き
既定のアプリケーションの権限が寛容すぎたり厳しすぎる場合は、flatpak override
コマンドを利用して権限を書き換えられます。
例:
flatpak override --nofilesystem=home name
これにより、アプリケーションがホームディレクトリへアクセスできなくなります。
デバイス、ファイルシステム、ソケットといった権限の種別ごとに、コマンドラインオプションで特定の権限を許可や拒否することができます。例えば、--device=device_name
とすると特定のデバイスへのアクセスを許可し、一方 --nodevice=device_name
とすると特定のデバイスへのアクセス権限を拒否します。
すべての設定については、マニュアルページを参照してください: flatpak-override(1)
次のコマンドを実行すると、上書きした設定をリセットし既定の権限に戻せます:
$ flatpak override --reset name
カスタムベースランタイムの作成
pacman を使うことで Flatpak 用に Arch ベースのカスタムランタイムやベース SDK を作成することができます。カスタムランタイムを使用してアプリケーションをビルドしたりパッケージ化することが可能です。デフォルトの org.freedesktop.BasePlatform
や org.freedesktop.BaseSdk
ランタイムを使用する代わりとなります。
flatpak だけでなく、fakeroot のインストールが必要です。また、pacman フックを使うには fakechroot も必要です。
まずは、ランタイムやアプリケーションをビルドするためのディレクトリを作成してください:
$ mkdir myflatpakbuilddir $ cd myflatpakbuilddir
次にランタイムベースプラットフォームをビルドするためのディレクトリを用意します。シンボリックリンクを作成して Arch からデフォルトの /usr/share
などにアクセスできるようにしてください:
$ mkdir -p myruntime/files/var/lib/pacman $ touch myruntime/files/.ref $ ln -s /usr/usr/share myruntime/files/share $ ln -s /usr/usr/include myruntime/files/include $ ln -s /usr/usr/local myruntime/files/local
Arch ランタイムから OS のフォントを利用できるようにするには:
$ mkdir -p myruntime/files/usr/share/fonts $ ln -s /run/host/fonts myruntime/files/usr/share/fonts/flatpakhostfonts
ランタイムにパッケージをインストールする前に pacman.conf
を編集する必要があります。/etc/pacman.conf
をビルドディレクトリにコピーして以下の変更を行ってください:
CheckSpace
オプションを削除して pacman によってルートファイルシステムに関するエラーが表示されないようにしてください。- 不必要なカスタムリポジトリを削除してください。必要なのは
IgnorePkg
,IgnoreGroup
,NoUpgrade
,NoExtract
の設定だけです。
それからランタイムにパッケージをインストールします:
$ fakechroot fakeroot pacman -Syu --root myruntime/files --dbpath myruntime/files/var/lib/pacman --config pacman.conf base $ mv pacman.conf myruntime/files/etc/pacman.conf
myruntime/files/etc/locale.gen
を編集して使用するロケールを設定してください。その後ランタイムのロケールを再生成:
$ fakechroot chroot myruntime/files locale-gen
パッケージをビルドしたり pacman を実行するのに必要なアプリケーションを追加することでベースランタイムからベース SDK を作成できます:
$ cp -r myruntime mysdk $ fakechroot fakeroot pacman -S --root mysdk/files --dbpath mysdk/files/var/lib/pacman --config mysdk/files/etc/pacman.conf base-devel fakeroot fakechroot --needed
ランタイムと SDK についてのメタデータを追加:
myruntime/metadata
[Runtime] name=org.mydomain.BasePlatform runtime=org.mydomain.BasePlatform/x86_64/2016-06-26 sdk=org.mydomain.BaseSdk/x86_64/2016-06-26
mysdk/metadata
[Runtime] name=org.mydomain.BaseSdk runtime=org.mydomain.BasePlatform/x86_64/2016-06-26 sdk=org.mydomain.BaseSdk/x86_64/2016-06-26
カレントディレクトリのローカルリポジトリにベースランタイムと SDK を追加してください。“My Arch base runtime” や “My Arch base SDK” などの適当なコミットメッセージを使用すると良いでしょう。
$ ostree init --mode archive-z2 --repo=. $ EDITOR="nano -w" ostree commit -b runtime/org.mydomain.BasePlatform/x86_64/2016-06-26 --tree=dir=myruntime $ EDITOR="nano -w" ostree commit -b runtime/org.mydomain.BaseSdk/x86_64/2016-06-26 --tree=dir=mysdk $ ostree summary -u
ランタイムと SDK をインストール:
$ flatpak remote-add --user --no-gpg-verify myarchos file://$(pwd) $ flatpak install --user myarchos org.mydomain.BasePlatform 2016-06-26 $ flatpak install --user myarchos org.mydomain.BaseSdk 2016-06-26
pacman でアプリを作成
通常の方法 でアプリケーションをビルドする代わりに、pacman を使って通常の Arch パッケージのコンテナを作成することができます。アプリを作成するとき /usr
は読み込み専用であるため、アプリをビルドするときに Arch のパッケージを使うことはできません。pacman でアプリを作成する場合:
- pacman を使って依存パッケージを全て含んだランタイムを作成する。
- 通常の方法 でアプリをコンパイルするか、
configure
スクリプトで--prefix=/app
を使用するように Flatpak 向けにカスタマイズした PKGBUILD を使う。
あるいは:
- pacman を使って pacman でインストールしたアプリを含むランタイムを作成する
- アプリを起動するためのダミーアプリを作成する。
後者の場合、まずは以下のように pacman を使ってランタイムを作成します (例として gedit をコンテナ化)。ランタイムは pacman を使って初期化・準備します。
$ flatpak build-init -w geditruntime org.mydomain.geditruntime org.mydomain.BaseSdk org.mydomain.BasePlatform 2016-06-26 $ flatpak build geditruntime sed -i "s/^#Server/Server/g" /etc/pacman.d/mirrorlist $ flatpak build geditruntime ln -s /usr/var/lib /var/lib $ flatpak build geditruntime fakeroot pacman-key --init $ flatpak build geditruntime fakeroot pacman-key --populate archlinux
pacman からホストのネットワーク接続が使えるようにする必要があります:
$ flatpak build --share=network geditruntime fakechroot fakeroot pacman --root /usr -S gedit
ランタイムを完成させる前にインストールをテストすることができます:
$ flatpak build --socket=x11 geditruntime gedit
ランタイムをビルドを完了して新しいローカルリポジトリにエクスポートしてください。pacman の GnuPG 鍵のパーミッションが干渉する可能性があるため先に削除する必要があります。
$ flatpak build geditruntime rm -r /etc/pacman.d/gnupg $ flatpak build-finish geditruntime $ sed -i "s/\[Application\]/\[Runtime\]/;s/runtime=org.mydomain.BasePlatform/runtime=org.mydomain.geditruntime/" geditruntime/metadata $ flatpak build-export -r geditrepo geditruntime
それからダミーアプリを作成:
$ flatpak build-init geditapp org.gnome.gedit org.mydomain.BaseSdk org.mydomain.geditruntime
ビルドを完了するときに指定するオプションで、サンドボックス化されたときのアプリのアクセス権限を調整することができます。利用可能なオプションは Flatpak のドキュメントや GNOME のマニフェストファイル を見てください。また、ビルドが完了した後、エクスポートする前に必要に応じて geditapp/metadata
を編集する方法もあります。メタデータファイルが完成したら、リポジトリにアプリをエクスポートしてください。
$ flatpak build-finish geditapp --socket=x11 [possibly other options] --command=gedit $ flatpak build-export geditrepo geditapp
ランタイムを使ってアプリをインストール:
$ flatpak --user remote-add --no-gpg-verify geditrepo geditrepo $ flatpak install --user geditrepo org.mydomain.geditruntime $ flatpak install --user geditrepo org.gnome.gedit $ flatpak run org.gnome.gedit
トラブルシューティング
Flatpak は Linux で強化されたカーネルでは実行されません
linux-hardened カーネルは kernel.unprivileged_userns_clone
を 0
に設定しており、特権ユーザのみが新しいユーザ名前空間を作成することができるようになっているためです。
これを修正する一つの方法は、bubblewrap-suid を インストール することです.このパッケージは bwrap(1) の setuid
ビットを有効にして、bubblewrap が自分自身を昇格させて新しい名前空間を作成できるようにしたバージョンを提供します。
また、sysctl(8) を使って kernel.unprivileged_userns_clone
を 1
に設定して、非特権ユーザーが新しいユーザーネームスペースを作成できるようにすることも可能です。
# sysctl kernel.unprivileged_userns_clone=1
この変更を再起動後も維持するには、設定ファイルを sysctl.d(5) に追加します。
/etc/sysctl.d/flatpak.conf
kernel.unprivileged_userns_clone=1
詳細については、Bubblewrap#インストール の注記を参照してください。
xdg-desktop-portal が起動しない
手動で設定された実行コマンド で X を起動する場合、`xinitrc` リファレンスのすべての重要な構成要素を含んでいることを確認してください。そのうちの1つは、D-Bus セッションサービスに使用される環境のアップデートを実行するスクリプトをソースとしています。
systemctl --user import-environment DISPLAY XAUTHORITY if command -v dbus-update-activation-environment >/dev/null 2>&1; then dbus-update-activation-environment DISPLAY XAUTHORITY fi
Flatpak アプリケーションがデフォルトのシステム テーマを選択しない
flatpak のドキュメントに記載されているように、flatpak アプリにシステムテーマを適用する理想的な方法はありません。 [2] [3] しかし there is a workaround flatpak アプリにテーマを適用するために使用できます。
Firefox でローカル HTML ページを開くと "ファイルが見つかりません" というエラーが表示される
Flatpak 版 Firefox のデフォルトでは、ローカルの HTML を開くと "File not found" エラーページが表示されます。これは、パーミッション が、ファイルを含むフォルダーにアクセスするためにアプリに付与されなければならないからです。
ただし、ホームフォルダ全体へのアクセス許可を与えると、Firefox は ~/.mozilla
に既存のプロファイルをチェックし、サンドボックス化されたフォルダ ~/.var/app/org.mozilla.firefox/cache/mozilla/
から以前に使用したプロファイルの代わりにロードすることに注意ください。(Flatseal などで) パーミッションを変更した後に前のセッションのタブや閲覧履歴がなくなった場合は、~/.mozilla
へのアクセスを除外するようにパーミッションを変更するか、~/.var/app/org.mozilla.firefox/cache/mozilla/
から ~/.mozilla
へのプロファイルコピーを検討して下さい。
wlroots ベースのコンポジターでリンクを開くことができない
URI を開こうとする Flatpak アプリケーションは org.freedesktop.portal.OpenURI.OpenURI
インターフェースを使用します。xdg-desktop-portal で公開されている D-Bus インターフェースを使用します。xdg-desktop-portal-wlr バックエンド はこの呼び出しをサポートしていないので、例えば xdg-desktop-portal-gtk のように、隙間を埋めるための追加のバックエンドが必要になります。