快轉到主要內容

無法開啟檔案?用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
Ubuntu維持中文界面,將家目錄下的資料夾改成英文 (xdg-user-dirs-update用法)
分類   Linux系統 Linux使用技巧
標籤   Linux Freedesktop Specifications

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

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