Linux 軟體安裝方式繁多,從傳統套件管理器 (dpkg/rpm、apt/dnf/yum) 到通用打包格式 (Flatpak/Snap/AppImage),再到原始碼編譯、容器部署、語言專用管理器 (pip/npm/cargo/go mod)。本文系統解析各類安裝方式的底層原理、依賴解析機制、沙盒隔離程度、更新策略、優缺點與適用場景,並提供生產環境選型決策矩陣。
一、傳統發布版套件管理器 (原生整合、共享依賴)
| 維度 | dpkg/apt (Debian/Ubuntu) | rpm/dnf/yum (RHEL/Fedora) |
| 底層格式 | .deb (ar + tar + gzip/xz) | .rpm (cpio + gzip/xz/zstd) |
| 依賴解析 | apt (SAT 求解器) | dnf (libsolv SAT 求解器) |
| 資料庫 | /var/lib/dpkg/status | /var/lib/rpm/ (Berkeley DB / SQLite) |
| 共享庫策略 | 系統級共享 (單一版本) | 系統級共享 (模組化 AppStream) |
| 更新頻率 | 穩定版凍結、LTS 5 年 | 穩定版凍結、EPEL 補充 |
| 離線安裝 | dpkg -i pkg.deb | rpm -ivh pkg.rpm |
| 查詢檔案歸屬 | dpkg -S /path/file | rpm -qf /path/file |
核心命令對照速查
# 安裝/更新
apt update && apt install pkg | dnf install pkg
apt upgrade | dnf upgrade
# 移除
apt remove pkg (保留配置) | dnf remove pkg
apt purge pkg (清除配置) | dnf erase pkg
# 搜尋
apt search keyword | dnf search keyword
apt show pkg | dnf info pkg
# 列出已安裝
apt list --installed | dnf list installed
# 查詢檔案屬於哪個套件
dpkg -S /usr/bin/nginx | rpm -qf /usr/bin/nginx
# 下載不安裝
apt download pkg | dnf download pkg
二、通用打包格式 (沙盒隔離、捆綁依賴、跨發布版)
| 特性 | Flatpak | Snap | AppImage |
| 沙盒技術 | Bubblewrap (namespaces + seccomp) | AppArmor + mount namespace | 無強制沙盒 (可選 Firejail) |
| 依賴模型 | Runtime (Freedesktop/KDE/GNOME) + 應用 | Base Snap (core18/20/22) + 應用 | 完全自包含 (單一檔案) |
| 安裝位置 | /var/lib/flatpak (系統) ~/.local/share/flatpak (用戶) | /snap | 任意位置 (可執行檔) |
| 更新機制 | 集中式 (Flathub) + 差異更新 | 集中式 (Snap Store) + 自動背景更新 | 手動下載 / AppImageUpdate (zsync) |
| 桌面整合 | .desktop → $XDG_DATA_DIRS/applications | .desktop → /var/lib/snapd/desktop | 需手動整合 (AppImageLauncher) |
| 權限控制 | Flatseal (圖形) / flatpak permission-* | snap connections / snap set | 無 (執行即全權限) |
| 啟動速度 | 較慢 (FUSE 掛載) | 較慢 (SquashFS 掛載) | 最快 (直接執行) |
| 典型應用 | LibreOffice、GIMP、OBS、Bottles、Flathub 生態 | Firefox、Chromium、VS Code、Docker、Canonical 推廣 | 便攜工具、遊戲、獨立發布、CI 產物 |
操作命令
# Flatpak
flatpak install flathub org.libreoffice.LibreOffice
flatpak run org.libreoffice.LibreOffice
flatpak update
flatpak uninstall org.libreoffice.LibreOffice
flatpak permission-show org.libreoffice.LibreOffice
flatpak permission-set filesystems home org.libreoffice.LibreOffice yes
# Snap
snap install code --classic
snap refresh
snap remove code
snap connections code
snap set code theme=dark
# AppImage
chmod +x App.AppImage
./App.AppImage
# 可選整合
appimaged & # 守護進程自動掃描 ~/Applications / ~/.local/bin
三、語言專用套件管理器 (專案級隔離、非系統級)
| 語言 | 管理器 | 隔離工具 | 安裝位置 | 生產建議 |
| Python | pip / uv | venv / virtualenv / conda / poetry / pdm | ~/.local / 專案 venv | 生產用 pipx (CLI) / poetry export 鎖定版本 |
| Node.js | npm / yarn / pnpm | node_modules (專案級) / nvm / fnm / volta | 專案 node_modules | 生產用 pnpm (硬連結節省空間) + npm ci |
| Rust | cargo | 專案獨立 (Cargo.lock) | ~/.cargo / target/ | 靜態連結預設,單一二進位部署最簡單 |
| Go | go mod | 模組快取 (~/.cache/go-build) | 專案 vendor/ (可選) | 編譯靜態二進位,無運行時依賴 |
| Java | Maven / Gradle | ~/.m2 / ~/.gradle | 本地倉庫 | 打包 Fat JAR / GraalVM Native Image |
四、容器化部署 (終極隔離、不可變基礎設施)
# Docker / Podman
docker run -d --name app -p 8080:80 myorg/myapp:1.2.3
# systemd 管理容器 (Quadlet / Podman systemd)
# Kubernetes (生產標準)
優點:完全隔離、依賴鎖定、跨環境一致、滾動更新/藍綠部署。缺點:儲存/網路開銷、除錯複雜、需容器編排知識。
五、原始碼編譯 (極致客製化、效能優化、無套件時)
# 標準 Autotools
./configure --prefix=/opt/myapp --enable-feature
make -j$(nproc)
make install
# CMake
cmake -B build -DCMAKE_INSTALL_PREFIX=/opt/myapp -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
cmake --install build
# 追蹤檔案以便移除
# 使用 checkinstall / stow / xstow 管理
六、生產環境選型決策矩陣
| 場景 | 首選 | 備選 | 避免 |
| 系統基礎服務 (SSH、Nginx、MySQL、Docker) | 發布版原生套件 (apt/dnf) | 官方 Repository (MySQL APT/Yum) | Flatpak/Snap/AppImage/容器 |
| 桌面端使用者應用 (瀏覽器、編輯器、媒體播放器) | Flatpak (Flathub) | Snap / 官方 .deb/.rpm | AppImage (整合差)、原始碼編譯 |
| 伺服器端應用服務 (Java Web、Go 微服務、Python API) | 容器映像 (Docker/Podman) + K8s | 語言專用打包 (Fat JAR/Go Binary/venv) | 系統套件 (版本過舊)、Flatpak |
| CI/CD 暫存工具 / 單一用途 CLI | AppImage / 靜態二進位 | pipx / cargo install / go install | 系統套件 (污染環境) |
| 跨發布版分發閉源商業軟體 | AppImage / Flatpak | Snap (若目標 Ubuntu) | 原始碼 / .deb/.rpm 多版本維護 |
| 嵌入式/極簡環境 (Alpine/Distroless) | 靜態編譯 / musl libc / apk | 容器多階段建構 | glibc 依賴、systemd、大型 Runtime |
七、混合環境管理策略
- 系統層:僅用發布版套件管理器 (apt/dnf) 維護核心服務、核心庫、硬體驅動。
- 用戶層:Flatpak (Flathub) 管理桌面應用,享受沙盒隔離與自動更新。
- 專案層:語言專用管理器 (poetry/pnpm/cargo/go mod) + 專案鎖檔,構建容器映像部署。
- 臨時/攜帶層:AppImage 放入
~/Applications 或 ~/.local/bin,appimaged 自動整合。
- 版本鎖定:
apt-mark hold pkg / dnf versionlock pkg / flatpak mask org.app//stable / snap refresh --hold pkg。
理解各安裝方式的設計哲學與權衡,建立分層治理策略,即可在「系統穩定、應用最新、專案隔離、部署一致」四大目標間找到最佳平衡點。