一般性问题

问:什么是 Amazon Linux AMI

Amazon Linux AMI 是由 Amazon Web Services 提供的受支持和维护的 Linux 映像,用于 Amazon Elastic Compute Cloud (Amazon EC2)。它旨在为 Amazon EC2 上运行的应用程序提供稳定、安全和高性能的执行环境。此外,它还包括让您能够与 AWS 轻松集成的软件包,包括启动配置工具和许多常见的 AWS 库及工具。Amazon Web Services 为运行 Amazon Linux AMI 的所有实例持续提供安全和维护更新。Amazon Linux AMI 不向 Amazon EC2 用户额外收取费用。

问:Amazon 是否为 Amazon Linux AMI 提供支持?

是。Amazon Linux AMI 的支持是通过订阅 AWS Support 的方式提供的。有关更多详细信息,请参阅 AWS Support 页面

问:将为 Amazon Linux AMI 提供多长时间的支持?

Amazon Linux AMI(也称为 Amazon Linux 1)于 2023 年 12 月 31 日到期。自 2024 年 1 月 1 日起,Amazon Linux AMI 将不会收到任何安全更新或错误修复。

问:维护支持期与标准支持期有何不同?

维护支持是指 Amazon Linux AMI 标准支持结束之后的支持期。维修支持期从 2020 年 12 月 31 日开始,延续到 2023 年 12 月 31 日。在此期间,AWS 将不再增加对新 EC2 实例类型、新 AWS 服务和功能以及新软件包的支持,而将仅针对更少量的软件包集提供关键及重要的安全修复更新。此外,在维护支持期内,我们将根据上游生命周期终止实践慢慢弃用 AMI 及其存储库中的一些软件包。

问:在维护支持期内,可获得关键及重要安全修补程序的列表包含哪些软件包?

AWS 将为 AMI 中的 Linux 内核以及除已弃用的用户空间软件包之外的所有软件包提供关键及重要安全更新。

问:在“维护支持”期内,哪些软件包无法再收到更新?

在维护期内,在上游源中到达生命周期截止日期的任何软件包(在底层用户空间库之外)无法再收到更新。

以下包在最初的 2018.03 版本中已被弃用,并且在维护支持期间将不会收到进一步的更新:

MySQL 5.1
PHP 5.3
PHP 5.4
PHP 5.5
PHP 7.0
PostgreSQL 8
Python 2.6
Ruby 1.8
Ruby 1.9
Ruby 2.1
Ruby 2.2

此外,在维护支持期间,以下软件包将不再收到任何进一步的更新,它们的生命周期已结束:

所有兼容软件包
BZR –(bzr-python26 和 bzr-python27 软件包)
Ganglia
Mercurial
MySQL 5.5
Python 3.4 (python34)
Python 3.5 (python35)
PostgreSQL 9.3 (postgresql93)
PHP 7.1
PHP 7.2
Tomcat 7
Tomcat 8
Ruby 2.3
Ruby 2.4
PostgreSQL 9.4
Puppet 2.7.x (puppet)
Puppet 3.7.x (puppet3)
Subversion 1.9
Transmission
OpenJDK 1.7.0 (java-1.7.0-openjdk)

此外,还有一些将在维护期内的停止接收更新的其他软件包:

软件包名称

生命周期终止日期

MySQL 5.6 (mysql56)

2021 年 2 月 5 日

PostgreSQL 9.5 (postgresql95)

2021 年 2 月 11 日

PostgreSQL 9.6 (postgresql96)

2021 年 11 月 11 日

PHP 7.3 (php73)

2021 年 12 月 6 日

Python 3.6

2021 年 12 月 31 日

MySQL 5.7 (mysql57)

2023 年 10 月 21 日

OpenJDK 1.8.0 (java-1.8.0-openjdk)

2023 年 6 月 30 日

由于 RPM 依赖关系的性质以及这些顶级软件包中的一个由若干 RPM 组成的方式,此处提供了 Amazon Linux 1 中所有 RPM 软件包及其生命周期终止日期的完整列表。

问:我可以在维护支持期结束后启动 Amazon Linux AMI 吗?

可以,如果该政策发生变化,我们将提前发出通知。

问:Amazon Linux AMI 在 EC2 外可否得到支持?

不可以。Amazon Linux AMI 仅适合在 Amazon EC2 内使用。

问:可以查看 Amazon Linux AMI 的源代码吗?

可以。使用 Amazon Linux AMI 中提供的 yumdownloader --source 命令行工具,可以查看 Amazon EC2 内的源代码。

