Linux系统升级,详细步骤配置Debian和Ubuntu自动升级

在本指南中,详细介绍了如何在基于Debian的操作系统(如Ubuntu)上实现无人值守的自动升级。

Unattended-upgrades-on-debian-and-ubuntu-Thumbnail.png

无人值守升级是一个非常方便的功能,您可以通过安装一个叫做无人值守升级的特殊软件包在 Debian 系统上启用。启用此功能的最大好处是,可以确保安全升级定期应用到设备上。此功能对于您不主动管理的设备和需要确保安全漏洞定期修补的设备非常有用。许多黑客依赖的一种攻击途径是服务器运行有活动漏洞的过时软件。使用类似无人值守的升级有助于减少系统被攻破的概率。

当然,在 Debian/Ubuntu 上使用无人值守的升级有一个缺点。这个缺点就是有很小的几率会造成意料之外的停机。虽然可能性不大,但仍有可能安装有潜在问题的软件包。您可能希望避免在关键服务上使用无人值守的升级,因为您无法承受停机时间。

安装无人值守的升级包

我们的第一步是将无人值守的升级包安装到您的 Debian 操作系统上。

1. 在继续之前,我们需要确保当前系统有最新的软件包列表。

你可以使用apt.net的更新功能来更新软件包列表。同时,我们还将进行升级,以确保所有安装包都是最新的。

sudo apt update
sudo apt upgrade

2. 更新了软件包列表后,我们现在可以继续安装无人值守的升级包了。

要安装软件包,你需要做的就是运行以下命令。

sudo apt install unattended-upgrades

3. 安装好软件包后,我们现在就可以在你的Ubuntu或Debian系统上配置和启用该软件包了。

在您的 Debian 系统上配置自动升级

本节将向您介绍配置无人值守升级的一些步骤,以满足您的需求,在这个文件中,我们将能够修改哪些包会被自动更新和

1. 您可以通过运行以下命令开始修改配置文件。

我们将使用纳米文本编辑器来制作我们的指南,但你可以使用任何你觉得舒服的东西。

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

2. 在这个文件中,你会看到很多行规定了无人值守升级包的工作方式。

任何前面有双前斜杠(//)的行都会被忽略。您可以删除这些内容来启用该选项。

在所有的选项中,有两个重要的列表,我们将在稍后介绍。使用这两个列表,你可以决定哪些包应该被自动升级。

此外,你甚至可以将特定的应用程序列入黑名单,防止其自动升级。

3. 记住,当你修改完文件要保存。

如果你使用的是nano,按CTRL + X,然后按Y,再按ENTER键保存。

宏使配置更简单

在配置文件中,你可以使用两个方便的宏。在Debian和Ubuntu上,这些宏的值都是通过使用lsb_release自动获取的。

这些宏允许你定义的规则继续工作,即使发行ID或代号改变。

我们要看的第一个宏是”${distro_id}”。

这个宏将被发行版的ID所取代。例如,在Ubuntu上,宏”${distro_id}”将被替换为 “Ubuntu”。

${distro_id}

第二个宏是以下”${distro_codename}”。

这个宏会被自动替换成你的发行版的代号。如果你运行的是Debian系统,这将是类似于 “Buster “的东西。

${distro_codename}

需要注意的关键词

在配置无人值守的升级包时,你会遇到一些关键字,这些关键字用于定义你想要自动升级的存储库。

在本节中,我们将为您简要介绍这些关键词以及您可能看到的它们的示例值。

利用下面的表格,你可以看到这些关键词都是什么,以及一个正确的关键词值的例子。

Keywords Example Values
a, archive, suite “stable”, “focal”
c, component “main”, “contrib”, “non-free”, “universe”
l, label “Debian”, “Debian-Security”
o, origin “Debian”, “Unofficial Multimedia Packkages”
n, codename “jessie”, “jessie-updates”, “buster”, “focal”
site “http.debian.net”

控制哪些软件包被升级

首先我们要学习的是如何控制我们想要自动升级的包。

有两种方法可以实现。一种方式可以让你更精细地控制哪些包会自动升级。

另一种方式是使用起源名,和档案名来进行白名单,比较方便。

你的发行版的默认配置文件可能会使用其中之一作为其基本版本。如果你看到一个列表而没有看到另一个,不要担心。

使用允许的起源选项

我们要潜入的第一种方法是最简单的一种,但并不能给你带来太多的细粒度控制。

这个方法叫做 “允许的起源 “方法。它允许你轻松地指定你希望软件包自动升级的起源。

使用这个功能,你可以通过引用源码的id名和归档名,将整个版本库列入白名单。

在你的配置文件中,你可能会看到下面的一个部分。

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
};

