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