如何從 apt-get Upgrade 中排除特定包

在處理某些項目時,有時您需要環境的穩定性。 更新包可能會導致整個項目失敗。 有時,我們不小心升級了那些軟件包,這會在服務器上造成嚴重問題。 這就是為什麼維護包的特定版本很重要的原因。

本教程將向您展示如何從 Ubuntu 或 Debian 發行版的升級中排除特定軟件包。

另請閱讀: 如何使用 apt-get 安裝特定版本的軟件包

1) 用一些命令排除包

在系統的全面升級過程中,存在一些排除或保留特定包的各種方法。 可以將包裹標記為保留。 在本文中,我們將在示例中使用 virtualbox 包。 可以看到安裝的版本

# dpkg -l | grep virtualbox
ii  virtualbox    5.0.18-dfsg-2build1   amd64   x86  virtualization solution - base binaries

現在您可以看到我們有可用的更新版本

# apt list --upgradable
Listing... Done
virtualbox/xenial-updates 5.0.40-dfsg-0ubuntu1.16.04.2 amd64 [upgradable from: 5.0.18-dfsg-2build1]

您可以使用以下命令標記包

標記

您可以使用 apt-mark 命令後跟 hold 選項。 這將防止軟件包被自動安裝、升級或刪除。 語法如下

apt-mark hold package

您可以實際使用它,如下所示

# apt-mark hold virtualbox 
virtualbox set on hold.

現在你可以檢查如下

# apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

可以看到無法升級包。

要取消標記,請使用以下語法

apt-mark unhold package

實際上你有下面的命令

# apt-mark unhold virtualbox
Canceled hold on virtualbox.

dpkg

您還可以使用 dpkg --set-selection 標記包的命令。語法如下

# echo " hold" | dpkg --set-selections

實際上,您可以按照以下方式進行

# echo "virtualbox hold" | dpkg --set-selections

您沒有任何顯示結果的回報。 所以,直接檢查升級

# apt upgrade
Reading package lists... Done
Building dependency tree 
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
 virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

你可以看到它的工作原理。

現在要取消,命令是不同的,並且遵守語法

echo "package install" | sudo dpkg --set-selections

所以,使用命令

# echo "virtualbox install" | dpkg --set-selections

你不會有回報。 因為我們已經是 root 用戶,所以我們不使用 sudo

資質

您也可以使用 aptitude 命令。 默認情況下,您的系統上不存在此命令,因此您需要按如下方式安裝它

# apt install aptitude
Reading package lists... Done
Building dependency tree 
Reading state information... Done
The following additional packages will be installed:
 aptitude-common libcwidget3v5

要使用命令標記包,請使用語法

aptitude hold package

當你用 aptitude 標記一個包裹時,你沒有回報。

# aptitude hold virtualbox
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

如果你檢查結果 aptitude upgrade, 你不會提到有標記的包,但如果你嘗試,你會得到它 apt upgrade.

您可以使用語法取消保留

aptitude unhold package

就像下面

# aptitude unhold virtualbox
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

選擇

您可以使用 dselect 命令是 dpkg 的前端,用於管理 Debian 和基於 Debian 的 Linux 發行版中的軟件包。 默認情況下它不存在,因此您需要安裝它

# apt install dselect

啟動命令

現在仔細閱讀幫助。

現在您可以使用空格鍵盤退出幫助並找到要保存的包。 您可以使用 /做研究

現在您可以用 H 或者 =

現在你可以退出 Q. 它將打開第一個菜單,選擇退出。 您可以通過升級來檢查

# apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

你可以看到它的工作原理。

如果要取消標記包,則需要使用 + 代替 H 或者 = 曾經在結果上持有三顆星,如下所示

2)使用apt配置文件阻止包

標記包的一種方法是編輯 /etc/apt/preferences 文件。 為了在升級整個系統時不升級包,我們必須設置一個小於零 (0) 的 apt pin 優先級。 如果該文件不存在,則必須創建它。 您需要遵守以下語法

Package: <package-name> ('*' for all packages)
Pin: release * (o=Ubuntu for Ubuntu origin)
Pin-Priority: <less than 0>

在 Release Pin 行上,您可以添加包的創建者,對於 Pin-Priority 編號,較高的數字意味著更多的偏好和 -1 等於忽略那個包。 還有一些其他選項可以使用。

要阻止 virtualbox 包,請編輯文件如下

Package: virtualbox
Pin: release o=Ubuntu
Pin-Priority: -1

保存並退出。 這就是您阻止包裹所需的全部內容。 要取消保留包,您可以註釋文件的行或簡單地刪除文件。

可以看到可以使用一些方法來阻塞一個包。 這對於維護項目的穩定版本非常有用。 您可以選擇您喜歡的方法。 您不需要為同一目標使用兩種或多種方法。