允许的起源列表由 “Unattended-Upgrade::Allowed-Origins { }; “定义。

每个允许的原点都在新的行上指定,并使用原点名称和存档名称的格式。这些名称由冒号(:)分隔。

"ORIGIN:ARCHIVE"
检索起源和档案名称

你可以通过使用下面的命令来获得你的资源库所需的值。

apt-cache policy

这条命令将返回你的软件包仓库的列表,提供你需要的所有细节。

Belwo我们有一个例子,说明这个命令的结果是什么样子的。拥有一些

Package files:
 100 /var/lib/dpkg/status
     release a=now
 500 http://ppa.launchpad.net/ondrej/php/ubuntu focal/main amd64 Packages
     release v=20.04,o=LP-PPA-ondrej-php,a=focal,n=focal,l=***** The main PPA for supported PHP versions with many PECL extensions *****,c=main,b=amd64
     origin ppa.launchpad.net
 500 http://raspbian.raspberrypi.org/raspbian buster/non-free armhf Packages
     release o=Raspbian,a=stable,n=buster,l=Raspbian,c=non-free,b=armhf
     origin raspbian.raspberrypi.org
 500 http://raspbian.raspberrypi.org/raspbian buster/contrib armhf Packages
     release o=Raspbian,a=stable,n=buster,l=Raspbian,c=contrib,b=armhf
     origin raspbian.raspberrypi.org
 500 http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
     release o=Raspbian,a=stable,n=buster,l=Raspbian,c=main,b=armhf
     origin raspbian.raspberrypi.org

原产地用o=表示,档案名称用a=表示。

记下源头,以及你希望自动更新软件包的仓库的存档。

将新的来源添加到列表中

添加一个新的来源非常简单。

在这个例子中,假设我们有一个起源于 “LP-PPA-ondrej-php “的版本库,存档名称为 “focal”。我们可以以我们之前的列表为例,其值如下。

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
};

然后我们可以在其中添加一行新的内容,引用我们新的原点名称和它的存档名称。

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        "LP-PPA-ondrej-php:focal";
};

你可以进一步调整,由于focal是Ubuntu 20.04的代号,我们可以使用”${distro_codename}”宏来代替。

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        "LP-PPA-ondrej-php:${distro_codename}";
};

使用 “原始模式 “选项

你也可以使用 “Origins-Pattern “选项,让自己对所选的包有更多的控制。下面是一个配置的例子。

Unattended-Upgrade::Origins-Pattern {
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";
};

无人值守升级包的工作方式是通过检查包仓库的元数据来查看它是否符合定义的一组规则。这个列表中的每一行都规定了一个新的规则来检查仓库。如果一个仓库的元数据符合其中一个模式,那么从该仓库提供的软件包将被更新。您可以看到,在 ahove 的例子中,起源、代号和标签都已经被定义。无人值守的升级包只会处理符合这三个条件的版本库。

检索存储库信息

当你想在你的起源模式中添加一个存储库时,你可能想从它们中检索所需的信息。为了能够获得这些信息,我们可以利用 “apt-cache “命令。

apt-cache policy

这条命令将返回每个被添加到列表中的仓库。对于每个版本库,你将能够得到起源(o)、归档(a)、代号(n)、标签(l)和组件(c)。利用这些数值,你就能创造出符合自己需求的图案,所以要记下来。

向列表中添加起源模式

添加一个新的原点模式是一个相当直接的过程。你可以使用每个关键词的简称或长名。如果你不确定这些是什么,你可以参考我们上面的 “要注意的关键词 “部分。要定义一个新的模式,你需要使用以下基本设置。你的模式应该用双引号包围,并以分号(;)结束。

每一个要匹配的关键字都应该用逗号(,)来分隔。例如,如果我们想指定原点和代号,我们可以使用类似 “origin=VALUE,codename=VALUE “的内容。

"KEYWORD=VALUE[,KEYWORD=VALUE ...]";

为了使用它,让我们把流行的PHP backport仓库添加到我们的列表中,添加以下一行。在这个例子中,我们将指定起源、代号和存档。

"origin=LP-PPA-ondrej-php,codename=focal,archive=focal";

当添加到列表本身时,你应该最终得到像我们下面这样的东西。

Unattended-Upgrade::Origins-Pattern {
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";
        "origin=LP-PPA-ondrej-php,codename=focal,archive=focal"
};

