萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

dpkg 底層包管理實戰:.deb 安裝、查詢、檢查、強制操作與 APT 協作

定位:APT 的後端引擎

dpkg 是 Debian 系系統的底層包管理器,直接操作 .deb 文件與 /var/lib/dpkg/status 數據庫。它不自動解決依賴、不從遠程倉庫下載。日常運維請優先使用 apt/apt-get;dpkg 用於:手動安裝本地 .deb、查詢已安裝包細節、強制修復損壞狀態、構建/檢查 .deb 內容。

核心操作分類

1. 安裝與移除 (需 root)

# 安裝本地 .deb (不解決依賴, 失敗會標記為 "半安裝" 狀態)
dpkg -i package.deb
dpkg -i *.deb  # 批量安裝當前目錄所有 deb

# 修復缺失依賴 (關鍵後續步驟)
apt-get install -f  # 或 apt --fix-broken install

# 移除包 (保留配置文件)
dpkg -r package_name

# 徹底清除 (含配置文件)
dpkg -P package_name  # --purge

# 強制操作 (慎用!)
dpkg -i --force-depends package.deb   # 忽略依賴版本衝突
dpkg -i --force-overwrite package.deb # 強制覆蓋屬於其他包的檔案
dpkg -r --force-depends package_name  # 強制移除被依賴的包
dpkg --force-all -i package.deb       # 核武器級,極度危險

2. 查詢與檢查 (無需 root)

# 列出已安裝包 (支援通配符)
dpkg -l 'nginx*'  # ii 狀態 = 安裝正常, rc = 已移除但留配置

# 查看包詳細信息 (類似 rpm -qi)
dpkg -s package_name
dpkg -p package_name  # 顯示控制文件完整內容

# 列出包安裝的所有文件路徑
dpkg -L package_name

# 查看 .deb 包內容 (不安裝)
dpkg -c package.deb   # 文件列表
dpkg -I package.deb   # 控制信息 (版本、依賴、描述、維護者)

# 搜索文件屬於哪個包
dpkg -S /path/to/file  # 精確匹配
dpkg -S '/usr/bin/*'   # 模糊匹配

3. 狀態碼解讀 (dpkg -l 輸出首欄)

代碼期望狀態當前狀態含義
iiInstallInstalled✅ 正常安裝
rcRemoveConfig-files⚠️ 已移除,殘留配置文件 (需 dpkg -P 清理)
hiHoldInstalled🔒 被 hold 阻止升級
piPurgeInstalled⚠️ 被標記清除但尚未執行
unUnknownNot-installed未安裝
iuInstallUnpacked⚠️ 解包完成,配置腳本失敗 (半安裝)
ufUnpackFailed-config❌ 配置腳本失敗
hhHoldHalf-installed🔒 半安裝且被 hold

4. 修復損壞狀態 (黃金修復流程)

# 1. 掃描問題
dpkg -C  # 審計,列出需修復的包

# 2. 強制配置待配置包
dpkg --configure -a

# 3. 修復依賴關係
apt-get install -f

# 4. 若特定包損壞,嘗試重新安裝修復
apt-get install --reinstall 

# 5. 極端情況:手動清理 /var/lib/dpkg/info/ 下該包腳本,再強制移除
# mv /var/lib/dpkg/info/problematic.* /tmp/
# dpkg --remove --force-remove-reinstreq problematic-package

進階:.deb 結構與自製包

# 解包 .deb (不安裝)
dpkg-deb -x package.deb /target/dir      # 解壓文件系統
dpkg-deb -e package.deb /target/dir/DEBIAN # 解壓控制信息
# 或一步到位
dpkg-deb -R package.deb /target/dir

# 重新打包
dpkg-deb -b /target/dir new_package.deb

# 檢查 .deb 結構
ar t package.deb
# debian-binary  control.tar.xz  data.tar.xz

與 APT 協作最佳實踐

  1. 下載 .deb 不安裝:apt download nginx (下載到當前目錄,含依賴用 apt download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances nginx | grep "^\w" | sort -u))。
  2. 離線安裝:將下載的 .deb 複製到目標機 → dpkg -i *.deb → apt-get install -f。
  3. 鎖定版本防升級:apt-mark hold nginx (取消 apt-mark unhold nginx)。
  4. 查看可用版本:apt-cache madison nginx / apt policy nginx。

總結

dpkg 是基石,apt 是大廈。日常用 apt 享受依賴自動解決;遇到 dpkg 錯誤 (半安裝、檔案衝突、鎖定) 時,用 dpkg -C、--configure -a、--force-overwrite 精準手術刀修復;需離線/自製包時,用 dpkg-deb 拆解重組。理解 ii/rc/iu 狀態碼,是診斷包管理健康度的體溫計。

copyright © 萬盛學電腦網 all rights reserved