Flatpak (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Flatpak翻译。上次翻译日期:2019-12-30。如果英文版本有所更改,则您可以帮助同步翻译。

引自项目 README:“Flatpak 是一个 Linux 桌面程序的构建、分发和沙箱化运行系统。”

引自 flatpak(1)

Flatpak 是一个用来管理应用和应用所使用的运行时的工具。在 Flatpak 模型中,应用的构建和分发不依赖其主系统,并且它们在运行时一定程度上独立于主系统('沙箱化')。
Flatpak 使用 OSTree 以分发和部署数据。它使用的仓库是 OSTree 仓库并且可以用 ostree 的工具来操作。已安装的运行时和应用都已经过 OSTree 检出。

安装

安装 flatpak 软件包。

注意: 如果你想使用 flatpak-builder 来构建 flatpak,你将需要安装可选的依赖 elfutilspatch

管理仓库

注意: 默认情况下,每个 flatpak 命令都是全局可用的,具体来说,软件包是安装给当前机器的所有用户的,并且要求用户提供 root 密码。如果想针对单个用户安装软件包或操作仓库,你可以添给每个命令加 --user 参数,此时不需要提供超级权限。例如,你想添加一个仅自己可见的仓库,你应该执行 $ flatpak remote-add --user name location。你想要安装一个仅自己可见的软件,执行 $ flatpak install --user package-name

添加一个仓库

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

$ flatpak remote-add name location

这其中 name 是新远程仓库的名字,而 location 是路径或仓库的 URL。

例如要添加官方仓库 Flathub repository

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

删除一个仓库

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

$ flatpak remote-delete name

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

仓库列表

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

$ flatpak remotes

管理运行时和应用

搜索远程仓库的运行时和应用

在能搜索新添加的远程仓库中的运行时和应用之前,我们需要为此获取软件应用流的数据:

$ 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

运行应用

Flatpak 应用也可以通过命令行运行:

$ flatpak run name

升级一个运行时或应用

要升级一个名为 name 的运行时或应用,执行:

$ flatpak update name

卸载一个运行时或应用

要卸载一个名为 name 运行时或应用,执行:

$ flatpak uninstall name
提示: 你可以卸载不再使用的 flatpak 依赖(即无应用/运行时依赖的孤立包),执行 flatpak uninstall --unused

添加 Flatpak .desktop 文件到您的菜单

Flatpak 期望窗口管理器按照 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

这会禁止应用访问你的家目录。

所有可以赋予权限的类型,如设备、文件系统或 socket ,都有一行命令以独立选择允许或禁止确切的权限。例如,允许访问设备时可以是 --device=device_name,而 --nodevice=device_name 会禁止访问设备。

对于所有可操作的权限类型,详见:flatpak-override(1)

下面的命令可将所有更改过的权限重设为默认:

$ flatpak override --reset name

创建自定义基本运行时

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: 这些内容当然是可以补充的。对于 GNOME 应用它同样存在 D-Bus 相关问题。 (Discuss in Talk:Flatpak (简体中文))
警告: 如果你想向公众发布一个作为 Flatpak 的软件,那么基于 Arch 系统的运行时是不合适的。在这种情况下,您应根据 官方说明 来使用 共有运行时 将您的软件融入进合适的 Flatpak 生态系统中。
注意: 你可能想要使用一个不被信任的、无特权的用户账户来打包不被信任的软件,因为软件在创建应用和运行时期间是没有被沙箱化的。
注意: 当向其他人分发软件包时,您可能需要遵守法定义务,应要求提供一些已打包软件的源代码。你可能要使用 ABS 来从源代码生成这些软件包。

您可以创建一个自定义的、基于 Arch 的基本运行时,并通过 pacman 使用 Flatpak 的 SDK。之后您可以使用它来创建和打包应用。对于个人使用来说,这是除了默认的 org.freedesktop.BasePlatformorg.freedesktop.BaseSdk 运行时之外的另一个选择。

除了 flatpak 以外,您需要安装 fakeroot,而为了使 pacman hooks 支持,您也需要安装 fakechroot

首先,创建一个目录以用来作为生成运行时/应用的位置。

$ mkdir myflatpakbuilddir
$ cd myflatpakbuilddir

之后您可以准备一个目录作为生成运行时基本平台的位置。这些文件子目录将会成为之后沙箱中的 /usr 目录的内容。因此您将需要创建符号链接使得默认 /usr/share 等源自 Arch 的路径仍然可以由通常的路径访问。

$ 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 运行时中可用:

$ 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 设置所用的 locales。之后重新生成运行时的 locales。

$ 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 到目前目录的本地仓库中。您可能想要给它们附上合适的提交(commit)信息如 “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 创建一个包含所有依赖包的运行时
  • 之后 像往常一样 自己编译应用,或可能通过自定义 PKGBUILD 为 Flatpak 特制的 pacman 使用 --prefix=/app 制作 configure 脚本,

或者我们可以

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

另见