将无人值守升级的软件包列入黑名单

假设你想阻止特定的软件包被自动升级。在这种情况下,你也可以通过配置文件来实现。在你的配置文件中,你可能会看到一个文本块,就像我们下面这样。这个块定义了软件包的黑名单。

Unattended-Upgrade::Package-Blacklist {
    //  "linux-";
};

关于这个列表需要注意的一点是,它使用了 Python 正则表达式。您可以通过Python 3的官方文档来阅读这些内容。添加规则的格式是一个相对简单的过程。规则应在新的一行中,用双引号(” “)包围,并以分号(;)结束。我们并不打算深入探讨这个问题,但我们将涵盖一些非常基本的规则,你在定义这些规则时应该知道。

只有文字的规则与所有规则相匹配

首先要注意的是,没有锚字符($)的文本将匹配所有以相同文本开头的包。如果我们使用文本 “linux-“,它将匹配任何以它开头的字符串。例如,如果我们有一个叫 “linux-headers “或 “linux-kernel “的包,这两个包都会被我们的 “linux-“黑名单屏蔽。

使用$来显式定义规则

为了阻止规则匹配所有以相同名称开头的文本,我们可以使用锚字符($)。通过在规则的末尾插入这个字符,我们告诉它,名字应该在这一点上停止。例如,如果我们想阻止git包的更新,我们可以使用 “git$”这个规则。在包的结尾使用锚字符,比如说 “gitlab “的名字就不会被阻止更新。

特殊字符的转义

最后一个规则是,特殊字符需要进行转义。转义字符是一个相对简单的概念。你所需要做的就是在任何特殊字符旁边使用一个向后的斜线(\)。例如,如果我们要在规则名称中使用加号(+),我们就需要使用后置斜杠(\)。例如,让我们说我们想阻止 “libstdc++”包被更新。

要做到这一点,我们需要修改它,所以它看起来像这样,每个加号都被转义。

"libstdc\+\+$";

作为额外的措施,我们还添加了锚字符,所以它只会阻止这个包的更新。

启用自动无人值守升级

在本节中,我们将向您展示如何启用和配置自动升级器的行为。利用这一点,我们可以调整诸如定期升级器的优先级,并安排它清理旧包。

1. 我们需要在”/etc/apt/apt.conf.d “目录下创建或修改另一个文件。

让我们再次使用nano开始写入自动启动配置文件。

sudo nano /etc/apt/apt.conf.d/20auto-upgrades

2. 在这个文件中,你至少应该有以下两行字:

如果它们不存在,请确保您添加它们,因为这两个是使无人值守升级包工作所必需的。

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

第一行是告诉包管理器,它应该定期升级包列表。如果我们不更新包列表,包永远不会知道有新的更新。

第二行告诉包管理器运行无人值守的升级包。这个包会检查你指定的仓库的更新并自动升级。

每行末尾引用的数字是再次执行前的天数。所以1是每天,2是每两天,以此类推。如果你把这个值设置为0,就会禁用这个选项。

3. 还有一些额外的配置。

APT::Periodic::Download-Upgradeable-Packages "NUMDAYS";

其中第一个选项是让apt软件包管理器每隔一定天数下载可升级的软件包。尽管软件包是自动下载的,但它不会安装它们,直到无人值守的升级软件包安装它们或手动运行升级。通常情况下,你可能会希望这个每天运行。

APT::Periodic::AutocleanInterval "NUMDAYS";

这个选项可以对软件包缓存进行自动清理。自动清理将从您的系统中删除任何不再使用的过时包。自动清理有助于阻止你的APT缓存变得臃肿。自动清理不需要每天执行,一般一个月或每21天执行一次就足以保持缓存的干净。

4. 一旦你对文件进行了修改,你就可以保存它了。

要使用nano保存文件,可以按CTRL+X,然后按Y,再按ENTER。

5. 此时,您应该已经在Ubuntu或Debian设备上成功设置和配置了无人值守的升级包。

您可以通过运行以下命令来测试您的配置。

sudo unattended-upgrade -d

该命令在调试模式下启动升级工具,允许你检查任何错误。此时,您应该已经在您的基于Debian或Ubuntu的设备上设置了自动更新。如果你在配置无人值守的升级包时遇到任何问题,欢迎在下面留言。

平均: 5 / 5. votes: 1

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » Linux系统升级,详细步骤配置Debian和Ubuntu自动升级

赞 (1)

评论

5+2=