如何stop/disable/hold自动更新linux中的包?

How to stop/disable/hold automatic updates for packages in linux?

我已经在 Ubuntu 18.04 LTS 上为我的 Kubernetes 集群安装了一些软件包 (Docker, Kubeadm, Kubelet, Kubectl)。

不希望这些包自动更新,因为当更新发生在彼此之间时,它们之间会出现一些问题。 我只想等他们稳定了再手动更新

停止包自动更新的正确命令是什么?

我用来在 Ubuntu 18.04

上安装它们的命令
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update

sudo apt-get install -y docker-ce=18.06.1~ce~3-0~ubuntu

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

cat << EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

sudo apt-get update

sudo apt-get install -y kubelet=1.12.7-00 kubeadm=1.12.7-00 kubectl=1.12.7-00

apt 在执行安装或更新时没有 yum 标志 --enable-repo--disablerepo。显示了一种管理回购协议的方法 here

但对于您的情况,您添加存储库的方式已将它们附加到 /etc/apt/sources.list 因此您可以使用 sed 注释掉您添加以安装的存储库行 dockerkubernetes
注意:您应该在安装之后和执行之前注释掉行 sudo apt-get update

示例:

要禁用 docker 存储库:
sed -i 's/^deb.*docker.*/# &/g' /etc/apt/sources.list

为手动更新启用 docker 仓库:
sed -i '/^# deb .*docker.*/s/^# //' /etc/apt/sources.list

您可以使用一个包(或一组包)的 hold 状态来不涉及它的升级。这使您有更多 fine-tuned 能力来决定 per-package 应该升级或不应该升级的内容。在已知的离题、错误和行为的细微变化中非常有用。

来自 dpkg 的手册页并编辑/缩进:

   --get-selections [package-name-pattern...]
          Get list of package selections, and write it to stdout. Without a pattern,
          non-installed packages (i.e. those which have been previously purged) will
          not be shown.

   --set-selections
          Set package selections using file read from stdin. This file should be in
          the format “package state”, where state is one of install, hold, deinstall 
          or purge. Blank lines and comment lines beginning with ‘#’ are also 
          permitted.

          The available file needs to be up-to-date for this command to be useful, 
          otherwise unknown packages will be ignored with a warning. See the 
          --update-avail and  --merge-avail  commands  for more information.

格式可以说有点奇怪 -- 但它 非常强大 并且很有帮助。在 twenty-five 年 (!!) Debian/Ubuntu 期间,我曾多次依赖它。我可能在某处有一个 shell 脚本助手,但我可能需要挖掘。

今日发现:)。 Ubuntu apt 给你命令来保持包的自动更新。感谢Dirk给我提示

sudo apt-mark hold docker-ce kubelet kubeadm kubectl

动机:你不想在你的linux机器上的敏感包上冒任何风险(当你的应用程序在生产中并且客户使用它时会发生这种情况,或者里面的一些重要任务 运行,较新的版本可能会破坏更改并意外导致停机)。在这种情况下 - 您希望将特定版本固定到您的包中,并确保在没有您方面的明确操作和批准的情况下不会发生升级。

解决方案:您应该禁用 unattended-upgrades 功能并且 pin 您的包进入您使用的当前版本(换句话说 - 保留此版本) .

步骤 1:禁用自动升级(也称为无人值守升级)

$ sudo vim /etc/apt/apt.conf.d/20auto-upgrades

#edit these lines - which disabling the upgrade feature.

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "0";

第 2 步:保留并冻结您要阻止自我升级的特定包:

sudo apt-mark hold <package-name>