如何创建正确连接多个基于 nitro 的卷的 EC2 AMI 映像

如何创建正确连接多个基于 nitro 的卷的 EC2 AMI 映像

我正在使用 EC2 映像构建器来自动化为 mongoDB 服务器创建 AMI 映像的过程。

此图像有两卷:

  • /data100 GB
  • /logs10 GB

为了实现这个设置,我创建了一个图像生成器配方附有 3 卷(其中一卷为根卷/)。

然后,映像生成器组件将格式化并安装卷。以下是执行此操作的步骤片段:

  - name: FormatAndMountDataVolume
    action: ExecuteBash
    inputs:
      commands:
        - sudo mkdir /data
        - sudo mkfs -t xfs /dev/nvme1n1
        - echo "/dev/nvme1n1  /data  xfs  defaults,nofail  0  2" | sudo tee -a /etc/fstab
        - sudo mount -a
        - sudo chown -R mongodb:mongodb /data
  - name: FormatAndMountLogsVolume
    action: ExecuteBash
    inputs:
      commands:
        - sudo mkdir /logs
        - sudo mkfs -t xfs /dev/nvme2n1
        - echo "/dev/nvme2n1  /logs  xfs  defaults,nofail  0  2" | sudo tee -a /etc/fstab
        - sudo mount -a
        - sudo chown -R mongodb:mongodb /logs

它运行正常,图像已创建。问题是实例使用 Nitro-System,其文档说明如下:

设备名称为 /dev/nvme0n1、/dev/nvme1n1 等。您在块设备映射中指定的设备名称将使用 NVMe 设备名称 (/dev/nvme[0-26]n1) 重命名。块设备驱动程序可以按照与您在块设备映射中为卷指定的顺序不同的顺序分配 NVMe 设备名称。

因此,上述 AMI 存在潜在问题。它将目录安装/data在设备上/dev/nvme1n1,并将/logs安装在 上/dev/nvme2n1,但 Amazon 不保证设备将使用此顺序命名。实例最终可能会有一个/logs容量为 100GB 的文件夹,而/data只有 10GB。

关于如何确保在为此 AMI 运行 EC2 实例时将卷安装在正确的文件夹中,您有什么想法吗?

答案1

在您的脚本中,有一个创建文件系统的步骤,mkfs还有另一个将其添加到fstab文件的步骤。

在添加之前,请从您刚刚格式化的设备fstab获取。 使用它来将安装说明添加到,而不是设备路径。UUID
UUIDfstab

这就是您可以更改代码的方法。

  commands:
    - sudo mkdir /data
    - sudo mkfs -t xfs /dev/nvme1n1
    - echo "$(blkid /dev/nvme1n1 | awk '{print $2}')  /data  xfs  defaults,nofail  0  2" | sudo tee -a /etc/fstab

请参阅有关 UUID 使用的其他答案:

https://stackoverflow.com/questions/64568780/aws-nvme-mounted-to-different-directory-after-reboot/67453438?noredirect=1#comment119235037_67453438


更新

您对 AMI 以及卷与其相关时的概念是不正确的。
卷是在生成 AMI 时附加的,无论您使用哪种机制来生成它。
当您使用映像生成器生成 AMI 时,它将在其上附加卷并运行您添加的命令来格式化您的设备(参见注释)。正是在您创建 AMI 时。而不是在您创建实例时。
因此,文件系统已经存在UUIDfstab已经配置。

您稍后从此 AMI 创建的每个实例都将与此 AMI 完全相同。

参见此示例,我创建了一个实例,使用 格式化设备xfs,通过 挂载它fstab,停止它并生成一个 AMI。
然后我从这个 AMI 启动了一个新实例,看到所有设备UUID都相同,甚至是来自根卷的设备。

生成AMI之前,实例名称ip-172-31-12-219

[root@ip-172-31-12-219 ~]# lsblk -f
NAME          FSTYPE LABEL UUID                                 MOUNTPOINT
nvme1n1
└─nvme1n1p1   xfs          e24884d7-26a2-457d-bf51-875907986bf0 /mnt/disk10
nvme0n1
├─nvme0n1p1   xfs    /     7b355c6b-f82b-4810-94b9-4f3af651f629 /
└─nvme0n1p128

上述 AMI 中的另一个实例,实例名称ip-172-31-8-239

[root@ip-172-31-8-239 ~]# lsblk -f
NAME          FSTYPE LABEL UUID                                 MOUNTPOINT
nvme1n1
└─nvme1n1p1   xfs          e24884d7-26a2-457d-bf51-875907986bf0 /mnt/disk10
nvme0n1
├─nvme0n1p1   xfs    /     7b355c6b-f82b-4810-94b9-4f3af651f629 /
└─nvme0n1p128

当您从控制台生成 AMI 时,您可以看到此消息。

在映像创建过程中,Amazon EC2 会为上述每个卷创建一个快照。

这意味着当您从此 AMI 创建实例时,所有卷都是从这些快照“恢复”的。每个位和字节都相同。

我希望我在这里已经解答了您的疑虑。


笔记

完全偏离主题,您正在磁盘上创建文件系统而不是分区。没关系,它受支持。但不建议这样做。
您可以搜索有关每个选项的更多信息。一个优点是分区对齐,这对 SSD 非常有帮助。

答案2

我会使用标签来代替。

  1. 更易于用户阅读
  2. 即使设备名称发生变化,它也能正常工作。

以下是一个例子:

- name: FormatAndMountDataVolume
  action: ExecuteBash
  inputs:
    commands:
      - sudo mkdir /data
      - sudo mkfs -t xfs -L DATA /dev/xvdb
      - echo "LABEL=DATA  /data xfs  defaults,nofail  0  2" | sudo tee -a /etc/fstab
      - sudo mount /data

相关内容