问:从哪里可以获得 Amazon Linux AMI 的更新?

更新是透过各个 Amazon EC2 区域中所托管的预先配置之 yum 存储库而提供的。安全更新将在 AMI 初始引导之时自动应用。登录时,日期消息 (/etc/motd) 将显示是否有任何其他可用更新。

问:如何报告错误或发出功能和软件包请求?

用户可以通过 Amazon EC2 论坛发送错误报告、功能请求和程序包请求。这些论坛由 AWS 开发人员支持团队以及 Amazon Linux AMI 工程团队负责监控。
 

技术

问:如何启用 Extra Packages for Enterprise Linux (EPEL) 存储库?

修改 /etc/yum.repos.d/epel.repo。 在标记了 [epel] 的部分下,将 enabled=0 更改为 enabled=1

要临时启用 EPEL 6 存储库,请使用 yum 命令行选项 --enablerepo=epel

请注意,为 Amazon Linux AMI 存储库配置的优先级高于任何第三方存储库。这样做的原因是,有一些软件包既是 Amazon Linux AMI 的组成部分,又包含在第三方存储库中,并且我们要确保 Amazon Linux AMI 版本已在默认情况下安装。

问:如何将我的 AMI 锁定为特定版本?

配置 Amazon Linux AMI 存储库结构以提供不间断的更新,从而使您可以从一个版本的 Amazon Linux AMI 更新到下一版本。

软件包更新将始终推送到存储库,并且对所有 Amazon Linux AMI 版本可用,其中 yum 将配置为指向“最新”。您可以通过查看 /etc/yum.conf 中的“releasever”变量来查看实例指向哪些存储库,默认情况下,Amazon Linux AMI 已设置 releasever=latest

换句话说,可将 Amazon Linux AMI 视为实时快照,它包含存储库和更新结构,可提供我们构建好并推送到存储库中的最新软件包。

当我们发布全新的 Amazon Linux AMI 主要版本时,如果用户不想获得软件包更新,“锁定发布”功能可让他们轻松保留特定的 AMI 主要版本。

若需在新的实例中启用此功能,请启动(例如)2015.09 Amazon Linux AMI,并将以下用户数据通过 EC2 控制台或者带 --user-data 标记的 aws ec2 run-instances 传递给 cloud-init(也可以使用 ec2-run-instances -f 执行此操作)。
#cloud-config
repo_releasever: 2015.09

要将现有实例锁定到其当前版本(在 /etc/system-release 中指出),请编辑 /etc/yum.conf。为读取 releasever=latest 的行添加注释并运行 yum clean all 以清除缓存。

注意:如果将 AMI 锁定到“最新”版本以外的存储库版本,则您不会收到任何后续更新。接收 Amazon Linux AMI 持续更新流的唯一方式是使用最新的 AMI,或使用指向“最新”的存储库持续更新您的旧 AMI。

问:如何在初次启动时禁止自动安装关键及重要安全更新?

首次启动时,Amazon Linux AMI 会从软件包存储库安装已评定为关键和重要级的所有用户空间安全更新,并且它会在 SSH 等服务启动前执行上述操作。

如果 AMI 无法访问 yum 存储库,则在完成启动程序前,它将超时并多次重试。出现这种情况的可能原因是,它受到了防火墙设置或 VPC 设置的限制,这些设置会禁止访问 Amazon Linux AMI 程序包存储库。

如果遇到此问题,您可以修改环境,以便 Amazon Linux AMI 可以连接它的包存储库,也可以禁用在启动时进行安全更新。

通过 AWS EC2 控制台禁止启动时进行安全更新:

在请求实例向导的“高级示例选项”页面上,有一个用于发送 Amazon Linux AMI 用户数据的文本字段。此数据可能是以文本形式输入的内容,也可能是以文件形式上传的内容。任何情况下,此数据都应为:
#cloud-config
repo_upgrade: none

通过命令行禁用启动时的安全更新:

使用先前的用户数据创建文本文件,将它传递给带有 --user-data file://<filename> 标志的 aws ec2 run-instances(也可以使用 ec2-run-instances -f 执行此操作)。

重新捆绑 Amazon Linux AMI,禁止启动时进行安全更新:

修改 /etc/cloud/cloud.cfg,将 repo_upgrade: security 更改为 repo_upgrade: none

问:在没有互联网网关或 NAT 实例的情况下,在 Virtual Private Cloud (VPC) 中运行时,为什么 SSH 需要花费很长时间才能完成启动?

