哪个更可靠 - 用于版本锁定的 apt-mark 或 APT-pin (/etc/apt/preferences.d/pin)?

N0r*_*ert 7 upgrade package-management apt dpkg pinning

通常在我的 Ubuntu 16.04 LTS 上,我使用 APT-pin 功能锁定包版本。

例如,如果我想固定meld1.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
Run Code Online (Sandbox Code Playgroud)

此文件系统级应用的设置:aptapt-getaptitude和GUI工具,如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
Run Code Online (Sandbox Code Playgroud)

然后我持有已安装的版本。

$ 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

apt-get upgrademeld保留的报告:

$ 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.
Run Code Online (Sandbox Code Playgroud)

但是,如果我启动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      
Run Code Online (Sandbox Code Playgroud)

如果我不小心选择了操作 -> 取消挂起的操作,保留将被删除。

据我所知,synaptic忽略apt-mark标记,其锁定版本功能的工作方式不同。
meld此处列为已安装(可升级)Mark all upgrades按钮不会自动选择它,但包可能会被Mark for Upgrade意外升级

Muon 以相同的方式处理由apt-mark. 但是有趣的是它的选项Lock at Current Version将 pin-file 写入/etc/apt/preferences.d/meld.

我是否正确理解 APT-pin 比 更可靠apt-mark

N0r*_*ert 6

是的,固定比 更可靠apt-mark

我发现了什么:

  • 最近 12-14 年 Synaptic 使用自己的固定文件 (/var/lib/synaptic/preferences) - 请参阅启动板上的错误 42178。对于系统范围的人可能想要在/etc和 Synaptic之间设置符号链接

    sudo ln -s /etc/apt/preferences.d/synaptic /var/lib/synaptic/preferences
    
    Run Code Online (Sandbox Code Playgroud)

    所以这是解决方法,不推荐使用 Synaptic 中的锁定版本的方法(此文件不由apt-get和读取aptitude)。

  • Muon 中的每个应用程序使用系统范围的 pin 文件/etc/apt/preferences.d

  • aptitude 有两个错误:

    1. 在 14.04 LTS 上,它不完全尊重apt-mark(请参阅我的错误 1747189 at launchpad)。
    2. 在 16.04 LTS Hold 上,apt-mark在单击Actions -> Cancel pending actions(请参阅我的错误 1747191 at launchpad后,设置为丢失)。

    但是在 18.04 LTS 中aptitude没有这样的错误,这很棒。

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


注意:为防止封装安装引脚优先级应为负

P < 0 :
阻止安装版本

例如Pin-Priority: -10