Flatpak

提供: ArchWiki
2022年2月18日 (金) 00:24時点におけるKgx (トーク | 投稿記録)による版 (→‎リポジトリの管理: ノートを翻訳して追加)
ナビゲーションに移動 検索に移動

関連記事

プロジェクトの README より:

Flatpak は Linux 上でサンドボックス化したデスクトップアプリケーションをビルド・配布・実行するためのシステムです。

flatpak(1) より:

Flatpak はアプリケーションやランタイムを管理するためのツールです。Flatpak モデルでは、アプリケーションはホスト環境とは独立してビルド・配布することができます。アプリケーションは実行時にホスト環境から隔離 (サンドボックス化) されます。
Flatpak は OSTree を使用してデータを配布・デプロイします。Flatpak のリポジトリは OSTree のリポジトリであり、ostree ユーティリティによって操作することが可能です。ランタイムやアプリケーションのインストールは OSTree のチェックアウトと同じです。

インストール

flatpak パッケージをインストールしてください。

ノート: flatpak-builder で flatpak をビルドしたい場合、elfutilspatch もインストールする必要があります。

リポジトリの管理

ノート: デフォルトでは、すべての flatpak コマンドはシステム全体で機能します。つまり、パッケージはコンピュータ内のすべてのユーザーにインストールされ、flatpak はユーザーに root のパスワードの入力を要求します。パッケージをインストールし、 (スーパーユーザー権限を必要とせずに) 単一のユーザーでリポジトリを操作するには、オプション --user を各コマンドに追加します。たとえば、自分だけに表示されるリポジトリを追加したい場合は、$ flatpak remote-add--usernamelocation を実行する必要があります。自分だけが表示できるパッケージをインストールするには、$ flatpak install--userpackage-name を実行します。

リポジトリの追加

リモートの 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 install libreoffice を実行してもインストールが行えます。

インストールされたランタイムやアプリケーションの確認

インストールされたランタイムやアプリケーションを確認するには次を実行:

$ 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
ヒント: flatpak uninstall --unused とすると、どのアプリケーションやランタイムでも使用されていない "refs" をアンインストールできます。

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

カスタムベースランタイムの作成

警告: あなたのソフトウェアを Flatpak として公開したい場合、Arch ベースのランタイムを使うことは相応しくありません。そのような場合は 公式ドキュメント に従って 共通ランタイム を使用して Flatpak エコシステムに適合させると良いでしょう。
ノート:
  • アプリやランタイムを作成するときはソフトウェアはサンドボックス化されないため、信用できないソフトウェアをビルドするときは普段使いのユーザーアカウントは使わないことを推奨します。
  • バンドルを配布する場合、バンドルしたソフトウェアのソースコードを要求に応じて提供する法的な義務を負います。ABS を使ってソースからパッケージをビルドすることもできます。

pacman を使うことで Flatpak 用に Arch ベースのカスタムランタイムやベース SDK を作成することができます。カスタムランタイムを使用してアプリケーションをビルドしたりパッケージ化することが可能です。デフォルトの org.freedesktop.BasePlatformorg.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

参照