Flatpak是什麼?它是Linux的一種軟體(套件)打包格式,可以減少軟體安裝的複雜度,統一所有發行版的安裝指令,再也不用考慮個別發行版間的依賴問題。還用沙盒機制提供更好的安全性,並將應用程式設定檔統一存放在固定目錄下。
簡單來說,Flatpak能為不同Linux發行版的使用者提供版本一致的軟體。
提供Flatpak軟體的商店「Flathub」已上架多款熱門應用程式,開源與專有軟體皆有,例如Google Chrome、Steam、LibreOffice、Blender、GIMP,不論是哪個Linux發行版都能統一下載到最新版的軟體。
大多數Linux發行版已支援Flatpak技術,沒內建的話用指令裝一下就可以了。
這篇文章將會介紹如何在您的Linux系統上使用Flatpak安裝軟體(包含安裝.flatpakref格式),以及解決相關的權限和儲存問題。
1. 安裝Flatpak套件管理器#
要安裝Flatpak格式的應用程式,首先需要安裝Flatpak本體來管理套件。
- 請到 Flatpak官網查詢各大Linux發行版的安裝方法,例如Ubuntu LTS,執行以下指令安裝Flatpak套件:
sudo apt update
sudo apt install flatpak gnome-software-plugin-flatpak
- 裝好還要加入Flathub的套件庫。
建議不想每次更新應用程式都打密碼的使用者,加上--user
給個別使用者加入套件庫。這樣使用者就能免密碼安裝應用程式,且Flatpak只會安裝程式到該名使用者的家目錄。解除安裝應用程式亦不需要sudo。
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
或者,將套件庫加入到整個系統,這樣所有使用者都可以使用該軟體(有時可能要加上sudo):
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- 做完以上措施後,重開機後就能用Flatpak安裝軟體。
2. 安裝Flatpak應用程式#
在安裝好Flatpak套件管理員之後,才能安裝應用程式。
2.1. 用指令安裝#
Flatpak要安裝應用程式多半是使用Flathub,這是什麼網站呢?Flathub是GNOME基金會經營的,蒐羅最多Flatpak應用程式的網站,混雜開源與專有軟體。
那我們要怎麼安裝在Flathub看到的應用程式呢?Flathub只有網頁,沒有官方「軟體商店前端」,目前是依賴各家桌面環境的軟體商店來安裝。這裡首先介紹指令版裝法,後面會有圖形化版裝法。
以Flathub上的 Mozilla Firefox為例,點選"Install"會下載
.flatpakref
結尾的格式。對其點二下,您的應用程式商店就會跳出來指示您安裝了。
flatpakref可以用指令安裝:
flatpak install <.flatpakref路徑>
您也可以手動點選Flathub頁面顯示的指令
再貼上頁面所顯示的指令安裝:
# 安裝時可能會出現要安裝至system或user,通常我是選user
flatpak install org.mozilla.fireofox
嫌指令太長,你也可以改用下一節討論的圖形化前端(應用商店)安裝。
你可能會發現Flatpak應用程式要下載的檔案比一般用套件管理員裝的還要大許多,這是正常的,我在 這篇有另外討論Flatpak安裝應用程式的優缺點。
應用程式安裝後就會出現在應用程式列表,使用起來跟一般應用程式沒兩樣。
欲解除安裝Flatpak應用程式,使用flatpak remove
指令。注意還要加上--delete-data
才會在解除安裝的時候一併刪除該程式的設定檔。
flatpak remove org.mozilla.firefox --delete-data
2.2. 從應用商店安裝#
除了從Flathub網頁複製指令外,也可以使用桌面環境的應用程式商店搜尋、下載Flatpak應用程式。
應用程式商店讓使用者免打指令安裝程式,例如KDE Discover和GNOME Software。這些應用商店還有加入使用者評分機制。
KDE Discover需要安裝plasma-discover-flatpak-backend
套件才會顯示Flathub上的應用程式;GNOME Software則是安裝gnome-software-plugin-flatpak
套件。
在應用商店瀏覽的時候應會顯示「Flathub來源」,如下圖KDE Discover的畫面。
3. 操作Flatpak應用程式#
3.1. 用指令啟動#
Flatpak應用程式安裝後通常就會出現在系統應用程式列表了,這裡用指令啟動僅是方便除錯。
要從終端機啟動Flatpak應用程式,請使用flatpak run
指令,並且要打出完整Flatpak應用程式名稱(應用程式名稱之所以這麼長是為了避免重複)。
flatpak run org.mozilla.firefox
要看更詳細的錯誤資訊,使用--verbose
:
flatpak run --verbose org.mozilla.firefox
Flatpak跟一般應用程式一樣,可以另外加入啟動引數:
# 以隱私視窗引數啟動Firefox
flatpak run org.mozilla.firefox --private-window
要使用環境變數,用flatpak override --env
指令
# 強制Firefox使用Wayland的環境變數
flatpak --user override --env=MOZ_ENABLE_WAYLAND=1 org.mozilla.firefox
要開放存取特定檔案或目錄,用flatpak override --filesystem
指令
# 允許Firefox存取其他硬碟檔案
flatpak --user override --filesystem=/run/media/user/HDD org.mozilla.firefox
3.2. Flatpak安裝路徑#
Flatpak安裝的應用程式位於~/.local/share/flatpak/
,應用程式的資料位於~/.var/app/<應用程式名稱>
目錄,這裡也是各個應用程式設定檔的存放位置。像MPV、VIM這類需要撰寫設定檔的應用程式,就是將設定檔丟到這裡。
上面我們提到要從終端機執行Firefox,需要用flatpak run org.mozilla.firefox
指令,但若其他應用程式是直接呼叫firefox
來開啟瀏覽器呢?
這時請將Flatpak二進位檔的安裝路徑~/.local/share/flatpak/exports/bin/
加到~/.bashrc
# 此時執行Firefox的指令從flatpak run org.mozilla.firefox縮短為org.mozilla.firefox取代
PATH=$PATH:/var/lib/flatpak/exports/bin
再視需要建立軟連結或alias
# 執行firefox等同執行org.mozilla.firefox
alias firefox = org.mozilla.Firefox
3.3. 更新Flatpak應用程式#
flatpak update
指令會更新全部應用程式。
若要更新個別應用程式,請在指令後面加上應用程式名稱,例如flatpak update org.mozilla.firefox
若要防止特定應用程式更新,加上mask,例如flatpak mask org.mozilla.firefox
3.4. 降級Flatpak應用程式#
如果更新出狀況,您可能會想要降級到舊版本應用程式。
- 使用
flatpak remote-info
列出該應用程式最近的提交,看完按Ctrl + C停止載入
flatpak remote-info --log flathub org.mozilla.firefox
- 用
flatpak update
指定安裝舊版本提交
flatpak update --commit="commit數字" org.mozilla.firefox
- 若要防止未來應用程式自動更新,使用
flatpak mask
指令
flatpak mask org.mozilla.firefox
3.5. 清除Flatpak佔用空間#
時間久了Flatpak的儲存庫(~/.local/share/flatpak/
)會累積許多舊版檔案,若確認不會降級可將其清除。
使用flatpak --user remove --unused
和flatpak --user repair
指令清除冗餘檔案。
4. Flatpak常用指令#
全部指令請看 官方文件。
flatpak指令在執行的時候可以選擇性加上--user
或--system
,指定要變更個別使用者抑或是系統設定。
Flatpak應用程式名稱,正式來說叫做domain name,由網域而非單一字串組成,例如「Firefox」完整名稱是為「org.mozilla.Firefox」。
指令 | 用途 |
---|---|
flatpak search [應用程式名稱] | 搜尋Flathub的應用程式,支援模糊搜尋 |
flatpak install [應用程式名稱] | 安裝應用程式 |
flatpak install [.flatpakref] | 從flatpakref檔案安裝應用程式 |
flatpak run [應用程式名稱] | 執行應用程式 |
flatpak uninstall [應用程式名稱] | 移除應用程式 |
flatpak uninstall [應用程式名稱] --delete-data | 移除應用程式並刪除資料 |
flatpak uninstall --unused | 移除用不到的依賴套件 |
flatpak repair | 清理Flatpak的git儲存庫,移除無效物件 |
flatpak list | 列出所有安裝的Flatpak套件,包含runtime |
flatpak list --apps | 列出所有安裝的Flatpak應用程式 |
flatpak override | 覆寫Flatpak應用程式設定,可以用來設定環境變數和賦予權限 |
flatpak permission-reset [應用程式名稱] | 重設應用程式權限 |
flatpak update | 更新全部應用程式。 |
flatpak remotes | 列出遠端套件庫 |
flatpak mask [應用程式名稱] | 鎖定應用程式版本,防止應用程式自動更新 |
flatpak ps | 列出所有Flatpak應用程式的行程。 |
flatpak kill [應用程式名稱] | 終止應用程式執行 |
5. 管理Flatpak程式權限#
Flatpak使用Bubblewrap實現應用程式沙盒化,並規範了一套權限(permission),加強系統安全性。
如果使用Flatpak安裝應用程式可能會遇到一些問題,比如Chrome瀏覽器的檔案管理員無法開啟特定硬碟的檔案、無法拖曳圖片到瀏覽器、或者是檔案選擇器只有Downloads?
如果特定目錄的檔案打不開,你可以借助圖形化的應用程式 Flatseal,管理Flatpak程式的權限(permission)。
它的功能等同flatpak override
。
6. 自動更新Flatpak程式#
如果隔很久才手動更新Flatpak,可能會要下載大量資料。在網路速度許可的情況下,可以利用systemd timer,每日自動檢查Flatpak應用程式的更新,搭配atomic update機制,每日一小點一小點的更新。
新增服務要裝在系統還是個別使用者?端看您Flatpak應用程式是裝在系統還是裝在個別使用者來決定。
- 新增服務
# 系統
sudo systemctl edit --full --force update-system-flatpaks.service
# 個別使用者
systemctl --user edit --full --force update-user-flatpaks.service
- 填入以下內容
[Unit]
Description=Update Flatpaks
[Service]
Type=oneshot
ExecStart=/usr/bin/flatpak update -y
[Install]
WantedBy=default.target
- 建立timer
# 系統
sudo systemctl edit --full --force update-system-flatpaks.timer
# 個別使用者
systemctl edit --user --full --force update-user-flatpaks.timer
- 填入以下內容
[Unit]
Description=Update Flatpaks daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
- 啟用服務
# 系統
sudo systemctl daemon-reload
sudo systemctl enable --now update-system-flatpaks.timer
# 個別使用者
systemctl --user daemon-reload
systemctl --user enable --now update-system-flatpaks.timer
7. 設定開機自動啟動#
Flatpak啟動應用程式的指令為/usr/bin/flatpak run <應用程式ID>
,可加上--background
引數使其在背景執行。
請參見 Linux開機自動啟動。
8. 備份Flatpak程式資料#
如果要備份Flatpak程式資料,就直接備份~/.var/app
目錄吧,但是Flatpak程式不見得會把設定檔乖乖放在這裡,有些會放到~/.config
,得自行判斷Flatpak有沒有存取其他目錄。
參考 Reddit網友作法,如果只是單純要備份「應用程式列表」,不包含資料和runtime的話:
# 存成txt檔
flatpak --user list --columns=application --app > flatpaks.txt
# 之後可以從txt檔還原
flatpak install -y $(< flatpaks.txt)