APT 幾乎是 Ubuntu / Debian 系 VPS 的基本功,但很多人只會 apt install,遇到套件版本、來源、相依性或更新卡住時就不知道怎麼辦。這篇會把 APT 最常用、最實用的操作一次整理給你。
你如果不想每次都只是照著別人的畫面一步一步跟著按,卻不知道自己到底改了什麼,這篇會比較適合你。重點不是讓你背流程,而是讓你下次遇到類似情況時,還知道該怎麼自己判斷。
你會學到什麼
- 看懂 APT 日常安裝、更新、移除指令的差別。
- 知道怎麼查套件資訊與版本。
- 遇到依賴衝突、安裝失敗時,有完整排查與修復方向。
- 理解 apt 與 apt-get 的差異,選對工具用在對的場合。
- 學會版本鎖定(Pinning)與 PPA 管理。
什麼情況最適合先看這篇
- 第一次自己管理 Linux 主機,想把操作做穩而不是只會貼指令的人
- 你現在正要處理「Linux APT」這類操作
- 你希望做完之後不只功能能用,連驗證與排錯也有概念
開始前先確認
- 確認你的系統是 Ubuntu 或 Debian 系。
- 登入有 sudo 權限的帳號。
- 重要正式環境先避開尖峰時段更新。
先提醒你一件事
VPS 最怕的不是不會下指令,而是你不知道指令會影響到哪個服務、哪個設定檔、哪個對外連線。
詳細教學與操作步驟
本文將教你如何使用 APT (Advanced Package Tool),這是 Ubuntu 與 Debian 系統上最強大且最常用的軟體包管理工具,幫助你輕鬆安裝、更新與移除伺服器上的程式。
為什麼 APT 是 VPS 新手的必修課?
在 Linux 伺服器中,你不會像 Windows 一樣下載 .exe 檔案來安裝程式。大部分的軟體都存放在雲端的「軟體庫 (Repository)」中。APT 就像是 Linux 版的 App Store,只要簡單的一行指令,就能自動幫你下載、安裝並解決所有相依性問題。在侃瑞科技的 VPS 伺服器 中,你可以隨意使用這些指令來建構你的理想環境。
apt 與 apt-get 到底差在哪裡?
你一定在教學文中看過這兩種寫法交替出現。簡單說:
apt是比較新的前端介面,整合了apt-get、apt-cache、apt-mark等多個工具的常用功能,輸出也比較好看(有進度條),適合日常互動操作。apt-get是底層工具,行為更穩定、輸出格式更一致,適合寫在自動化腳本(shell script、cron job)中。
實務建議:在 SSH 手動操作時用 apt,寫腳本自動化時用 apt-get。功能上兩者幾乎完全對應,不需要刻意只學一邊。
| 操作 | apt | apt-get / apt-cache |
|---|---|---|
| 更新清單 | apt update | apt-get update |
| 升級套件 | apt upgrade | apt-get upgrade |
| 安裝 | apt install pkg | apt-get install pkg |
| 移除 | apt remove pkg | apt-get remove pkg |
| 搜尋 | apt search keyword | apt-cache search keyword |
| 查看套件資訊 | apt show pkg | apt-cache show pkg |
| 列出可升級 | apt list --upgradable | (無直接對應) |
最常用的 APT 指令
- 更新軟體清單:
sudo apt update(這不會更新軟體,只是更新「有哪些軟體可以下載」的清單)。 - 升級所有已安裝軟體:
sudo apt upgrade -y(這才是真正的更新版本動作)。 - 完整升級(含相依性變更):
sudo apt full-upgrade -y(會自動移除不再需要的舊依賴,適合大版本更新)。 - 安裝新程式:
sudo apt install 套件名稱 -y(例如安裝文字編輯器:sudo apt install vim -y)。 - 移除程式:
sudo apt remove 套件名稱。 - 完全清除程式與其設定:
sudo apt purge 套件名稱。 - 搜尋套件:
apt search 關鍵字。 - 查看套件詳細資訊:
apt show 套件名稱。
查看套件版本與來源
安裝前想知道可用的版本:
# 查看某套件所有可用版本與來源優先度
apt policy nginx
# 查看已安裝套件的版本
dpkg -l | grep nginx
# 安裝指定版本
sudo apt install nginx=1.24.0-1ubuntu1
apt policy 輸出中的數字越大代表優先度越高,系統會優先安裝該來源的版本。
系統清理與空間回收
隨著安裝與更新的次數增加,伺服器中會累積許多不再需要的舊檔案。你可以定期執行以下指令來釋放硬碟空間:
- 自動移除不再需要的相依套件:
sudo apt autoremove - 清除已下載的安裝檔緩存:
sudo apt clean - 只清除過期的緩存(保留最新版本):
sudo apt autoclean
建議把清理指令加入 cron 排程,例如每週日凌晨自動執行:
# 編輯 crontab
crontab -e
# 加入以下行
0 4 * * 0 sudo apt autoremove -y && sudo apt autoclean
依賴衝突處理
這是 APT 使用者最常卡住的問題。當你看到類似 The following packages have unmet dependencies 的錯誤時,不要慌。
情境一:安裝時遇到依賴不滿足
# 第一步:嘗試修復中斷的安裝
sudo apt --fix-broken install
# 第二步:如果還是不行,更新清單後重試
sudo apt update
sudo apt --fix-broken install
情境二:套件版本互相衝突
# 查看哪些套件互相衝突
apt depends 套件名稱
apt rdepends 套件名稱
# 模擬安裝(不會真的裝),看看會發生什麼
apt install -s 套件名稱
# 強制指定版本解決衝突
sudo apt install libfoo=1.2.3-1 libbar=2.0.0-1
情境三:dpkg 被中斷
有時候安裝到一半斷線或系統出狀況,dpkg 的狀態會壞掉:
# 重新設定所有未完成的套件
sudo dpkg --configure -a
# 然後再修復
sudo apt --fix-broken install
情境四:鎖定檔佔用
如果看到 Could not get lock /var/lib/dpkg/lock-frontend:
# 先確認是否有其他 apt 進程在跑
ps aux | grep -i apt
# 如果確認沒有(例如是上次中斷殘留),才手動清除
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/apt/lists/lock
sudo dpkg --configure -a
版本鎖定(Pinning)
有時候你需要某個套件停在特定版本,例如你的應用只相容 PHP 8.1,不想被自動升級到 8.3。
方法一:用 apt-mark hold
# 鎖定套件版本
sudo apt-mark hold php8.1-fpm
# 查看所有被鎖定的套件
apt-mark showhold
# 解除鎖定
sudo apt-mark unhold php8.1-fpm
方法二:用 APT Preferences(進階 Pinning)
建立 /etc/apt/preferences.d/pin-php 檔案:
Package: php8.1*
Pin: version 8.1.*
Pin-Priority: 1001
Pin-Priority 說明:
- 1001+:強制安裝此版本,即使降級也會執行
- 990:預設安裝的版本優先度
- 500:一般正式倉庫的預設值
- 100:已安裝套件的預設值
- -1:永不安裝此版本
管理第三方軟體源 (PPA)
有時候官方軟體庫的版本太舊,你需要使用 PPA。但 PPA 不能亂加,否則版本衝突很難排。
新增 PPA
# 例如安裝最新的 PHP 版本
sudo add-apt-repository ppa:ondrej/php
sudo apt update
查看目前系統所有軟體源
# 列出所有啟用的來源
grep -r "^deb " /etc/apt/sources.list /etc/apt/sources.list.d/
# 或者用 apt 的方式
apt policy
移除 PPA
# 移除 PPA(同時會還原該 PPA 安裝的套件版本)
sudo add-apt-repository --remove ppa:ondrej/php
sudo apt update
**安全性考量:**每個 PPA 都是由第三方維護者提供的,加入前先確認維護者的信譽。正式環境不建議使用來路不明的 PPA,優先選擇官方維護或知名開源社群的來源。
進階:Unattended Upgrades 自動安全更新
正式環境建議啟用安全更新自動安裝,這樣就算你忘了手動更新,重大漏洞修補也不會漏掉:
# 安裝自動更新套件
sudo apt install unattended-upgrades -y
# 啟用自動安全更新
sudo dpkg-reconfigure -plow unattended-upgrades
設定檔在 /etc/apt/apt.conf.d/50unattended-upgrades,你可以調整:
// 只允許安全更新(預設行為)
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
// 自動清理舊核心
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
// 自動移除不需要的依賴
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// 需要重開機時自動重開(視需求開啟)
// Unattended-Upgrade::Automatic-Reboot "true";
// Unattended-Upgrade::Automatic-Reboot-Time "04:00";
檢查自動更新是否正常運作:
# 模擬執行
sudo unattended-upgrades --dry-run --debug
# 查看更新紀錄
cat /var/log/unattended-upgrades/unattended-upgrades.log
常見問題
Q:執行 apt 時出現 "Could not get lock" 錯誤?
這通常是因為系統背景正在自動檢查更新,或者是你有另一個終端機正在執行 apt 指令。先用 ps aux | grep apt 檢查,如果確認沒有其他進程,才手動刪除 lock 檔。更多 Linux 基礎操作可參考我們的 VPS 快速入門指南。
Q:如果不小心刪錯重要的系統套件怎麼辦? 這非常危險。建議在進行重大操作前,先利用我們 VPS 的 自動備份功能 建立一個還原點,這樣即使系統掛掉也能快速救回。
Q:apt update 出現 GPG 金鑰錯誤? 這代表某個軟體源的簽名金鑰過期或遺失。解法是重新匯入金鑰:
# 查看是哪個來源出問題
sudo apt update 2>&1 | grep "NO_PUBKEY"
# 匯入遺失的金鑰(替換 KEY_ID)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys KEY_ID
Q:upgrade 和 full-upgrade 差在哪?
upgrade 只會更新已安裝的套件,不會移除任何東西。full-upgrade 會處理依賴關係的變更,可能會移除不再需要的舊套件或安裝新依賴。一般日常用 upgrade,大版本更新時用 full-upgrade。
Q:怎麼知道哪些套件有安全更新?
# 列出所有可升級的套件
apt list --upgradable
# 只看安全更新(需要 unattended-upgrades)
sudo unattended-upgrades --dry-run 2>&1 | grep "Packages"
做完後怎麼確認自己真的有設對
- 安裝完套件後,用
dpkg -l | grep 套件名確認版本正確。 - 用
systemctl status 服務名確認新安裝的服務確實有啟動。 - 重新登入後再跑一次
apt update,確認沒有殘留的錯誤訊息。 - 如果改了軟體源或 Pinning,用
apt policy 套件名確認優先度符合預期。
這一題最常踩的坑
- 看到更新就全部直接升,沒有先看會不會影響服務。
- 混用太多第三方來源,後面版本衝突很難排。
- 套件裝完不確認服務是否真的起來。
- 遇到依賴衝突就直接
--force硬裝,結果把系統搞壞。 - 在腳本裡用
apt而不是apt-get,偶爾會出現非預期行為。
如果你要往下一步走
如果你準備部署應用,做完 APT 基礎後很適合接著看 Docker 安裝教學 或 Nginx 與 PHP 教學。想了解更多系統管理操作,可以參考 Linux 基本系統管理指令教學。如果你準備開始自己架服務,可以直接對照侃瑞的 VPS 方案與價格 選環境。