apt-mark 将 pacakge 保存到主要版本(不是特定的次要版本)

alo*_*ser 7 apt dpkg

我想在我的服务器上保存包的版本,以防止基础设施的破坏性更改破坏我们的代码(例如,从 mongodb 2.4 到 2.6 的更改..)

apt-mark hold package例如,我知道我可以(例如),但后来我停止获得安全补丁和小升级。

此外,我想通过设置主要版本(但不是次要版本)来安装软件包

例如我知道我可以:

sudo apt-get install -y rabbitmq-server=3.3.5
Run Code Online (Sandbox Code Playgroud)

但我只想将安装固定到主要版本 (3.*)

如何做到这一点?

mur*_*uru 5

您可以固定一组通配符版本号。请man apt_preferences参阅示例:

该特定形式向具有指定版本或版本范围的一个或多个指定包分配优先级(“引脚优先级”)。例如,以下记录为版本号以“5.10”开头的 perl 包的所有版本分配高优先级。多个包可以用空格分隔。

Package: perl
Pin: version 5.10*
Pin-Priority: 1001
Run Code Online (Sandbox Code Playgroud)

例如,在 Ubuntu 16.04 上,xenial-backports默认优先级为 100,初始策略为debhelper

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 9.20160115ubuntu3
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 100
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status
Run Code Online (Sandbox Code Playgroud)

然后,我将向后移植固定为更高的优先级:

$ cat /etc/apt/preferences.d/debhelper
Package: *
Pin: release v=16.04,o=Ubuntu,a=xenial-backports,n=xenial,l=Ubuntu,c=main,b=amd64
Pin-Priority: 600

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 10.2.2ubuntu1~ubuntu16.04.1
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 600
        600 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
Run Code Online (Sandbox Code Playgroud)

再次将 的9.*版本固定debhelper为更高的优先级:

$ cat /etc/apt/preferences.d/debhelper
Package: *
Pin: release v=16.04,o=Ubuntu,a=xenial-backports,n=xenial,l=Ubuntu,c=main,b=amd64
Pin-Priority: 600

Package: debhelper
Pin: version 9.*
Pin-Priority: 800

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 9.20160115ubuntu3
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 600
        600 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 800
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status
Run Code Online (Sandbox Code Playgroud)

所以你只需要创建一个文件,其中/etc/apt/preferences.d/包含:

Package: rabbitmq-server
Pin: version 3.*
Pin-Priority: 1001
Run Code Online (Sandbox Code Playgroud)

默认情况下,没有存储库的优先级大于 1000,1001 足以在需要时强制 apt 降级:

P >= 1000 会导致安装某个版本,即使这构成软件包的降级。

  • 但是有没有办法将其作为“sudo apt-get install”的参数来做到这一点? (2认同)