通常在我的 Ubuntu 16.04 LTS 上,我使用 APT-pin 功能锁定软件包版本。
例如,如果我想固定meld
到版本1.5.3-1ubuntu1我创建了以下 pin 文件:
cat <<EOF | sudo tee /etc/apt/preferences.d/pin-meld
Package: meld
Pin: version 1.5.3-1ubuntu1
Pin-Priority: 1337
EOF
此文件适用于系统范围的设置:apt
、、apt-get
以及aptitude
GUI 工具(例如)synaptic
并muon
尊重它。
我知道其他机制 - apt-mark
。让我们假设。我的出发点 - 我已经手动安装了meld_1.5.3-1ubuntu1,其引脚已被移除。
$ apt-mark showhold
$ apt-cache policy meld
meld:
Installed: 1.5.3-1ubuntu1
Candidate: 3.14.2-1
Version table:
3.14.2-1 500
500 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
500 http://archive.ubuntu.com/ubuntu xenial/universe i386 Packages
*** 1.5.3-1ubuntu1 100
100 /var/lib/dpkg/status
然后我拿着安装好的版本。
$ sudo apt-mark hold meld
meld set on hold.
$ dpkg -l | grep meld
hi meld 1.5.3-1ubuntu1 all graphical tool to diff and merge files
APT-mark 显示它处于暂停状态。但是apt-cache policy meld
没有变化
$ apt-cache policy meld
meld:
Installed: 1.5.3-1ubuntu1
Candidate: 3.14.2-1
Version table:
3.14.2-1 500
500 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
500 http://archive.ubuntu.com/ubuntu xenial/universe i386 Packages
*** 1.5.3-1ubuntu1 100
100 /var/lib/dpkg/status
apt-get upgrade
报告meld
称被阻止:
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
meld
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
但如果我aptitude
以交互模式meld
启动,可升级的软件包:
Actions Undo Package Resolver Search Options Views Help
C-T: Menu ?: Help q: Quit u: Update g: Preview/Download/Install/Remove Pkgs
aptitude 0.7.4
--\ Upgradable Packages (1)
--\ gnome - The GNOME Desktop Environment (1)
--\ universe - Unsupported Free Software. (1)
ih meld 1.5.3-1ubuntu1 3.14.2-1
如果我无意中选择了操作 -> 取消待处理的操作暂停将被取消。
据我所知,synaptic
忽略apt-mark
标记,其锁定版本功能的工作方式不同。
meld
在此处列出已安装(可升级)。标记所有升级按钮不会自动选择它,但包可能会被意外升级标记为升级。
Muon 的工作方式与 相同,由 持有apt-mark
。但有趣的是它的选项锁定当前版本将 pin 文件写入/etc/apt/preferences.d/meld
。
我是否正确理解了 APT-pin 比 更可靠apt-mark
?
答案1
是的,固定比更可靠apt-mark
。
我的发现:
过去 12-14 年 Synaptic 使用自己的固定文件 (/var/lib/synaptic/preferences) - 请参阅启动板上的错误 42178。对于系统范围,可能需要在
/etc
和 Synaptic之间设置符号链接sudo ln -s /etc/apt/preferences.d/synaptic /var/lib/synaptic/preferences
所以它是一种解决方法,在 Synaptic 中锁定版本不是推荐的方法(此文件不会被
apt-get
和读取aptitude
)。Muon 在每个应用程序中使用系统范围的 pin 文件
/etc/apt/preferences.d
。aptitude
有两个错误:- 在 14.04 LTS 上它没有完全遵守
apt-mark
(见我在启动板上发现了一个 bug 1747189)。 - 在 16.04 LTS 上,由设置的保留
apt-mark
在点击后丢失操作 -> 取消待处理的操作(看我在启动板上发现了一个 bug 1747191)。
但在 18.04 LTS 中
aptitude
没有这样的 bug,很棒。- 在 14.04 LTS 上它没有完全遵守
所以我的结论如下:apt-mark
仅当您使用 安装/删除/升级软件时才可用apt-get
,否则您应该使用固定(即/etc/apt/preferences.d/
),它更可靠和直接。
注意:为防止封装安装时引脚优先,应持消极态度:
P < 0 :
阻止安装该版本
例如Pin-Priority: -10
。