

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

# 更改您的 AL2 实例的主机名
更改主机名

当您将实例启动到私有 VPC 中时，Amazon EC2 会分配一个来宾操作系统主机名。Amazon EC2 分配的主机名类型取决于您的子网设置。有关 EC2 主机名的更多信息，请参阅 [Amazon EC2 *用户指南中的 Amazon EC2* 实例主机名类型](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-instance-naming.html)。

配置为使用基于 IP 的命名和 IPv4 地址的 EC2 实例的典型 Amazon EC2 私有 DNS 名称如下所示：`ip-12-34-56-78.us-west-2.compute.internal`，其中名称由内部域、服务（在本例中为`compute`）、区域和一种形式的私有 IPv4 地址组成。当您登录实例时，Shell 提示符处显示此主机名的一部分 (例如，`ip-12-34-56-78`)。每次停止并重启 Amazon EC2 实例时（除非您使用的是弹性 IP 地址），公有 IPv4 地址都会更改，您的公有 DNS 名称、系统主机名和 shell 提示符也会发生变化。

**重要**  
此信息适用于 Amazon Linux。有关其他发布版本的信息，请参阅特定于该版本的文档。

## 更改系统主机名


如果为实例的 IP 地址注册了公用 DNS 名称 (如 `webserver.mydomain.com`)，则可以设置系统主机名，以便实例将自己标识为该域的一部分。这还会更改 shell 提示符，使其显示此名称的第一部分，而不是由 Amazon （例如`ip-12-34-56-78`）提供的主机名。如果没有注册公用 DNS 名，还是可以更改主机名，但过程略有差异。

为使主机名持续更新，您必须确认 `preserve_hostname` cloud-init 设置已设为 `true`。您可以运行以下命令来编辑或添加此设置：

```
sudo vi /etc/cloud/cloud.cfg
```

如果未列出 `preserve_hostname` 设置，请在文件末尾添加以下文本行：

```
preserve_hostname: true
```

**将系统主机名更改为公用 DNS 名称**

如果已注册了公用 DNS 名称，请执行此过程。

1. 
   + 对于 AL2：使用**hostnamectl**命令设置您的主机名以反映完全限定的域名（例如**webserver.mydomain.com**）。

     ```
     [ec2-user ~]$ sudo hostnamectl set-hostname webserver.mydomain.com
     ```
   + 对于 Amazon Linux AMI：在您的实例上，使用常用的文本编辑器打开 `/etc/sysconfig/network` 配置文件，更改 `HOSTNAME` 条目以反映完全限定域名（例如 **webserver.mydomain.com**）。

     ```
     HOSTNAME=webserver.mydomain.com
     ```

1. 重启实例以接受新主机名。

   ```
   [ec2-user ~]$ sudo reboot
   ```

   或者，您也可以使用 Amazon EC2 控制台重启（在**实例**页面上，选择实例，然后依次选择**实例状态**、**重启实例**）。

1. 登录实例，验证主机名是否已更新。提示符应显示新主机名（直到第一个“.”），**hostname** 命令应显示完全限定域名。

   ```
   [ec2-user@webserver ~]$ hostname
   webserver.mydomain.com
   ```

**在无公用 DNS 名称的情况下更改系统主机名**

1. 
   + 对于 AL2：使用**hostnamectl**命令设置您的主机名以反映所需的系统主机名（例如**webserver**）。

     ```
     [ec2-user ~]$ sudo hostnamectl set-hostname webserver.localdomain
     ```
   + 对于 Amazon Linux AMI：在您的实例上，使用常用的文本编辑器打开 `/etc/sysconfig/network` 配置文件，更改 `HOSTNAME` 条目以反映所需的系统主机名（例如 **webserver**）。

     ```
     HOSTNAME=webserver.localdomain
     ```

1. 在您常用的文本编辑器中打开 `/etc/hosts` 文件，更改以 **127.0.0.1** 开始的条目，以匹配以下示例，替换为您自己的主机名。

   ```
   127.0.0.1 webserver.localdomain webserver localhost4 localhost4.localdomain4
   ```

1. 重启实例以接受新主机名。

   ```
   [ec2-user ~]$ sudo reboot
   ```

   或者，您也可以使用 Amazon EC2 控制台重启（在**实例**页面上，选择实例，然后依次选择**实例状态**、**重启实例**）。

