Linux系統用久了,就會有氾濫成災的dotfile。
劉德華 - 相思成災
你打開用了多年的Linux系統檔案總管,進入家目錄,點選顯示隱藏檔案
映入眼簾的可能是這種慘況,應用程式到處亂丟dotfile和空白的資料夾。
關掉檔案總管,你默默的說:假的!我眼睛業障重呀。
…不對,他們還是在那裡。讓我們來討論要如何解決應用程式亂丟dotfile的問題。
這個議題在英文圈也多有討論,通常稱作home directory dotilfe pollution、dotfile littering in home directory…
1. 什麼是dotfile,問題在哪#
dotfile,通俗的講,就是寫著應用程式設定檔的檔案。
程式多半會將設定檔寫到設定檔裡面,再於檔案名稱前面加個點,隱藏檔案。
設定檔要放在哪裡,開源社群多半有默契,遵守Freedesktop.org所制定的XDG規範(後述)
但,XDG標準畢竟不是強迫性的,開發者沒有遵守的義務,這就導致了dotfile亂放的問題。就是在說你啦,Java、Android Studio、AWS cli、Visual Studio Code。
有些程式開發者可能認為,使用者只會在一台Linux伺服器幹一件事而已,故沒有詳細考慮dotfile的位置。時間久了為了相容性也就忘記改,給桌面Linux使用者帶來困擾。
很多程式都不按照XDG標準,亂丟檔案呀!於是有了文章一開始見到的慘況。Linux不是一人開發的產品,每個開發者的意見不同,設定檔位置就會一團混亂,氾濫成災。
本文不是要討論 如何備份dotfile,而是針對這些應用程式亂丟dotfile的對策。
2. 了解XDG標準的路徑#
Freedesktop.org制定的一系列XDG標準可作為應用程式放置檔案路徑的參考。
Arch Wiki對此有詳細解釋: XDG Base Directory,Wiki頁面甚至列出了不遵守XDG標準的調皮程式。
大部分桌面環境遵守XDG標準,不用特別設定環境變數。
下面講幾個比較重要的:
XDG_CONFIG_HOME
設定檔放置的目錄,應為~/.config
XDG_CACHE_HOME
快取存放路徑,應為~/.cache
XDG_DATA_HOME
使用者資料存放路徑,跟設定檔不同,使用者資料應該是偏資料庫那一類的。路徑應為~/.local/share
XDG_STATE_HOME
使用者狀態檔放置路徑,應為~/.local/state
3. 對程式亂丟dotfile的對策#
如果你的家目錄已經一堆dotfile,遷移時務必注意備份檔案。
3.1. 將程式容器化#
以容器技術打包的程式可以有效控管應用程式亂丟dotfile的問題。
Flatpak:程式通常會將設定檔統一放到~/.vars
自身的目錄下。如果還是有程式檔案不聽話跑出來,那就用
Flatseal鎖住其存取家目錄的權限。
Snap:同上,不過權限系統不明朗。
AppImage:嚴格來說AppImage不是容器,但是它有一個 Portable Mode功能可以偽裝成程式的家目錄,把程式的dotfile鎖在裡面。
Distrobox:利用Docker容器特性,隔離應用程式目錄。Distrobox有指定程式家目錄的效果。
FireJail:容器化的做法,實行起來很麻煩。
Chroot:最古老的容器做法,設定起來很麻煩。
3.2. 手動於程式指定路徑#
編輯程式的Desktop Entry檔案,修改啟動參數。
例如Chrome可以用參數調整設定檔目錄。
google-chrome --user-data-dir=/home/user/.config/google-chrome/default
不推薦,不是每個程式都有參數讓你調。
3.3. 程式攔截系統呼叫#
Libetc或rewritefs的解決方案。
可能導致系統出現預期外的行為。
3.4. 符號連結#
把dotfile移到其他地方去,再於原處建立symlink。
其實沒差就是了,檔案看上去還是一樣亂。如果你偏要這樣做,那還不如安裝個 dotfile管理程式來統一整理。
3.5. 一個程式一個使用者帳號#
比如,執行某伺服器服務的時候,就用su指令切換到該使用者帳號,任其往家目錄傾倒dotfile,與現有使用者的家目錄隔開。
太搞剛,單人桌面系統不要這樣搞。現在有Docker容器技術,要跑服務方便多了。