【问题标题】:How to stop/disable/hold automatic updates for packages in linux?如何停止/禁用/保持 linux 中软件包的自动更新?
【发布时间】:2019-06-27 13:05:16
【问题描述】:

我在 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

【问题讨论】:

标签: linux ubuntu apt package-management unattended-upgrade


【解决方案1】:

动机:你不想为你的 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>

【讨论】:

    【解决方案2】:

    您可以对一个包(或一组包)使用hold 状态以不涉及升级。这使您能够更精细地根据每个软件包决定应该升级或不应该升级什么。在已知的离题、错误和行为的细微变化中非常有帮助。

    来自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.
    

    格式可能有点奇怪——但它非常强大并且很有帮助。在我使用 Debian/Ubuntu 的 25 年(!!)期间,我曾多次依赖它。我可能在某个地方有一个 shell 脚本助手,但我可能需要挖掘。

    【讨论】:

      【解决方案3】:

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

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

      示例:

      禁用 docker repo:
      sed -i 's/^deb.*docker.*/# &amp;/g' /etc/apt/sources.list

      启用 docker repo 以进行手动更新:
      sed -i '/^# deb .*docker.*/s/^# //' /etc/apt/sources.list

      【讨论】:

      • 你不想要这个 repo-wide,尤其是,因为 dpkg 可以通过设置它在每个包级别上完美地做到这一点持有。
      • @DirkEddelbuettel 你能发布一个例子吗? tbh 这些回购只有一个目的是安装 docker 和 kuberneters,而作者不希望这些被更新,那么评论整个回购有什么害处?
      【解决方案4】:

      今日发现:)。 Ubuntu apt 为您提供了保持软件包自动更新的命令。感谢Dirk 给我提示。

      sudo apt-mark hold docker-ce kubelet kubeadm kubectl
      

      【讨论】:

        猜你喜欢
        • 2014-08-26
        • 1970-01-01
        • 1970-01-01
        • 2017-05-22
        • 2018-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多