

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用版本化存储库实现确定性升级
<a name="deterministic-upgrades-usage"></a>

**Topics**
+ [使用确定性升级的系统](#using-a-deterministic-upgraded-system)
+ [选择性更新确定性升级系统](#deterministic-upgrade-selective-update)
+ [在确定性升级中使用持久取代](#deterministic-upgrade-override-persist)

## 使用确定性升级的系统
<a name="using-a-deterministic-upgraded-system"></a>

**注意**  
 包管理器的默认行为已从改为 AL2。

 确定性升级是一种有效的方法，可确保对生产环境的所有更改在广泛部署之前得到充分测试。每个新 AL2023 AMI 都锁定到特定版本的 AL2023。这提供了启动特定 AMI 时将安装的操作系统程序包版本的确定性行为。原地更新可以升级到特定的发布版本，确保整个实例集中的确定性行为。当你迁移到新的 AMIs 或就地更新版本时，你可以测试 CI/CD 管道中的每个版本，在部署到生产环境之前发现任何潜在的问题。

 您可以使用诸如 [AWS Systems Manager Patch Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/patch-manager.html) 之类的工具来协调跨实例集的应用更新。对于在新 AL2023 AMIs 版本发布 AMIs 时派生的构建，[EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/) 可以自动构建 AMIs、修补和测试，或者您可以[有新的更新时收到通知](receive-update-notification.md)知道新基础何时可用，或者触发自己 AMIs 的 AMI 构建管道。

 有关将更新限制为来自特定通告的信息，请参阅 [原地应用安全更新](security-inplace-update.md) 

 对于原地修补，您可以使用 `dnf` 程序包管理器。但您运行 `dnf upgrade` 命令时，系统会检查 `releasever` 变量指定的存储库中的升级。有效版本`releasever`是其中一个*latest*或一个带有日期戳的版本，例如. *2023.10.20260325* 

您可以使用以下任一方法更改 `releasever` 的值。这些方法按系统优先级降序列出。这意味着方法 1 优先于方法 2 和 3，方法 2 优先于方法 3。

1. 命令行标志中的值，`--releasever=latest`（如果使用）。

1. 替代变量文件中指定的值，`/etc/dnf/vars/releasever`（如果设置）。

1. 当前安装的 `system-release` 软件包版本。

在以下示例中，版本为*2023.0.20230210*：

```
$ rpm -q system-release
system-release-2023.0.20230210-0.amzn2023.noarch
```

在新安装的系统中，替代变量不存在。由于系统锁定到 `system-release` 的已安装版本，所以无升级可用。

```
$ cat /etc/dnf/vars/releasever
cat: /etc/dnf/vars/releasever: No such file or directory
```

```
$ sudo dnf upgrade
Last metadata expiration check: 0:00:02 ago on Wed 15 Feb 2023 06:14:12 PM UTC.
Dependencies resolved.
Nothing to do.
Complete!
```

要获取某个特定版本的软件包，您可以通过使用 `releasever` 标志来提供所需的版本。

```
$ rpm -q system-release
system-release-2023.0.20230222-0.amzn2023.noarch
```

```
$ sudo dnf upgrade --releasever=2023.0.20230329
Amazon Linux 2023 repository                     26 MB/s |  12 MB     00:00
Dependencies resolved.
================================================================================
 Package                 Arch    Version                      Repository   Size
================================================================================
Installing:
 kernel                   aarch64 6.1.21-1.45.amzn2023        amazonlinux  26 M
Upgrading:
 amazon-linux-repo-s3     noarch  2023.0.20230329-0.amzn2023  amazonlinux  18 k
 ca-certificates          noarch  2023.2.60-1.0.amzn2023.0.1  amazonlinux 828 k
 cloud-init               noarch  22.2.2-1.amzn2023.1.7       amazonlinux 1.1 M

         ... [ list edited for clarity ]

 system-release           noarch  2023.0.20230329-0.amzn2023  amazonlinux  29 k

         ... [ list edited for clarity ]
          
 vim-data                 noarch  2:9.0.1403-1.amzn2023.0.1   amazonlinux  25 k
 vim-minimal              aarch64 2:9.0.1403-1.amzn2023.0.1   amazonlinux 753 k

Transaction Summary
================================================================================
Install    1 Package
Upgrade   42 Packages

Total download size: 56 M
```

由于 `--releasever` 选项优先于 `system-release` 和 `/etc/dnf/vars/releasever`，所以此升级的结果如下：

1. 升级将替换在先前版本和新版本之间有所变化的所有已安装的软件包。

1. 升级会将系统锁定到 `system-release` 的新版本的存储库。

 通过始终指定要更新的内容`releasever`（即 AL2023 版本），您可以对队列进行一组确定性的更改。您启动了版本*A*，更新为*B*，然后更新为*C*。

## 选择性更新确定性升级系统
<a name="deterministic-upgrade-selective-update"></a>

**注意**  
 我们建议安装新发布版本中的所有更新，而不是选择特定更新。仅对操作系统应用部分更新，应被视为偏离采用完整更新的标准实践的例外情况。

您或许想要安装来自最近版本的选定软件包，同时仍将系统锁定到原始发行版本。

您可以使用 `dnf check-update` 来确认要升级的软件包。

```
$ sudo dnf check-update --releasever=latest --security
Amazon Linux 2023 repository                     13 MB/s |  10 MB     00:00
Last metadata expiration check: 0:00:02 ago on Wed 15 Feb 2023 02:52:21 AM UTC.

bind-libs.aarch64                  32:9.16.27-1.amzn2023.0.1         amazonlinux
bind-license.noarch                32:9.16.27-1.amzn2023.0.1         amazonlinux
bind-utils.aarch64                 32:9.16.27-1.amzn2023.0.1         amazonlinux
cryptsetup.aarch64                 2.4.3-2.amzn2023.0.1              amazonlinux
cryptsetup-libs.aarch64            2.4.3-2.amzn2023.0.1              amazonlinux
curl-minimal.aarch64               7.85.0-1.amzn2023.0.1             amazonlinux
glibc.aarch64                      2.34-40.amzn2023.0.2              amazonlinux
glibc-all-langpacks.aarch64        2.34-40.amzn2023.0.2              amazonlinux
glibc-common.aarch64               2.34-40.amzn2023.0.2              amazonlinux
glibc-locale-source.aarch64        2.34-40.amzn2023.0.2              amazonlinux
gmp.aarch64                        1:6.2.1-2.amzn2023.0.1            amazonlinux
gnupg2-minimal.aarch64             2.3.7-1.amzn2023.0.2              amazonlinux
gzip.aarch64                       1.10-5.amzn2023.0.1               amazonlinux
kernel.aarch64                     6.1.12-17.42.amzn2023             amazonlinux
kernel-tools.aarch64               6.1.12-17.42.amzn2023             amazonlinux
libarchive.aarch64                 3.5.3-2.amzn2023.0.1              amazonlinux
libcurl-minimal.aarch64            7.85.0-1.amzn2023.0.1             amazonlinux
libsepol.aarch64                   3.4-3.amzn2023.0.2                amazonlinux
libsolv.aarch64                    0.7.22-1.amzn2023.0.1             amazonlinux
libxml2.aarch64                    2.9.14-1.amzn2023.0.1             amazonlinux
logrotate.aarch64                  3.20.1-2.amzn2023.0.2             amazonlinux
lua-libs.aarch64                   5.4.4-3.amzn2023.0.1              amazonlinux
lz4-libs.aarch64                   1.9.4-1.amzn2023.0.1              amazonlinux
openssl.aarch64                    1:3.0.5-1.amzn2023.0.3            amazonlinux
openssl-libs.aarch64               1:3.0.5-1.amzn2023.0.3            amazonlinux
pcre2.aarch64                      10.40-1.amzn2023.0.1              amazonlinux
pcre2-syntax.noarch                10.40-1.amzn2023.0.1              amazonlinux
rsync.aarch64                      3.2.6-1.amzn2023.0.2              amazonlinux
vim-common.aarch64                 2:9.0.475-1.amzn2023.0.1          amazonlinux
vim-data.noarch                    2:9.0.475-1.amzn2023.0.1          amazonlinux
vim-enhanced.aarch64               2:9.0.475-1.amzn2023.0.1          amazonlinux
vim-filesystem.noarch              2:9.0.475-1.amzn2023.0.1          amazonlinux
vim-minimal.aarch64                2:9.0.475-1.amzn2023.0.1          amazonlinux
xz.aarch64                         5.2.5-9.amzn2023.0.1              amazonlinux
xz-libs.aarch64                    5.2.5-9.amzn2023.0.1              amazonlinux
zlib.aarch64                       1.2.11-32.amzn2023.0.3            amazonlinux
```

安装您要升级的程序包。使用 `sudo dnf upgrade --releasever=latest` 和软件包名称来确保 `system-release` 软件包保持不变。

```
$ sudo dnf upgrade --releasever=latest openssl openssl-libs
Last metadata expiration check: 0:01:28 ago on Wed 15 Feb 2023 02:52:21 AM UTC.
Dependencies resolved.
================================================================================
 Package          Arch        Version                     Repository       Size
================================================================================
Upgrading:
 openssl          aarch64     1:3.0.5-1.amzn2023.0.3      amazonlinux     1.1 M
 openssl-libs     aarch64     1:3.0.5-1.amzn2023.0.3      amazonlinux     2.1 M

Transaction Summary
================================================================================
Upgrade  2 Packages

Total download size: 3.2 M
```

**注意**  
使用 `sudo dnf upgrade --releasever=latest` 更新所有软件包，包括 `system-release`。然后，该版本仍锁定到新的 `system-release`，除非您设置了持久取代。

## 在确定性升级中使用持久取代
<a name="deterministic-upgrade-override-persist"></a>

**注意**  
 通过确定性更新，您可以将操作系统更改集成到您的 CI/CD 管道中。禁用确定性更新将丧失在部署前进行测试的能力。

您可以通过将变量值设置为`--releasever=latest`，使用永久覆盖来*解锁*系统，而不必添加*latest*。通过始终使用`latest`，这会将的行为恢复 AL2023 到 AL2 更新模型，在该模型中，对包管理器的任何调用都将*始终*查看最新版本，并且不会锁定到任何特定版本的操作系统。

**警告**  
 通过使用对确定性更新的持久覆盖来解锁程序包管理器，您将承担在生产环境中发现您的应用程序与操作系统更新之间任何可能的不兼容性的风险。  
 虽然不兼容性*确实*罕见，但通过操作系统更新，您正在将新的代码变更集成到您的环境中，集成测试可以防止部署对生产环境产生负面影响的代码变更。

```
$ echo latest | sudo tee /etc/dnf/vars/releasever
latest
```

```
$ sudo dnf upgrade
Last metadata expiration check: 0:03:36 ago on Wed 15 Feb 2023 02:52:21 AM UTC.
Dependencies resolved.
================================================================================
 Package                 Arch    Version                      Repository   Size
================================================================================
Installing:
 kernel                  aarch64 6.1.73-45.135.amzn2023       amazonlinux  24 M
Upgrading:
 acl                     aarch64 2.3.1-2.amzn2023.0.1         amazonlinux  72 k
 alternatives            aarch64 1.15-2.amzn2023.0.1          amazonlinux  36 k
 amazon-ec2-net-utils    noarch  2.3.0-1.amzn2023.0.1         amazonlinux  16 k
 at                      aarch64 3.1.23-6.amzn2023.0.1        amazonlinux  60 k
 attr                    aarch64 2.5.1-3.amzn2023.0.1         amazonlinux  59 k
 audit                   aarch64 3.0.6-1.amzn2023.0.1         amazonlinux 249 k
 audit-libs              aarch64 3.0.6-1.amzn2023.0.1         amazonlinux 116 k
 aws-c-auth-libs         aarch64 0.6.5-6.amzn2023.0.2         amazonlinux  79 k
 aws-c-cal-libs          aarch64 0.5.12-7.amzn2023.0.2        amazonlinux  34 k
 aws-c-common-libs       aarch64 0.6.14-6.amzn2023.0.2        amazonlinux 119 k
 aws-c-compression-libs  aarch64 0.2.14-5.amzn2023.0.2        amazonlinux  22 k
 aws-c-event-stream-libs aarch64 0.2.7-5.amzn2023.0.2         amazonlinux  47 k
 aws-c-http-libs         aarch64 0.6.8-6.amzn2023.0.2         amazonlinux 147 k
 aws-c-io-libs           aarch64 0.10.12-5.amzn2023.0.6       amazonlinux 109 k
 aws-c-mqtt-libs         aarch64 0.7.8-7.amzn2023.0.2         amazonlinux  61 k
 aws-c-s3-libs           aarch64 0.1.27-5.amzn2023.0.3        amazonlinux  54 k
 aws-c-sdkutils-libs     aarch64 0.1.1-5.amzn2023.0.2         amazonlinux  26 k
 aws-checksums-libs      aarch64 0.1.12-5.amzn2023.0.2        amazonlinux  50 k
 awscli-2                noarch  2.7.8-1.amzn2023.0.4         amazonlinux 7.3 M
 basesystem              noarch  11-11.amzn2023.0.1           amazonlinux 7.8 k
 bash                    aarch64 5.1.8-2.amzn2023.0.1         amazonlinux 1.6 M
 bash-completion         noarch  1:2.11-2.amzn2023.0.1        amazonlinux 292 k
 bc                      aarch64 1.07.1-14.amzn2023.0.1       amazonlinux 120 k
 bind-libs               aarch64 32:9.16.27-1.amzn2023.0.1    amazonlinux 1.2 M
 bind-license            noarch  32:9.16.27-1.amzn2023.0.1    amazonlinux  14 k
 bind-utils              aarch64 32:9.16.27-1.amzn2023.0.1    amazonlinux 206 k
 binutils                aarch64 2.38-20.amzn2023.0.3         amazonlinux 4.6 M
 boost-filesystem        aarch64 1.75.0-4.amzn2023.0.1        amazonlinux  55 k
 boost-system            aarch64 1.75.0-4.amzn2023.0.1        amazonlinux  14 k
 boost-thread            aarch64 1.75.0-4.amzn2023.0.1        amazonlinux  54 k
 bzip2                   aarch64 1.0.8-6.amzn2023.0.1         amazonlinux  53 k
 bzip2-libs              aarch64 1.0.8-6.amzn2023.0.1         amazonlinux  44 k
 c-ares                  aarch64 1.17.2-1.amzn2023.0.1        amazonlinux 107 k
 ca-certificates         noarch  2021.2.50-1.0.amzn2023.0.3   amazonlinux 343 k
 checkpolicy             aarch64 3.4-3.amzn2023.0.1           amazonlinux 345 k
 chkconfig               aarch64 1.15-2.amzn2023.0.1          amazonlinux 162 k
 chrony                  aarch64 4.2-7.amzn2023.0.4           amazonlinux 314 k
 cloud-init              noarch  22.2.2-1.amzn2023.1.7        amazonlinux 1.1 M
 cloud-utils-growpart    aarch64 0.31-8.amzn2023.0.2          amazonlinux  31 k
 coreutils               aarch64 8.32-30.amzn2023.0.2         amazonlinux 1.1 M
 coreutils-common        aarch64 8.32-30.amzn2023.0.2         amazonlinux 2.0 M
 cpio                    aarch64 2.13-10.amzn2023.0.1         amazonlinux 269 k
 cracklib                aarch64 2.9.6-27.amzn2023.0.1        amazonlinux  83 k
 cracklib-dicts          aarch64 2.9.6-27.amzn2023.0.1        amazonlinux 3.6 M
 crontabs                noarch  1.11-24.20190603git.amzn2023.0.1
                                                              amazonlinux  19 k
 crypto-policies         noarch  20230128-1.gitdfb10ea.amzn2023.0.1
                                                              amazonlinux  61 k
 crypto-policies-scripts noarch  20230128-1.gitdfb10ea.amzn2023.0.1
                                                              amazonlinux  81 k
...
Installing dependencies:
 amazon-linux-repo-cdn   noarch  2023.0.20230210-0.amzn2023   amazonlinux  16 k
 xxhash-libs             aarch64 0.8.0-3.amzn2023.0.1         amazonlinux  32 k
Installing weak dependencies:
 amazon-chrony-config    noarch  4.2-7.amzn2023.0.4           amazonlinux  14 k
 gawk-all-langpacks      aarch64 5.1.0-3.amzn2023.0.1         amazonlinux 207 k

Transaction Summary
================================================================================
Install    5 Packages
Upgrade  413 Packages

Total download size: 199 M
```

**注意**  
如果您使用了取代变量 `/etc/dnf/vars/releasever`，请使用以下命令，通过擦除取代值来恢复默认锁定行为。  

```
$ sudo rm /etc/dnf/vars/releasever
```

 使用永久替换使用`latest`而不是特定版本类似于的默认行为。 AL2有些服务是 AMIs基于这些服务构建的， AL2 这些服务会禁用此行为，并锁定到特定的软件包版本，就像你默认开启的那样 AL2023。

 我们建议使用从新 AMI 启动的实例替换原有实例，而不是禁用确定性更新。如果无法进行实例替换，我们建议使用诸如 [AWS Systems Manager Patch Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/patch-manager.html) 之类的工具来协调跨实例集的应用更新。[EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/) 还可以自动构建、修补和测试 AMIs 您自己的 AL2023 基础映像。您也可以 [有新的更新时收到通知](receive-update-notification.md)，这可用于触发您自己的 AMI 构建流水线。

 在预生产环境中使用 `latest`，然后使用 `latest` 部署到生产环境，并*不能*防范操作系统更新与您的应用程序之间的任何问题。新 AL2023 版本可能在任何时间点发布，因此在生产`latest`中的所有使用都存在风险。