Flatpak
来自项目 README: "Flatpak 是一个在 Linux 上构建、分发和运行沙盒化桌面应用程序的系统。"
来自 flatpak(1)
- Flatpak 是一个用于管理应用程序及其使用的运行时的工具。在 Flatpak 模型中,应用程序可以独立于它们所使用的宿主系统进行构建和分发,并且在运行时会(在一定程度上)与宿主系统隔离(“沙盒化”)。
- Flatpak 使用 OSTree 来分发和部署数据。它使用的仓库是 OSTree 仓库,可以使用 ostree 工具进行操作。已安装的运行时和应用程序是 OSTree 检出。
安装
安装 flatpak 包。如果您想构建 flatpak,请同时安装 flatpak-builder。
桌面集成
为了让 flatpak 应用程序与您的桌面进行交互(例如,允许应用程序打开 URL、共享屏幕等),请确保设置好 xdg-desktop-portal。根据您桌面的实现,在应用程序能够访问某些门户之前,会有一个确认对话框。
应用程序管理
- COSMIC Store — COSMIC 的 Flatpak 前端。
- Discover — KDE 的 Flatpak 前端,帮助您查找和安装应用程序、游戏和工具。是 plasma 的一部分。
- GNOME Software — GNOME 的 Flatpak 前端,允许您安装和更新应用程序及系统扩展。是 gnome 的一部分。
权限管理
- Flatpak Permissions Management KCM — KDE 配置模块,允许更改已安装 Flatpak 应用程序的权限。是 plasma 的一部分。
- Flatseal — 用于查看和修改 Flatpak 应用程序权限的图形化实用工具。
- malcontent (Parental Controls) — 实现支持限制非管理员账户可访问的内容类型。是 gnome 的一部分。
管理仓库
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 仓库的文档,以查找可用的子集及其描述。
管理运行时和应用程序
--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 自动更新
要自动更新您的系统运行时和应用程序,请创建以下文件
/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.service的ExecStart行中添加--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。
创建自定义基础运行时
- 您可能希望使用不受信任的、非特权的 Gitee 账户来打包不受信任的软件,因为在应用程序和运行时创建期间,软件没有被沙盒化。
- 在将软件包分发给他人时,您可能在法律上有义务应要求提供一些捆绑软件的源代码。您可能需要使用 ABS 从源代码构建这些软件包。
您可以使用 pacman 创建自定义的基于 Arch 的基础运行时和基础 SDK。然后,您可以使用它来构建和打包应用程序。这是个人使用的替代方案,取代了默认的 org.freedesktop.BasePlatform 和 org.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 在检查磁盘空间时就不会因找不到根文件系统而出错。 - 移除任何不需要的自定义仓库以及仅用于宿主系统的
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
可以通过基础运行时创建基础 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
为了使此更改在重启后仍然有效,请将一个配置文件添加到 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。
在基于 wlroots 的合成器上链接无法打开
尝试打开 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_THEME 和 XCURSOR_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