我正在使用 EC2 映像生成器来自动化为 mongoDB 服务器创建 AMI 映像的过程。
此图像有两卷:
/data
- 100 GB/logs
- 10 GB
为了实现这个设置,我创建了一个附加了 3 个卷的图像构建器配方(一个用于 root /
)。
然后,映像生成器组件格式化并安装卷。以下是执行此操作的步骤片段:
- 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
on 上/dev/nvme2n1
,但亚马逊不保证设备将使用此顺序命名。该实例可能最终拥有一个/logs
容量为 100GB 的文件夹,而/data
只有 10GB。
关于在为此 AMI 运行 EC2 实例时如何确保将卷安装在正确文件夹上的任何想法?
在您的脚本上,您有一个步骤可以创建文件系统,
mkfs
另一个步骤可以将其添加到fstab
文件中。在添加之前
fstab
获取UUID
刚刚格式化的来自设备。使用它
UUID
来添加安装指令fstab
,而不是设备路径。这就是您可以更改代码的方式。
请参阅有关 UUID 使用的其他答案:
https://stackoverflow.com/questions/64568780/aws-nvme-mounted-to-different-directory-after-reboot/67453438?noredirect=1#comment119235037_67453438
更新
您对 AMI 的概念以及卷与它相关的时间是不正确的。
卷会在您生成 AMI 时准确附加,无论您使用哪种机制来生成它。
当您使用映像生成器生成 AMI 时,它将在其上附加卷并运行您添加的命令以格式化您的设备(请参阅注释)。正是在您创建 AMI 的那一刻。不是在创建实例时。
所以,文件系统已经存在
UUID
,fstab
已经配置好了。您稍后从此 AMI 创建的每个实例都将与此 AMI 完全相同。
请参阅此示例,我创建一个实例,使用 格式化设备
xfs
,通过 安装它fstab
,停止它并生成一个 AMI。然后我从这个 AMI 启动了一个新实例,看到所有设备
UUID
都是相同的,即使是来自根卷的设备。在生成 AMI 之前,实例名称
ip-172-31-12-219
:上面 AMI 的另一个实例,实例名称
ip-172-31-8-239
:当您从控制台生成 AMI 时,您可以看到此消息。
这意味着当您从此 AMI 创建实例时,所有卷都是从这些快照“还原”的。每个位和字节都是相同的。
我希望我在这里澄清了你的疑问。
笔记
完全脱离主题,您正在磁盘上而不是分区上创建文件系统。没关系,支持。但不建议这样做。
您可以搜索有关每个选项的更多信息。一个优点是分区对齐,这对 SSD 非常有帮助。
我会改用标签。
这是一个例子: