问:什么是 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 Linux AMI 的源代码?

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

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

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

问:Amazon Linux AMI 的更新多长时间发布一次?

Amazon Linux AMI 采用滚动发布方式构建和维护。我们支持用户将 Amazon Linux AMI 视为一个软件包系列,而 AMI 图像本身就是实时快照。

 

通过采用滚动发布方式,可以确保我们的 Amazon Linux AMI 和基于那些 AMI 的客户实例能在发布时支持最新的 EC2 和 AWS 功能。这样一来,Amazon Linux AMI 也会成为其他 Linux AMI 制作者(第三方和 Amazon Linux AMI 的下游)的参考点,从而也能够支持这些功能。

 

该模型意味着客户将更有可能在安全、性能和功能方面获得最新的增强,从而在运行的时候减轻他们遇到的许多问题的难度。

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

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

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

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

问:如何报告故障或发送功能和软件包请求?

我们通过 Amazon EC2 开发论坛发送故障报告、功能请求和程序包请求。这些论坛由 AWS Developer Support 以及 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 将配置为指向“最新”。您可以通过查看“releasever”变量来了解您的实例指向了哪些存储库,该变量位于/etc/yum.conf下 – 默认情况下,Amazon Linux AMI 采用的是 releasever=latest 设置。

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

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

若需在新的实例中启用此功能,请启动(例如) 2015.09 Amazon Linux AMI,并将以下用户数据传递给 cloud-init,这可以通过 EC2 控制台,或者通过 aws ec2 run-instances with the --user-data 标记(也可以通过 ec2-run-instances -f 完成)。

#cloud-config
repo_releasever: 2015.09

要将现有实例锁定在其当前版本(用 /etc/system-release 表示),请编辑 /etc/yum.conf。标记出读取为 releasever=latest 的行并执行 yum 清除全部以清除缓存。

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

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

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

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

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

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

在请求实例向导中的“Advanced Instance Options”页面上,有一个用于发送 Amazon Linux AMI 用户数据的文本字段。此数据可能是以文本形式输入的内容,也可能是以文件形式上传的内容。任何情况下,此数据都应为:

#cloud-config
repo_upgrade: none

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

创建一个名称前面带有 user-data 的文本文件,然后将其传递至 aws ec2 run-instances 并为其设置“user-data file:// ”标志 (此操作也可使用 ec2-run-instances -f 完成)。

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

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

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

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

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

较新版本的 mdadm 会使用 1.2 版超级数据块创建 RAID 阵列,此超级数据块无法自动与有编号的设备组合。通过为文件系统设置标签来引用分区。大多数文件系统创建工具都使用 -L 标志设置标签。一般设置,标签将被安装参考或处于带 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
安装标签 = RAID0 /mnt/RAID0

示例:设置现有 ext[2-4] 文件系统的标签。

e2label /dev/md127 RAID
mkdir -p /mnt/RAID
安装标签 = 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 安装 /dev/xvdf /mnt
  • 修改已连接卷中的 sudoers 文件并取消 wheel 组的注释。
    sudo sed -i.bak 's,# \(%wheel\s\+ALL=(ALL)\s\+ALL\),\1,' /mnt/etc/sudoers
  • 卸载卷。
    sudo 卸载 -d /dev/xvdf
  • 分离此卷。
  • 将卷重新连接到您已停止的实例上(确保设备状态与其分离之前的状态相同,通常为:/dev/sda1)。
  • 启动受影响的实例。

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

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

  • GNOME 终端:从终端菜单选择“Set Character Encoding”,然后选择“UTF-8”。
  • PuTTY:右键单击标题栏打开菜单。 然后选择“Change Settings”。 在“Window → Translation → Remote Character Set”下,选择“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 的模板生成。这些模板文件的更改会一直保存。

对于版本等于和晚于 2014.09 的 Amazon Linux AMI:

/etc/yum.repos.d/amzn*.repo 文件现在使用 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 文件的所有编辑。

问:如何更改或者关闭 man 页面的颜色?

man 页面的颜色在 /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 存储库的连接?

无需接入 Internet 也可访问 VPC 中的 yum 存储库。您的 VPC 终端节点策略必须允许从 VPC 到托管 Amazon Linux AMI 存储库的 S3 存储桶的流量。

下面是满足这一要求的 VPC 终端节点策略示例:

{
  "Statement": [
    {
      "Sid": "Amazon Linux AMI Repository Access",
      "委托人": "*",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::packages.*.amazonaws.com/*",
        "arn:aws:s3:::repo.*.amazonaws.com/*"
      ]
    }
  ]
}

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