Flatpak使用Bubblewrap實現應用程式沙盒化,並規範了一套權限(permission),加強系統安全性。
如果使用Flatpak安裝應用程式,你可能會遇到一些問題,比如Chrome瀏覽器的檔案管理員無法開啟特定硬碟的檔案、無法拖曳圖片到瀏覽器、或者是檔案選擇器只有Downloads?
這樣你發現沙箱權限的安全之處了吧,Flatpak打包的應用程式預設是無法存取使用者家目錄以外的檔案的,如果應用程式又沒使用XDG Portal API的話,你就得手動賦予權限。
想確定Flatpak的程式能否看到特定目錄的檔案,可以嘗試登入容器的shell,再執行指令。
flatpak run --command=/bin/bash io.mpv.Mpv
ls /
如果看不到特定目錄,那就得調整權限了,權限賦予可用flatpak override指令,我個人則是比較喜歡用圖形化前端FlatSeal操作啦。
1. 用flatpak override指令調整權限#
flatpak override
這個指令可以開關網路、目錄、匯流排、硬體裝置、X11伺服器等等的存取權限,也可以用來設定環境變數。
flatpak override指令的寫法如下,中間是權限(可接多個,注意要加等號),最後面是應用程式名稱
flatpak override --filesystem=hosts org.mozilla.Firefox
如果您想知道詳細權限的用途,請看 Flatseal文件和 Flatpak文件的說明。
2. 用圖形化程式FlatSeal調整權限#
每個程式都要手打指令不是很方便,所以我通常會使用圖形化的FlatSeal調整權限。
Flatseal本身也是個Flatpak軟體:
flatpak --user install com.github.tchx84.Flatseal
裝好開啟就可以調整權限了。
FlatSeal欄位都有對應flatpak override
指令的提示,像Enviornment
對應的是flatpak override
指令中的--env
,也就是環境變數;File system
則是對應--filesystem
,指該應用程式可存取的目錄。
FlatSeal會將調整過的權限放置在~/.local/share/flatpak/overrides/
,修改權限後重啟程式才會套用。Flatpak程式執行時會讀取這裡的權限設定。
調整權限務必小心,有些程式如果開到「存取所有目錄的權限」(--filesystem=host
或--filesystem=user
)則檔案放置的位置會亂掉,例如Flatpak版Chrome的設定檔會放在~/.var
,開了之後會變回預設的~/.config
。且根據Flatpak文件,filesystem=host其實也沒有真的開放全部系統目錄。
所以通常我是看需求開放,如果Flatpak程式在彈出檔案選擇器的時候沒有用到Portal API導致檔案看不到,那我才會開放權限。
下面介紹常用權限。
「All Applications」是全域設定,你也可以僅給特定應用程式開放權限。
想要解決Flatpak應用程式讀不到特定目錄的問題,點選All Applications欄位,捲動到File System,在Other Files加入路徑即可。
比方說我有一個額外掛載的硬碟,用lsblk
指令查看後,掛載點確認是/run/media/user/SSD
,那麼就將路徑加進去Other Files。路徑後面還可以加上:ro
或:rw
規定該目錄是否為唯讀狀態。
又如,你需要使用 Nvidia PRIME的環境變數,那麼就在Environment欄位設定
如果你想強迫特定程式以X11模式執行,就把Wayland的權限關掉,這樣在Wayland工作階段下該程式就會變成XWayland模式執行。
有些程式資料喜歡亂放,可把Filesystem和Persistent的權限關掉,強迫程式把資料放到~/.var
。不過如果程式開發者沒有考慮到Flatpak設定,你這樣做可能會影響該程式與其他程式的整合。
害怕應用程式亂回傳資料的,直接在Share → 關掉Network斷它網路!
Device欄位的All Devices權限關掉後,應用程式就無法存取相機和USB裝置。