我一直在使用Amazon ECS AMI在 m5 EC2 实例上,我注意到有一个新的 m5d 实例类型,它类似,但带有 70 GB 本地 SSD。由于这些是一次性实例,更快的半廉价 SSD 似乎很完美,但我不知道如何实际使用这个本地存储。
我最初尝试在块设备映射中用 ephemeral0 替换 /dev/xvda 或 /dev/xvdcz 设备:
BlockDeviceMappings:
- DeviceName: /dev/xvdcz
VirtualName: ephemeral0
..但这似乎没有任何作用(盒子上的日志显示 ephemeral0 不存在),我发现在文档中那:
[NVMe 实例存储卷] 这些卷会自动枚举并分配设备名称;将它们包含在块设备映射中不会产生任何效果。
由于 ECS AMI 使用 LVM 分区,我可以为 /dev/xvdcz 创建一个小型 EBS 卷,然后将本地分区(在中可见lsblk
)添加到 LVM 存储,但事实上 NVMe 分区具有任意名称,这使得这很难以安全的方式执行。
所以这就是我被困住的地方。如果你不能在块设备映射中使用本地存储,而且设备名称是半随机的,你该如何使用本地存储?亚马逊是否希望你在每次启动这些实例时手动登录并编辑 fstab?我觉得我一定漏掉了什么。
我意识到可能存在特殊规则阻止我用临时设备替换根设备,但如果它甚至不能替换数据卷,我就不知道该如何使用它。
答案1
你不能使用实例存储身为你的根设备。很多年前这曾经是可能的,但据我所知,新的 AMI 不再支持它。所以你的根必须在 EBS 上,并且你必须格式化并安装短暂的设备在启动期间并且仅将其用于临时数据、缓存文件夹、tmp 等。
不,您不需要通过 SSH 连接到实例并手动执行此操作。相反,请将所需的命令放入UserData
实例首次启动时执行的脚本中。要了解更多信息,请UserData
参阅启动时在 Linux 实例上运行命令
更新:其中一个问题是实例存储设备名称不太可预测。可能是/dev/nvme1n1
或/dev/nvme2n1
或谁知道是什么。幸运的是,所有磁盘设备在下都有更具描述性的别名/dev/disk/by-id/
,我们可以将它们用于我们的目的:
[ec2-user@ip-172-31-10-228 ~]$ ls -l /dev/disk/by-id/
nvme-Amazon_EC2_NVMe_Instance_Storage_AWS12B74F473B3456789 << instance storage
nvme-Amazon_EC2_NVMe_Instance_Storage_AWS12B74F473B3456789-ns-1 << instance storage
nvme-Amazon_Elastic_Block_Store_vol0199d8c18d345678a
nvme-Amazon_Elastic_Block_Store_vol0199d8c18d345678a-...
...
前两行是实例存储。我不确定/dev/disk/by-id/nvme-Amazon_EC2_NVMe_Instance_Storage_AWS12B74F473B3456789
和...-ns-1
别名之间有什么区别,它们指的是同一个块设备,所以我们可以使用其中任何一个。
我们现在需要做的就是在启动期间找到实际的/dev/disk/by-id/nvme-Amazon_EC2_NVMe_Instance_Storage_...
设备名称,格式化它,添加/etc/fstab
并挂载它。笔记:我们将其添加,/etc/fstab
以便它在重启后再次安装。
现在我们将所有部分组合成一个云形成模板。应该这样做:
Instance:
Type: 'AWS::EC2::Instance'
Properties:
[...]
UserData:
Fn::Base64: |
#!/bin/bash -x
IDX=1
for DEV in /dev/disk/by-id/nvme-Amazon_EC2_NVMe_Instance_Storage_*-ns-1; do
mkfs.xfs ${DEV}
mkdir -p /local${IDX}
echo ${DEV} /local${IDX} xfs defaults,noatime 1 2 >> /etc/fstab
IDX=$((${IDX} + 1))
done
mount -a
一旦创建并启动实例,您就应该拥有实例 / 临时 / SSD 存储安装在/local1
:
[ec2-user@ip-172-31-10-228 ~]$ mount | grep /local1
/dev/nvme1n1 on /local1 type xfs (rw,noatime,attr2,inode64,noquota)
这里显示的是规范的设备名称/dev/nvme1n1
,而不是/dev/disk/by-id/..
设备别名。但它仍然是同一个磁盘。
希望有帮助:)