我想在我的服务器上保存软件包的版本,以防止基础设施中的重大变化破坏我们的代码(例如从 mongodb 2.4 到 2.6 的变化..)
我知道我可以(例如)apt-mark hold package
,但是随后我就不再获得安全补丁和小升级。
我还想安装设置主要版本(但不设置次要版本)的软件包
例如我知道我可以:
sudo apt-get install -y rabbitmq-server=3.3.5
但我只想将安装固定到主要版本(3.*)
如何实现这一点?
答案1
您可以固定到一组通配符版本号。请参阅man apt_preferences
例如:
特定格式为具有指定版本或版本范围的一个或多个指定软件包分配优先级(“Pin-Priority”)。例如,以下记录为版本号以“5.10”开头的所有版本的 perl 软件包分配高优先级。多个软件包可以用空格分隔。
Package: perl Pin: version 5.10* Pin-Priority: 1001
因此,例如在 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
然后,我将反向移植设置为更高的优先级:
$ 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
再次将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
因此您只需创建一个包含/etc/apt/preferences.d/
以下内容的文件:
Package: rabbitmq-server
Pin: version 3.*
Pin-Priority: 1001
默认情况下,没有存储库的优先级大于 1000,如果需要,1001 足以强制 apt 降级:
P >= 1000 会导致安装某个版本,即使这会导致软件包降级。