快轉到主要內容

無法開啟檔案?用Flatseal調整Linux Flatpak應用程式權限 & flatpak override用法

· 民國114年乙巳年
· ·
分類   Linux系統 Linux使用技巧
標籤   Flatpak Freedesktop Specifications
目錄

Manage Flatpak applications with ease using Flatseal!

Make Flatpak application arguments persistent after running flatpak update.

本文Ivon解說「flatpak override用法」

Flatpak使用Bubblewrap實現應用程式沙盒化,並規範了一套權限(permission),加強系統安全性。

如果使用Flatpak安裝應用程式,你可能會遇到一些權限問題,比如:

  • Google Chrome瀏覽器無法開啟特定硬碟的檔案,無法拖曳圖片到視窗上傳
  • Steam收藏庫無法選擇其他硬碟
  • GIMP無法開啟照片
  • 應用程式的檔案選擇對話框只看到Downloads資料夾

會發生這種現象是因為,Flatpak採用沙盒隔離機制,Flatpak打包的應用程式預設是無法存取家目錄以外檔案的。如果應用程式又沒使用XDG Portal API的話,你就得手動賦予權限。

想確定Flatpak的程式能否看到特定目錄的檔案,可以嘗試登入容器的bash shell,再執行指令確認。例如這是登入Steam客戶端的容器:

flatpak run --command=/bin/bash com.valvesoftware.Steam

ls /

如果在容器裡面看不到特定目錄,那就得調整權限了。

Flatpak賦予權限可用flatpak override指令,我個人則是比較喜歡用圖形程式「Flatseal」操作。

1. 用flatpak override指令賦予權限
#

  1. flatpak override這個指令可以開關網路、目錄、匯流排、硬體裝置、X11伺服器等等的存取權限,也可以用來設定環境變數。

  2. 如果您想知道每個權限的詳細用途,請看Flatpak文件的說明。

  3. flatpak override指令的寫法如下,中間是權限,最後面是應用程式名稱:

flatpak override <權限設定> com.valvesoftware.Steam
  1. 例如,我要開放Steam讀取「下載」目錄:
flatpak override --filesystem=xdg-downloads com.valvesoftware.Steam
  1. 以上指令會將你變更的權限寫入到~/.local/share/flatpak/overrides,當Flatpak程式執行的時候,這裡的規則會優先套用。

2. 用圖形程式Flatseal調整權限
#

每個程式都要手打指令調整權限不是很方便,所以我通常會使用圖形化的Flatseal調整權限。

一些觀念
#

  1. Flatseal本身也是個Flatpak軟體,用以下指令安裝:
flatpak --user install com.github.tchx84.Flatseal
  1. 裝好開啟就可以調整權限了,Flatseal的功能延伸自flatpak override,它會將你變更的權限寫入到~/.local/share/flatpak/overrides,當Flatpak程式執行的時候,這裡的規則會優先套用。

  2. 請看Flatseal文件了解權限的用途。Flatseal欄位都有對應flatpak override指令的提示,像Enviornment對應的是flatpak override指令中的--env,也就是環境變數;File system則是對應--filesystem,即應用程式可存取的目錄。

  3. 根據Flatpak文件,非必要的時候不要直接指定絕對路徑,而是使用XDG標準。例如要開放讀取「下載」目錄,應該使用xdg-downloads而非/home/user/Downloads

  4. 注意不要賦予過多權限,有些程式如果開到「存取所有目錄的權限」(--filesystem=host--filesystem=user) 則檔案放置的位置會亂掉,例如Flatpak版Google Chrome的設定檔會放在~/.var,開了之後會變回預設的~/.config。且根據Flatpak文件,filesystem=host其實也沒有真的開放全部系統目錄。所以通常我是看需求開放,如果Flatpak程式在彈出檔案選擇器的時候沒有用到XDG Portal API導致檔案看不到,那我才會開放權限。

具體操作
#

Flatseal最上面的「All Applications」是全域設定,所有的應用程式會全域套用規則。

但是!儘量不要動這裡的設定,因為不同程式可能有不同的設計,如果你給所有應用程式開放全部的權限就失去用Flatpak的意義了!需要的時候,再要給個別應用程式開放權限就好。

我唯一會動的設定,就是在File system處的Other files,新增所有外接硬碟的路徑,使所有Flatpak程式預設都能存取那些硬碟下的目錄。


接著介紹一些常見的設定。

開放應用程式讀取特定目錄:比方說我有一個額外掛載的硬碟,用lsblk指令查看後,掛載點確認是/run/media/user/SSD,那麼就將路徑加進去Other Files。路徑後面還可以加上:ro:rw規定該目錄是否為唯讀狀態。

又如,需要暫時使用Nvidia獨立顯示卡跑3D加速,那麼就在Environment欄位設定Nvidia PRIME的環境變數:

如果你想強迫特定程式以X11模式執行,就把Wayland的權限關掉,並開啟Fallback to X11,這樣在Wayland工作階段該程式就會變成XWayland模式執行。

有些程式資料喜歡亂放dotfiles,可把Filesystem和Persistent的權限關掉,強迫程式把資料放到Flatpak專用的~/.var。不過程式開發者若沒有考慮到Flatpak設定,你這樣做可能會影響該程式與其他程式的整合。

若害怕應用程式亂回傳資料的,直接關掉 Share → Network,斷它網路!

還有,Device欄位的All Devices權限關掉後,應用程式就無法存取相機和USB裝置。

3. 保留Flatpak程式的啟動引數,不被更新覆蓋
#

最新版的Google Chrome可以用啟動引數--ozone-platform=auto進入純Wayland模式。

Flatpak的指令啟動方式是:flatpak run com.google.Chrome --ozone-platform=auto

如果希望點選應用程式列表的Google Chrome圖示就自動以這個引數啟動的話,得修改Desktop Entry,你應該會直覺的想要修改~/.local/share/flatpak/exports/share/applications/com.google.Chrome.desktop吧,在Exec=後面加上引數。這樣點選應用程式列表的時候就會自動套用該引數。可惜這個檔案會跟著flatpak update更新而被覆蓋,導致每次更新都要重作一次這個步驟。

要讓引數維持有效,可以利用我們上面提過的flatpak override檔案達成。

參考Google Chrome的metadata寫法:

cat ~/.local/share/flatpak/app/com.google.Chrome/current/active/metadata

然後新增這個override檔案:

vim ~/.local/share/flatpak/overrides/com.google.Chrome

填入以下內容:

[Application]
command=chrome --ozone-platform=auto

理論上這對所有程式應該都有效。

相關文章

Flatpak vs Snap vs AppImage,跨Linux發行版的套件格式比較
分類   Linux系統 Linux使用技巧
標籤   Flatpak Snap AppImage Freedesktop Specifications
管理Linux系統家目錄泛濫成災的dotfile
分類   Linux系統 Linux使用技巧
標籤   Freedesktop Specifications Dotfile Flatpak
Linux應該用何種方法安裝應用程式,談談我的軟體安裝偏好來源
分類   Linux系統 Linux使用技巧
標籤   Flatpak Snap AppImage Freedesktop Specifications

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。