Flatpak (简体中文)
引自项目 README:“Flatpak 是一个 Linux 桌面程序的构建、分发和沙箱化运行系统。”
引自 flatpak(1):
- Flatpak 是一个用来管理应用和应用所使用的运行时的工具。在 Flatpak 模型中,应用的构建和分发不依赖其主系统,并且它们在运行时一定程度上独立于主系统('沙箱化')。
- Flatpak 使用 OSTree 以分发和部署数据。它使用的仓库是 OSTree 仓库并且可以用 ostree 的工具来操作。已安装的运行时和应用都已经过 OSTree 检出。
安装
管理仓库
--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 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
创建自定义基本运行时
您可以创建一个自定义的、基于 Arch 的基本运行时,并通过 pacman 使用 Flatpak 的 SDK。之后您可以使用它来创建和打包应用。对于个人使用来说,这是除了默认的 org.freedesktop.BasePlatform
和 org.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 将不会抱怨检测硬盘空间时发现根文件系统的错误。 - 移除所有不需要的自定义仓库和
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
设置所用的 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 documentation 和 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