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

刪除一個倉庫[編輯 | 編輯原始碼]

要刪除一個遠程 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

另見[編輯 | 編輯原始碼]