Flatpak
関連記事
プロジェクトの README より:
- Flatpak は Linux 上でサンドボックス化したデスクトップアプリケーションをビルド・配布・実行するためのシステムです。
flatpak(1) より:
- Flatpak はアプリケーションやランタイムを管理するためのツールです。Flatpak モデルでは、アプリケーションはホスト環境とは独立してビルド・配布することができます。アプリケーションは実行時にホスト環境から隔離 (サンドボックス化) されます。
- Flatpak は OSTree を使用してデータを配布・デプロイします。Flatpak のリポジトリは OSTree のリポジトリであり、ostree ユーティリティによって操作することが可能です。ランタイムやアプリケーションのインストールは OSTree のチェックアウトと同じです。
目次
- 1 インストール
- 2 リポジトリの管理
- 3 ランタイムとアプリケーションの管理
- 4 カスタムベースランタイムの作成
- 5 参照
インストール
リポジトリの管理
リポジトリの追加
リモートの 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
Flatpak の .desktop ファイルをメニューに追加
Flatpak ではウィンドウマネージャが XDG_DATA_DIRS 環境変数を参照してアプリケーションを見つけるようになっています。セッションを再起動する必要があったり、ランチャーによっては環境変数がサポートされていない場合があります。スキャンされるディレクトリのリストを編集出来る場合、以下を追加してください:
~/.local/share/flatpak/exports/share/applications /var/lib/flatpak/exports/share/applications
上記の設定で Awesome から Flatpak アプリが起動できるようになります。
Viewing sandbox permissions of application
Flatpak applications come with predefined sandbox rules which defines the resources and file system paths the application is allowed to access. To view the specific application permissions do:
$ flatpak info --show-permissions name
The reference of the sandbox permission names can be found on official flatpak documentation.
サンドボックスでのアプリケーションの権限を上書き
既定のアプリケーションの権限が寛容すぎたり厳しすぎる場合は、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