跳转至内容

Flatpak

来自 ArchWiki

来自项目 README: "Flatpak 是一个在 Linux 上构建、分发和运行沙盒化桌面应用程序的系统。"

来自 flatpak(1)

Flatpak 是一个用于管理应用程序及其使用的运行时的工具。在 Flatpak 模型中,应用程序可以独立于它们所使用的宿主系统进行构建和分发,并且在运行时会(在一定程度上)与宿主系统隔离(“沙盒化”)。
Flatpak 使用 OSTree 来分发和部署数据。它使用的仓库是 OSTree 仓库,可以使用 ostree 工具进行操作。已安装的运行时和应用程序是 OSTree 检出。
警告
  • 许多在 flathub 上可用的 Flatpak 应用程序默认并未有效地沙盒化 [1]。在审查相关 flatpak 权限清单以了解常见的沙盒逃逸问题之前,请不要依赖提供的进程隔离。您可以移除有问题的权限(参见 #权限管理),但这可能会破坏某些功能。
  • 运行不受信任的代码永远不安全;沙盒化也无法改变这一点。

安装

安装 flatpak 包。如果您想构建 flatpak,请同时安装 flatpak-builder

桌面集成

为了让 flatpak 应用程序与您的桌面进行交互(例如,允许应用程序打开 URL、共享屏幕等),请确保设置好 xdg-desktop-portal。根据您桌面的实现,在应用程序能够访问某些门户之前,会有一个确认对话框。

应用程序管理

  • COSMIC Store — COSMIC 的 Flatpak 前端。
https://github.com/pop-os/cosmic-store || cosmic-store
  • Discover — KDE 的 Flatpak 前端,帮助您查找和安装应用程序、游戏和工具。是 plasma 的一部分。
https://apps.kde.org/discover/ || discover
  • GNOME Software — GNOME 的 Flatpak 前端,允许您安装和更新应用程序及系统扩展。是 gnome 的一部分。
https://apps.gnome.org.cn/Software/ || gnome-software

权限管理

  • Flatpak Permissions Management KCM — KDE 配置模块,允许更改已安装 Flatpak 应用程序的权限。是 plasma 的一部分。
https://invent.kde.org/plasma/flatpak-kcm || flatpak-kcm
  • Flatseal — 用于查看和修改 Flatpak 应用程序权限的图形化实用工具。
https://github.com/tchx84/Flatseal || flatseal
  • malcontent (Parental Controls) — 实现支持限制非管理员账户可访问的内容类型。是 gnome 的一部分。
https://gitlab.freedesktop.org/pwithnall/malcontent || malcontent

管理仓库

注意 默认情况下,每个 flatpak 命令都作用于系统范围,即软件包为计算机的所有用户安装;同样,默认情况下,flatpak 要求用户提供 root 密码。如果用户属于 wheel 组且未通过 SSH 连接,flatpak 会将该用户视为系统管理员,并在系统范围安装软件包时不会提示输入 root 密码。要为单个用户安装软件包和处理仓库(无需超级用户权限),您可以在每个命令后添加 --user 选项。如果您想,例如,只为您自己添加一个仓库,您应该执行 flatpak remote-add --user name location

添加仓库

要添加一个远程 flatpak 仓库,请执行

$ flatpak remote-add name location

其中 name 是新仓库的名称,location 是仓库的路径或 URL。

Flatpak 的安装默认会添加官方的 Flathub 仓库作为系统范围安装。要以每个用户配置添加官方仓库

$ flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo

删除仓库

要删除一个远程 flatpak 仓库,请执行

$ flatpak remote-delete name

其中 name 是要删除的远程仓库的名称。

列出仓库

要列出所有已添加的仓库,请执行

$ flatpak remotes

设置仓库优先级

要将 Flathub 仓库的默认优先级更改为 3

$ flatpak remote-modify --prio=3 flathub

更改仓库子集

选择 Flathub 仓库的 verified 子集

$ flatpak remote-modify --subset=verified flathub

请参阅所需 Flatpak 仓库的文档,以查找可用的子集及其描述。

管理运行时和应用程序

注意 如果已使用每个用户的配置添加了远程仓库,则可以在以下 flatpak 命令后附加 --user 选项。例如,要安装一个仅对您可见的软件包,请运行 flatpak install --user package-name

搜索远程运行时或应用程序

在能够搜索新添加的远程仓库中的运行时或应用程序之前,我们需要为其检索 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 partial-name(例如 flatpak install libreoffice)。

列出已安装的运行时和应用程序

要列出已安装的运行时和应用程序,请执行

$ flatpak list

运行应用程序

二进制文件位于 /var/lib/flatpak/exports/bin,它由 /etc/profile.d/flatpak-bindir.sh 自动添加到 $PATH。您可能需要重新登录才能应用更改。

也可以使用命令行运行 Flatpak 应用程序

$ flatpak run name

更新运行时或应用程序

列出有可用更新的运行时和应用程序

$ flatpak remote-ls --updates

要更新名为 name 的运行时或应用程序,请执行

$ flatpak update name

要更新所有应用程序和运行时

$ flatpak update

通过 systemd 自动更新

警告 通常不建议通过 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

[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

之后,执行 daemon-reload启用/启动 flatpak-update.timer 单元

  • 本指南适用于系统 flatpak 安装,这是 flatpak 的默认设置。对于用户 flatpak 安装
    • /etc/systemd/user/ 目录中创建上述文件。
    • flatpak-update.serviceExecStart 行中添加 --user 标志。
    • 使用 --user 标志运行 systemctl 命令。

卸载运行时或应用程序

要卸载名为 name 的运行时或应用程序,请执行

$ flatpak uninstall name

要卸载时删除 ~/.var/app 中的应用程序数据以及权限存储中的数据,请使用

$ flatpak uninstall --delete-data name
提示 您可以使用 flatpak uninstall --unused 卸载未使用的 flatpak "refs"(即孤立的、没有应用程序/运行时的条目)。

降级运行时或应用程序

要降级运行时或应用程序,请先查找相关的提交 ID

$ flatpak remote-info --log remote name

其中 remote 是仓库(如 flathub),name 是应用程序或运行时的名称。然后,部署该提交

$ flatpak update --commit=commit name

其中 commit 是所需版本的提交 ID,name 与之前相同。

此过程也可用于选择性地将软件包升级到所需的、非最新版本。

要阻止 flatpak update 更新此软件包,请参见 #阻止运行时或应用程序更新

阻止运行时或应用程序更新

要阻止运行时或应用程序的自动和手动更新,请使用 flatpak mask 命令

$ flatpak mask name

这也会阻止选择性升级和降级。

要撤销掩码并重新启用更新,请使用 flatpak mask --remove

$ flatpak mask --remove name

将 Flatpak .desktop 文件添加到菜单

Flatpak 希望窗口管理器尊重 XDG_DATA_DIRS 环境 变量来发现应用程序。该变量由脚本 /etc/profile.d/flatpak.sh 设置。更新环境可能需要重新启动会话。如果启动器不支持 XDG_DATA_DIRS,您可以编辑扫描的目录列表并添加这些目录

~/.local/share/flatpak/exports/share/applications
/var/lib/flatpak/exports/share/applications

已知在 Awesome 中需要这样做。

查看应用程序的沙盒权限

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

Flatseal 是一个图形化权限管理器,提供简单的点击式权限操作。在 KDE Plasma 中,Flatpak Permissions Management KCM 为系统设置应用程序提供了类似的图形界面:System Settings > Applications > Flatpak Permission Settings

创建自定义基础运行时

本文章或章节需要扩充。

原因: 这当然可以改进。它也存在 GNOME 应用 D-Bus 的问题。(请在 Talk:Flatpak 讨论)
警告 如果您想将软件作为 Flatpak 向公众发布,基于 Arch 的运行时是不合适的。在这种情况下,您需要遵循 官方文档,使用 通用运行时将您的软件集成到正确的 Flatpak 生态系统中。
  • 您可能希望使用不受信任的、非特权的 Gitee 账户来打包不受信任的软件,因为在应用程序和运行时创建期间,软件没有被沙盒化。
  • 在将软件包分发给他人时,您可能在法律上有义务应要求提供一些捆绑软件的源代码。您可能需要使用 ABS 从源代码构建这些软件包。

您可以使用 pacman 创建自定义的基于 Arch 的基础运行时和基础 SDK。然后,您可以使用它来构建和打包应用程序。这是个人使用的替代方案,取代了默认的 org.freedesktop.BasePlatformorg.freedesktop.BaseSdk 运行时。

除了 flatpak,您还需要安装 fakeroot,并支持 pacman 钩子,还需要安装 fakechroot

首先,创建一个用于构建运行时和可能的应用程序的目录。

$ mkdir myflatpakbuilddir
$ cd myflatpakbuilddir

然后,您可以为构建运行时基础平台准备一个目录。files 子目录将包含稍后在沙盒中成为 /usr 目录的内容。因此,您需要创建符号链接,以便仍然可以在usual 路径访问 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

使您的宿主 OS 字体可用于 Arch 运行时

$ 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 在检查磁盘空间时就不会因找不到根文件系统而出错。
  • 移除任何不需要的自定义仓库以及仅用于宿主系统的 IgnorePkgIgnoreGroupNoUpgradeNoExtract 设置。

现在安装运行时所需的软件包。

$ 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

可以通过基础运行时创建基础 SDK,并添加构建软件包和运行 pacman 所需的应用程序。

$ 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 创建一个包含所有依赖项的运行时
  • 并按常规方式自行编译应用程序,或者可能使用 pacman 和一个针对 Flatpak 定制的 PKGBUILD,为 configure 脚本使用 --prefix=/app

或者我们可以

  • 使用 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

然后安装软件包。宿主机的网络连接必须提供给 pacman。

$ flatpak build --share=network geditruntime fakechroot fakeroot pacman --root /usr -S gedit

在完成运行时之前(没有 proper sandboxing),您可以测试安装。

$ 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 manifest files。或者,在导出应用程序到仓库之前,将 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-hardened 内核上无法运行

linux-hardened 内核将 kernel.unprivileged_userns_clone 设置为 0,因此只有特权用户才能创建新的用户命名空间。

一种修复此问题的方法是安装 bubblewrap-suid。此包提供了一个带有 setuid 位启用的 bwrap(1) 版本,允许 bubblewrap 提升自身并创建新的命名空间。

或者,使用 sysctl(8)kernel.unprivileged_userns_clone 设置为 1,允许非特权用户创建新的用户命名空间

# sysctl kernel.unprivileged_userns_clone=1
警告 使用此内核参数值具有负面的安全影响。有关更多信息,请参见 Security#Sandboxing applications

为了使此更改在重启后仍然有效,请将一个配置文件添加到 sysctl.d(5)

/etc/sysctl.d/flatpak.conf
kernel.unprivileged_userns_clone=1

有关更多信息,请参阅 Bubblewrap#Installation 中的说明。

连接到 Wayland 显示失败

如果应用程序无法正常打开,并且您在 flatpak run 时收到诸如 Failed to connect to Wayland display: No such file or directory 之类的消息:这可能是因为其他设置,例如 ELECTRON_OZONE_PLATFORM_HINT="auto",使 Flatpak 应用程序选择 Wayland,但 Wayland 的访问并未在此应用程序中列入白名单。

可以通过使用 Flatseal 等工具将 socket=wayland 的访问加入白名单来解决此问题。

xdg-desktop-portal 启动失败

如果您正在手动配置的运行命令下启动 X,请确保包含参考 `xinitrc` 的所有必要组件。其中之一会 sourcing 一个脚本,该脚本会更新 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 文档中所述 [2] [3],没有理想的方法来在 flatpak 应用中应用系统主题。最简单的解决方案是使用 Flathub 上可用的主题。然而 有一种变通方法 可用于将主题应用于您的 flatpak 应用。stylepak-gitAUR 自动化了这个变通方法。

在 Firefox 中打开本地 HTML 页面时出现“文件未找到”错误

默认情况下,Firefox 的 Flatpak 版本在打开本地 HTML 时会显示“文件未找到”错误页面。这是因为必须授予应用程序访问包含文件的文件夹的权限。

但是,请注意,当授予访问整个 Home 文件夹的权限时,Firefox 将检查 ~/.mozilla 中是否存在配置文件,并加载它,而不是加载之前在沙盒文件夹 ~/.var/app/org.mozilla.firefox/cache/mozilla/ 中使用的配置文件。如果在更改权限(例如使用 Flatseal)后丢失了之前的会话标签和浏览历史记录,请将权限修改为排除对 ~/.mozilla 的访问,或者考虑将配置文件从 ~/.var/app/org.mozilla.firefox/cache/mozilla/ 复制到 ~/.mozilla

尝试打开 URI 的 Flatpak 应用程序使用 org.freedesktop.portal.OpenURI.OpenURI D-Bus 接口,该接口由 xdg-desktop-portal 暴露。 xdg-desktop-portal-wlr 后端不支持此调用,因此您需要一个额外的后端来填补这个空缺,例如 xdg-desktop-portal-gtk

应用程序未使用正确的游标主题

没有单一的标准可以正确设置游标。有些程序只需要对游标目录的读取访问权限,而另一些则依赖于其他机制。对于 GTK 应用程序,请确保安装了 xdg-desktop-portal-gtk

否则,以下覆盖对于大多数常见桌面应用程序应该有效。

$ flatpak -u override --filesystem=/usr/share/icons/:ro
$ flatpak -u override --filesystem=/home/$USER/.icons/:ro 
$ flatpak -u override --filesystem=xdg-config/gtk-3.0:ro
$ flatpak -u override --env=XCURSOR_PATH=~/.icons

在某些情况下,您可能还需要覆盖环境变量 XCURSOR_THEMEXCURSOR_SIZE

$ flatpak -u override --env=XCURSOR_THEME=Adwaita
$ flatpak -u override --env=XCURSOR_SIZE=24

有关更多详细信息,请参阅 此讨论

显然,现在无法启用应用程序对 /usr/ 下目录的访问。以下内容在启动程序时暗示了这一点

$ flatpak run com.spotify.Client
F: Not sharing "/usr/share/icons" with sandbox: Path "/usr" is reserved by Flatpak

一种可能的变通方法是将您的图标主题手动从 /usr/share/icons 复制到 /home/$USER/.icons/

Flatpak Qt 应用程序未使用 Gnome Adwaita 暗色主题

如果您将主题切换到 Adwaita-dark,而 Flatpak Qt 应用程序仍在使用浅色版本,请安装所需的 KStyle

# flatpak install flathub org.kde.KStyle.Adwaita

运行 Flatpak 应用程序时出现权限被拒绝错误

如果包含应用程序存储文件夹的挂载点被挂载了 noexec 选项,Flatpak 应用程序将无法运行。通常,系统范围安装为 /var/lib/flatpak/,用户特定安装为 ~/.local/share/flatpak/

使用 noexec 设置时,您会收到类似以下的错误

$ bwrap: execvp ldconfig: Permission denied
$ error: ldconfig failed, exit status 256

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.