请参阅上一个问题的答案。

问:为什么我的 RAID 阵列从 /dev/md127 开始而不是从 /dev/md0 开始?

较新版本的 mdadm 创建具有 1.2 版超级数据块的 RAID 阵列,此超级数据块无法自动与有编号的设备组合。通过为文件系统设置标签来引用分区。大多数文件系统创建工具都使用 -L 标志设置标签。设置完成后,标签将由 mount 在带 LABEL=[NAME] 的 /etc/fstab 中引用。

示例:使用标签创建一个 RAID0 阵列。
mdadm --create --verbose /dev/md0 --level=0 --name=0 --raid-devices=2 /dev/sdb /dev/sdc
mkfs.ext4 -L RAID0 /dev/md0
mkdir -p /mnt/RAID0
mount LABEL=RAID0 /mnt/RAID0

示例:设置现有 ext[2-4] 文件系统的标签。
e2label /dev/md127 RAID
mkdir -p /mnt/RAID
mount LABEL=RAID /mnt/RAID

问:为什么要通过 /etc/sudoers 禁用 wheel 组以及如何重新启用?

根据是否为 sudo 启用了 wheel,Linux 操作系统的默认设置也不同。我们认为,在默认情况下通过 sudo 禁用 wheel,对于 Amazon Linux AMI 来说,是更为显示安全的一种操作。

这个问题有两种解决方法,根据您是否能够对实例进行 SSH 处理以作为默认 ec2-user 以及是否更改了该用户使用 sudo 的能力,解决方法有所不同。

选项 1:对于未更改任何默认设置的用户,您应该仍然能够对实例进行 SSH 处理以作为 ec2-user,并能从中调用 sudo 以获得根权限,此时,您可以修改 sudoers 文件以重新启用 wheel。
选项 2:对于已更改默认设置或不能从 ec2-user 中调用 sudo 以获得根权限的用户,我们建议采用下列步骤:

  • 停止受影响的实例(不是终止)。
  • 使用 EC2 控制台或 EC2 API 工具分离 EBS 卷。
  • 将该卷附加到您具有远程根访问权限的另一个 EC2 实例。
  • 登录该实例。
  • 安装新连接的卷。
    sudo mount /dev/xvdf /mnt
  • 修改已连接卷中的 sudoers 文件并取消 wheel 组的注释。
    sudo sed -i.bak 's,# \(%wheel\s\+ALL=(ALL)\s\+ALL\),\1,' /mnt/etc/sudoers
  • 卸载卷。
    sudo umount -d /dev/xvdf
  • 分离此卷。
  • 将卷重新连接到您已停止的实例(确保设备的状态与其分离之前的状态相同,通常为:/dev/sda1)。
  • 启动受影响的实例。

问:在通过终端与 Amazon Linux AMI 通信时,为什么会显示如 � 或者 â 之类的奇怪字符?

默认情况下,Amazon Linux AMI 使用 UTF-8 字符编码。不使用 UTF-8 编码的客户端终端并不总是能够准确地转换 UTF-8 字符。要修复这个错误,请将客户端终端的编码设置为 UTF-8:

  • Gnome 终端:从终端菜单选择“设置字符编码”,然后选择 UTF-8。
  • PuTTY:右键单击标题栏打开菜单。然后选择“更改设置”。在“Window”→“转换”→“远程字符集”下,选择 UTF-8。

问:我在 /etc/yum.repos.d/amzn*.repo 中看到 report_instanceid 选项。这是做什么用的?

每个地区中的 Amazon Linux AMI 存储库都是 S3 存储桶。当实例上的 yum 流程从存储段下载程序包时,会记录有关 S3 连接的详细信息。
在 Amazon Linux AMI 环境中,采用 report_instanceid=yes 设置还可让 Amazon Linux AMI 存储库记录正在下载软件包的实例的 ID (i-xxxxxxxx) 和地区(例如,us-west-2)。这可让 Amazon Linux AMI 团队为各个实例提供更有侧重点、更具体的客户支持。
report_instanceid=yes 默认情况下仅为 Amazon Linux AMI 存储库启用。

问:为什么在系统发布的软件包升级后,/etc/yum.repos.d/amzn*.repo yum 存储库配置文件会被覆盖?