1. 登录实例，验证主机名是否已更新。提示符应显示新主机名（直到第一个“.”），**hostname** 命令应显示完全限定域名。

   ```
   [ec2-user@webserver ~]$ hostname
   webserver.localdomain
   ```

您还可以实施更多的编程解决方案，例如指定用户数据以配置您的实例。如果您的实例是自动扩缩组的一部分，您可以使用生命周期挂钩定义用户数据。有关更多信息，请参阅《Amazon CloudFormation 用户指南》中的[启动时在 Linux 实例上运行命令](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/user-data.html)和[用于实例启动的生命周期挂钩](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#aws-resource-autoscaling-lifecyclehook--examples--Lifecycle_hook_for_instance_launch)。

## 在不影响主机名的情况下更改 Shell 提示符


如果您不想修改实例的主机名，但希望显示比提供的私有名称（例如**webserver**）更有用的系统名称 Amazon （例如`ip-12-34-56-78`），则可以编辑 shell 提示符配置文件以显示您的系统昵称而不是主机名。

**将 Shell 提示符更改为主机别名**

1. 在 `/etc/profile.d` 中创建一个文件，用于将称为 `NICKNAME` 的环境变量设置为要在 Shell 提示符中显示的值。例如，若要将系统别名设置为 **webserver**，请运行以下命令。

   ```
   [ec2-user ~]$ sudo sh -c 'echo "export NICKNAME=webserver" > /etc/profile.d/prompt.sh'
   ```

1. 使用您常用的文本编辑器（例如 `/etc/bashrc` 或 `/etc/bash.bashrc`）打开 **vim** (Red Hat) 或 **nano** (Debian/Ubuntu) 文件。您需要在编辑器命令中使用 **sudo**，因为 `/etc/bashrc` 和 `/etc/bash.bashrc` 归 `root` 所有。

1. 编辑文件，将 Shell 提示符变量 (`PS1`) 更改为显示别名而不是主机名。在 `/etc/bashrc` 或 `/etc/bash.bashrc` 中查找以下设置 Shell 提示符的行（为了上下文需要，下面多显示了几行；查找以 `[ "$PS1"` 开头的行）：

   ```
     # Turn on checkwinsize
     shopt -s checkwinsize
     [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
     # You might want to have e.g. tty in prompt (e.g. more virtual machines)
     # and console windows
   ```

   将该行中的 `\h` (`hostname` 的符号) 更改为 `NICKNAME` 变量的值。

   ```
     # Turn on checkwinsize
     shopt -s checkwinsize
     [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@$NICKNAME \W]\\$ "
     # You might want to have e.g. tty in prompt (e.g. more virtual machines)
     # and console windows
   ```

1. (可选) 要将 Shell 窗口上的标题设置为新别名，请完成以下步骤。

   1. 创建一个名为的文件 `/etc/sysconfig/bash-prompt-xterm`。

      ```
      [ec2-user ~]$ sudo touch /etc/sysconfig/bash-prompt-xterm
      ```

   1. 使用以下命令使该文件可执行。

      ```
      [ec2-user ~]$ sudo chmod +x /etc/sysconfig/bash-prompt-xterm
      ```

   1. 在您常用的文本编辑器（如 **nano** 或 **vim**）中打开 `/etc/sysconfig/bash-prompt-xterm` 文件。您需要在编辑器命令中使用 **sudo**，因为 `/etc/sysconfig/bash-prompt-xterm` 归 `root` 所有。

   1. 将以下行添加到该文件。

      ```
      echo -ne "\033]0;${USER}@${NICKNAME}:${PWD/#$HOME/~}\007"
      ```

1. 注销，再重新登录，以接受新别名值。

## 在其他 Linux 发行版上更改主机名


此页面上的过程仅适用于 Amazon Linux。有关其他 Linux 发行版的更多信息，请参阅其特定文档和下列文章：
+ [如何为运行 RHEL 7 或 Centos 7 的私有 Amazon EC2 实例分配静态主机名？](https://www.amazonaws.cn/premiumsupport/knowledge-center/linux-static-hostname-rhel7-centos7/)