Flatpak

来自 Arch Linux 中文维基

引自项目 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

官方仓库的镜像站[编辑 | 编辑源代码]

对于中国大陆用户,有上海交通大学的 Flathub 缓存可供选择。

使用方法:

sudo flatpak remote-modify flathub --url=https://mirror.sjtu.edu.cn/flathub

如果出现错误可尝试:

wget https://mirror.sjtu.edu.cn/flathub/flathub.gpg
sudo flatpak remote-modify --gpg-import=flathub.gpg flathub
注意: NVIDIA 驱动、JetBrains 系列等软件需要从官方服务器下载,无法使用镜像站加速,因为重分发授权问题

删除一个仓库[编辑 | 编辑源代码]

要删除一个远程 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

创建自定义基本运行时[编辑 | 编辑源代码]

这篇文章的某些内容需要扩充。

原因: 这些内容当然是可以补充的。对于 GNOME 应用它同样存在 D-Bus 相关问题。 (在 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

另见[编辑 | 编辑源代码]