当系统发布软件包升级后,这些存储库配置文件会被覆盖,以保证实例始终看到对 Amazon Linux AMI yum 存储库配置的改动。
对于版本早于 2014.09 的 Amazon Linux AMI:
这些文件由 cloud-init 使用位于/etc/cloud/templates/amzn-*.repo.tmpl 的模板生成。会一直保存对这些模板文件进行的更改。

对于 Amazon Linux AMI 2014.09 及更高版本:

/e/etc/yum.repos.d/amzn*.repot 文件现在使用 yum 变量来帮助实例访问在地理位置上最近的存储库,因此不再使用 cloud-init 模板。当系统发布升级后,对这些文件的任何编辑将保存为 /etc/yum.repos.d/amzn*.repo.rpmsave

升级到 2014.09 的用户将看到对保存为 /etc/yum.repos.d/amzn*.repo.rpmsave/etc/yum.repos.d/amzn*.repo. 文件的所有编辑。

问:如何更改或者关闭手册页的颜色?

手册页的颜色在 /etc/profile.d/less.sh(bash 和 zsh)和 /etc/profile.d/less.csh (csh) 中进行配置。要关闭,需要删除所有以 export LESS_(bash 和 zsh)和/或 setenv LESS_ (csh) 开头的行。

问:如何对 2015.09 之前的实例禁用系统调用审计?

默认情况下,新发行的 2015.09 Amazon Linux AMI 版本中已禁用系统调用审计。系统调用审计会增加每次系统调用的开销,并可能导致明显的性能下降,尤其是在磁盘或网络密集型应用程序中。

如果您需要使用系统调用审计,请在 /etc/audit/audit.rules 中找到以下行,并将其删除或为其添加注释,然后重启审计守护程序。
-a never,task
示例(作为根):
# auditctl -l
LIST_RULES: task,never
# sed -i.bak -e '/^-a never,task$/ s/^/#/' /etc/audit/audit.rules
# service auditd restart
# auditctl -l
没有规则
如果您希望在 2015.09 AMI 之前的实例上获得相同的性能提升,请将相同的行 ( -a never,task ) 添加到 /etc/audit/audit.rules 并重新启动守护程序。如果要升级并且未对审计规则文件进行任何更改,则只需将新的默认规则文件移动或复制到 /etc/audit/audit.rules
示例(作为根):
# auditctl -l
没有规则
# cp -p /etc/audit/rules.d/audit.rules.default /etc/audit/audit.rules
cp: overwrite ‘/etc/audit/audit.rules’? y
# service auditd restart
# auditctl -l
LIST_RULES: task,never

问:您能否提供一个结合使用 cloud-init 和 mime-multipart 用户数据的示例?

如需适用于 cloud-init 的 mime-multipart 文档,请单击此处
MIME multipart 可能是一种棘手的格式,因此最好使用 write-mime-multipart 工具生成分段文件。该工具包含在 cloud-utils 软件包中,可通过 sudo yum install /usr/bin/write-mime-multipart 进行安装。该工具使用文件的第一行来确定 Content-Type,而 cloud-init 使用 Content-Type 来确定它应该如何解释文件。以下是一些示例文件:
#cloud-config
repo_releasever: 2015.09

#!/bin/bash
echo "cloud-init was here..." >> /tmp/cloud-init-was-here.txt
这里是一个 write-mime-multipart 示例,包括输出:
[ec2-user@ip-172-31-4-37 ~]$ write-mime-multipart repo_releasever-2015.09.cfg ci-was-here.sh
Content-Type: multipart/mixed; boundary="===============6347220379374809187=="
MIME-Version: 1.0

--===============6347220379374809187==
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="repo_releasever-2015.09.cfg"
#cloud-config
repo_releasever: 2015.09
--===============6347220379374809187==
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="ci-was-here.sh"
#!/bin/bash
echo "cloud-init was here..." >> /tmp/cloud-init-was-here.txt

--===============6347220379374809187==--
有关如何使用该工具的更多信息,可通过 man write-mime-multipart 获得。

问:如何配置 VPC 终端节点以便连接到 Amazon Linux AMI 存储库?

无需接入互联网也可访问 VPC 中的 yum 存储库。您的 VPC 终端节点策略必须允许从 VPC 到托管 Amazon Linux AMI 存储库的 S3 存储桶的流量。
下面是满足这一要求的 VPC 终端节点策略示例:
{
"Statement": [
{
"Sid": "Amazon Linux AMI Repository Access",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::packages.*.amazonaws.com/*",
"arn:aws:s3:::repo.*.amazonaws.com/*"
]
}
]
}

有关更多信息,请参阅 VPC 终端节点文档