# [[Linux]] AppImage:單一檔案就能搞定桌面應用程式部署方式 在 Windows 系統中安裝程式,通常會想到這些步驟: 1. 下載 `.exe` 或 `.msi` 安裝檔 2. 點擊「下一步、下一步、完成」 3. 實際上不太清楚程式安裝在哪裡(登錄檔 + 四散的檔案) 然而,在 [[Linux]] 中,有一種與之截然不同、在 Windows 上幾乎看不到的應用程式部署方式,那就是 **AppImage (AppImage)**。 就像在行動裝置上,只需下載一個 APK 檔案即可執行應用程式一樣,在 [[Linux]] 中,您也能**僅憑一個檔案就執行完整的桌面應用程式**。這種方式無需安裝過程,也無需套件管理器,只需管理「一個可執行檔案」即可。 本文將一次性為您整理: * AppImage **是什麼** * 為何對 **Windows 使用者來說既陌生又具吸引力** * 以及 **如何在 Linux 中管理 AppImage**(特別是利用 `/opt`) --- ## AppImage 是什麼? {#sec-516aabf79f95} 簡而言之: > **AppImage = 將應用程式 + 所需函式庫捆綁成一個「可執行單一檔案」** 換句話說,它是一種將執行某個應用程式所需的一切盡可能地打包進去,並將整個集合製作成**一個可執行檔**進行分發的格式。 使用方法也極為簡單。 ```bash # 1. 下載 AppImage 檔案 $ ls MyApp-1.0-x86_64.AppImage # 2. 授予執行權限 $ chmod +x MyApp-1.0-x86_64.AppImage # 3. 執行 $ ./MyApp-1.0-x86_64.AppImage ``` 就這麼簡單。「安裝」這個概念幾乎不存在,如果想刪除,直接刪除該檔案即可。 如果與 Windows 相比,它類似於**免安裝(Portable)應用程式**,但 AppImage 更像是將其打造成**[[Linux]] 桌面生態系統的標準格式**。 --- ![AppImage 概念圖](/media/whitedec/blog_img/56a402b8c81a468a9fba25fca6e14988.webp) ## 為何對 Windows 使用者來說很陌生? {#sec-01e86caebfff} Windows 的傳統方式是: * 安裝程式會 * 將檔案複製到系統資料夾 * 在登錄檔中新增鍵值 * 註冊開始功能表、服務、驅動程式等各種項目 從使用者的角度來看,就是「明明只是安裝了程式,作業系統某處卻多了一堆東西」的狀態。 然而,AppImage 則是: * **沒有登錄檔** * **不碰觸系統目錄** * **未在套件管理器中註冊** 它以**一個完全獨立的檔案**存在。無論放在哪裡,只要有這個檔案就能執行。 > 如果說 Windows 是「我最不清楚自己電腦裡安裝了什麼的作業系統」, > 那麼 AppImage 則是在檔案層面呈現「我的應用程式就在這裡」的方式。 這一點也與 [[Linux]] 的哲學不謀而合。 * 「一切皆檔案」 * 「比起自動化魔術,更偏好使用者能理解的結構」 AppImage 提供了一個非常簡單的模型:「應用程式 = 一個檔案」。 --- ## AppImage 的優點:為何如此方便? {#sec-8a5af0e4123a} 整理一下會喜歡 AppImage 的原因: ### 1. 沒有安裝過程 {#sec-1865f0f3a944} * 未在套件管理器中註冊 * 不會偷偷複製任何東西到 `/usr/bin`、`/usr/lib` 等位置 * 沒有登錄檔之類的東西 它就只是一個「可執行檔案」而已。 ### 2. 刪除/整理極為容易 {#sec-4a100ca49b34} * 用一用不喜歡? → 直接刪除檔案 * 無需擔心「這個應用程式在我的系統裡留下了什麼?」 當然,設定檔可能會在 `~/.config` 等位置產生,但至少**執行檔本身是完全可見的**。 ### 3. 易於避免依賴地獄 (Dependency Hell) {#sec-db0637e0082c} AppImage 通常會自行包含執行所需的函式庫。因此: * 不同發行版 glibc 版本不同 * `libXxx.so` 版本不匹配 這些問題通常在 **AppImage 內部已得到一定程度的解決**後才發布。從使用者的角度來看,可以稍微減少「這個應用程式在我的發行版上也能執行嗎?」的擔憂。 ### 4. 無需 Root 權限 {#sec-02fd711bb81e} 大多數情況下: * 使用者下載 * 授予權限 (`chmod +x`) * 直接執行 就完成了。由於不會將任何東西複製到系統目錄,因此**無需 sudo 也能充分使用**。 --- ## 缺點也存在:與套件管理器的權衡 {#sec-f3cac4e41a7f} 當然,AppImage 並非萬能。其主要缺點是: * **難以集中管理** * 無法在套件管理器 (apt, pacman, dnf 等) 中一覽版本/更新狀況 * **更新方式各異** * 有些 AppImage 具有自帶更新功能,但許多則沒有 * **磁碟使用量增加** * 每個 AppImage 都包含函式庫,因此重複的部分可能會增多 因此,比起「所有應用程式都使用 AppImage」,更實際的做法是選擇性地使用 AppImage,例如針對: * 安裝過程繁瑣的應用程式 * 希望在多個發行版上都能使用的應用程式 * 不常用工具、實驗性應用程式 --- ## AppImage 應該放在哪裡?管理策略 {#sec-584e8ff8a715} 現在,讓我們來談談實際問題。**AppImage 檔案應該放在哪裡,又該如何管理?** 每個 Linux 使用者有不同的風格,但大致上有兩種主要方式。 ### 1. 直接放在家目錄中 (`~/Apps`、`~/bin` 等) {#sec-e89628d037d9} 我剛開始使用 [[Linux]] 時也是如此。 * `~/apps/MyApp/MyApp.AppImage` * 直接放在 `~/Downloads` 中執行 * 隨時創建資料夾進行整理 **優點** * 無需 root 權限 * 如果是「個人專用機器」,這樣做其實也沒什麼大問題 **缺點** * 如果有多個使用者帳戶,則無法共享 * 日後整理時,可能會混淆「這是 AppImage 嗎?這個資料夾是什麼?」 * 從 Linux 檔案系統的角度來看,「系統共用應用程式」與「我的個人資料」會混雜在一起 對於個人筆記型電腦來說,這不是個壞方法,但如果想以更**「[[Linux]] 風格」**的方式管理,那麼以下方法會更適合。 ### 2. 在 `/opt` 下以應用程式專屬目錄進行管理 {#sec-d7d03525e948} 這也是我偏好的方式。 1. 為每個應用程式在 `/opt` 下創建一個獨立的目錄 2. 將 AppImage 檔案放入該目錄中 3. 適當設定權限和群組,以便多個使用者帳戶共享 例如,如果要管理 `MyApp.AppImage`: ```bash # 1. 創建應用程式專屬目錄 sudo mkdir -p /opt/myapp # 2. 移動 AppImage sudo mv ~/Downloads/MyApp-1.0-x86_64.AppImage /opt/myapp/myapp.AppImage # 3. 授予執行權限 sudo chmod 755 /opt/myapp/myapp.AppImage ``` 如果希望在系統任何地方都能透過 `myapp` 命令執行: ```bash sudo ln -s /opt/myapp/myapp.AppImage /usr/local/bin/myapp ``` 這樣一來: * **實際執行檔位置:** `/opt/myapp/myapp.AppImage` * **PATH 中可用的命令:** `/usr/local/bin/myapp` 就整理好了。 #### 如果想更嚴格地管理權限 例如,如果只想授予特定群組執行權限: ```bash # 創建 myapps 群組 sudo groupadd myapps # 變更目錄和檔案的群組為 myapps sudo chown -R root:myapps /opt/myapp # 僅限擁有者/群組可執行 (阻止其他人) sudo chmod 750 /opt/myapp/myapp.AppImage sudo chmod 750 /opt/myapp ``` 現在,只有屬於 `myapps` 群組的使用者才能執行此 AppImage。 ```bash sudo usermod -aG myapps alice sudo usermod -aG myapps bob ``` 這種方式的優點是: * **與 [[Linux]] 檔案系統的設計理念高度契合** * `/opt` 用於放置「不包含在發行版套件中的應用程式」 * 多個使用者帳戶可以共享同一個應用程式 * 可以利用權限/群組,在檔案系統層級控制「誰可以使用哪個應用程式」 --- ## 與桌面環境整合 (.desktop 檔案) {#sec-04643b9eaa92} 如果不想僅將 AppImage 作為檔案使用,而希望它也能顯示在 GNOME/KDE 等桌面環境的選單中,只需創建一個 `.desktop` 檔案即可。 例如: `~/.local/share/applications/myapp.desktop`: ```ini [Desktop Entry] Type=Application Name=My App Exec=/opt/myapp/myapp.AppImage Icon=/opt/myapp/icon.png Terminal=false Categories=Utility; ``` 這樣設定後: * 「My App」將會顯示在應用程式選單中 * 點擊後會執行 `/opt/myapp/myapp.AppImage`。 如果希望在整個系統中可見,則可將其放置在 `/usr/share/applications/` 下。這也與套件管理器無關,**只需新增/刪除檔案即可**,因此管理非常簡單。 --- ## 總結:「單一檔案」中蘊含的 [[Linux]] 哲學 {#sec-032a7eba661f} AppImage 本身就是一種充分體現 Linux 哲學的部署方式。 * **透明性** * 應用程式在哪裡、執行了什麼,都能以檔案為單位清晰可見。 * **使用者主導** * 安裝程式不會任意更改系統,而是由使用者自行決定檔案存放位置。 * **簡潔性** * 安裝/移除不再是複雜的魔法,而是回歸到「複製/刪除檔案」的層次。 這是在 Windows 中不常見的模型。對於厭倦了「一安裝就感覺作業系統某處堆積了東西」的人來說,AppImage 可能會帶來耳目一新的感受。 如果您開始使用 AppImage: * 最初可以將其直接放在家目錄下使用 * 稍微熟悉後,建議整理到 `/opt/應用程式名稱` 下 * 並嘗試整合群組權限、符號連結和 `.desktop` 檔案。 僅僅做到這些,您就能非常清楚地理解並掌控: * **您的系統中部署了哪些應用程式,以及是如何部署的** * **誰可以存取哪些應用程式** 我個人認為,這正是使用 Linux 的其中一個原因。 **延伸閱讀** - [[Linux]] `/usr` 目錄:是 'User' 還是 'Unix System Resources' 的縮寫?](/ko/whitedec/2025/12/5/linux-usr-directory-identity/)