对于版本锁定,apt-mark 和 APT-pin (/etc/apt/preferences.d/pin) 哪个更可靠?

对于版本锁定,apt-mark 和 APT-pin (/etc/apt/preferences.d/pin) 哪个更可靠?

通常在我的 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以及aptitudeGUI 工具(例如)synapticmuon尊重它。

我知道其他机制 - 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有两个错误:

    1. 在 14.04 LTS 上它没有完全遵守apt-mark(见我在启动板上发现了一个 bug 1747189)。
    2. 在 16.04 LTS 上,由设置的保留apt-mark在点击后丢失操作 -> 取消待处理的操作(看我在启动板上发现了一个 bug 1747191)。

    但在 18.04 LTS 中aptitude没有这样的 bug,很棒。

所以我的结论如下:apt-mark仅当您使用 安装/删除/升级软件时才可用apt-get,否则您应该使用固定(即/etc/apt/preferences.d/),它更可靠和直接。


注意:为防止封装安装时引脚优先,应持消极态度

P < 0 :
阻止安装该版本

例如Pin-Priority: -10

相关内容