【问题标题】:AWS: Mounting a template disk with Batch / ECSAWS:使用 Batch / ECS 挂载模板磁盘
【发布时间】:2021-03-03 04:12:29
【问题描述】:

我正在使用 AWS Batch,但希望增加容器可用的磁盘空间。我正在使用 CloudFormation 创建堆栈,并添加了一个 EC2::LaunchTemplate 以向我的实例添加 100GB 磁盘:(从堆栈中提取)

BigDiskTemplate:
    Type: 'AWS::EC2::LaunchTemplate'
    Properties:
      LaunchTemplateData:
        BlockDeviceMappings:
          - DeviceName: '/dev/xvdcz'
            Ebs:
              Encrypted: true
              VolumeSize: 100
              VolumeType: gp2
      LaunchTemplateName: BigDiskTemplate
  MyComputeEnvironment:
    Type: 'AWS::Batch::ComputeEnvironment'
    Properties:
      Type: MANAGED
      ComputeEnvironmentName: MyEnv
      ComputeResources:
        Type: EC2
        MinvCpus: 0
        DesiredvCpus: 0
        MaxvCpus: 256
        LaunchTemplate:
          LaunchTemplateName: BigDiskTemplate
        InstanceTypes:
          - optimal
          - c5.large
        Subnets:
          - !Ref Subnet
        SecurityGroupIds:
          - !Ref SecurityGroup
        InstanceRole: !Ref IamInstanceProfile
      ServiceRole: !Ref BatchServiceRole
}

是的,我希望磁盘是临时的。是的,我知道一些 EC2 实例支持更大的磁盘,但我也想用 GPU 实例来做到这一点。

当我在容器中运行 lsblk 时,我得到:

NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme1n1       259:0    0  100G  0 disk 
└─nvme1n1p1   259:6    0  100G  0 part 
nvme0n1       259:1    0    8G  0 disk 
├─nvme0n1p1   259:2    0    8G  0 part /etc/hosts
└─nvme0n1p128 259:3    0    1M  0 part 

太棒了!这是我的 100GB 磁盘。 但我不知道如何安装它。 根据示例和教程(诚然适用于 EC2),模板磁盘应该可以通过以下方式安装:

file -s /dev/nvme1n1
mkfs -t xfs /dev/nvme1n1

mkdir /data
mount /dev/nvme1n1 /data

但是,这些步骤中的大多数都会出错。如“/dev/nvme1n1: 无法打开`/dev/nvme1n1' (No such file or directory)”; “mkfs.xfs:没有这样的文件或目录”; “挂载:/数据:权限被拒绝” 我也尝试过不同的驱动器名称 - 例如。 /dev/nvme1n1p1、nvme1n1 或 /nvme1n1/nvme1n1p1

那么我如何将这个磁盘挂载到我的容器中呢? Docker 是问题的一部分吗?

【问题讨论】:

  • 您需要使用 sudo 或 root shell。
  • 这是在 docker 容器内 - 即。默认为根。只是为了确保我尝试了 sudo(结果相同) - 但请注意,我必须将 sudo 安装到容器中才能使用它。
  • 您需要创建文件系统并从容器外部挂载它。然后使用 docker 的 -v 标志将它绑定到容器内。
  • 我该怎么做?容器内的 lsblk 正在显示磁盘。

标签: amazon-web-services docker amazon-cloudformation amazon-ecs mount


【解决方案1】:

以下是您应该采取的步骤:

  1. 将卷附加到 EC2 实例。现在lsblk 应该会显示设备。
  2. 将设备安装(并格式化)到类似/data 的位置。设置权限等。
  3. 在任务定义中,声明一个指向/data 的卷。
  4. 在您的容器定义中,声明一个挂载点。

您不能/不应该将设备直接安装到容器。


编辑:步骤 2 的详细信息

可以将用户数据脚本添加到您的启动配置中。这样您就可以安装(和格式化)设备。以这个脚本为例:

#!/bin/bash

# Device name. NOT block name like 'nvme0n1p1'.
device="/dev/sdp"

# Where to mount the device.
mountpoint="/data"

# Wait for device.
while [[ ! -b $(readlink -f ${device}) ]]; do
    echo "waiting for ${device}">&2; sleep 2;
done

# Format if not already formatted.
blkid $(readlink -f ${device}) || mkfs -t ext4 $(readlink -f ${device})

# Mount.
mkdir -p ${mountpoint}
mount $(readlink -f ${device}) ${mountpoint}
chmod 666 ${mountpoint}

# Persist the volume in /etc/fstab so it gets mounted again.
echo "$(readlink -f ${device}) ${mountpoint} ext4 defaults,nofail 0 2" >> /etc/fstab

【讨论】:

  • 感谢您的回复。好像我在做#1和#4。我想我已经尝试过#3,但不相信我做得对。我该怎么做#2?我没有直接使用 EC2,只是计算环境中的 LaunchType(用于任务)和 LaunchTemplate(两者都在上面)。我刚刚在文档中找到 AWS::ECS::VolumeAttachment 但这需要一个正在运行的实例?这一切似乎都非常复杂——我想要的只是让我的 AWS Batch 容器能够以更多(临时)磁盘空间运行!
  • 您可以在启动配置中包含用户数据。请查看我的更新答案
  • 只是确认您的回答 - 这很有帮助,我觉得我正在取得进步。目前 /data 正在从 /dev/nvme0n1p1 挂载并显示 8GB,但 lsblk 仍显示在上方(在容器中)。 df 不显示任何 100GB 分区。我正在尝试查找用户数据的诊断/日志记录 - 拼写错误或格式错误很容易把事情搞砸;并且还尝试使用启动模板创建一个常规的 ec2 实例并登录到该实例以四处探索。
  • 我运行了你脚本的前半部分,并设置为将输出发送到日志(我可以发布日志,但评论不够大!)。错误是调用挂载:“挂载:/dev/nvme1n1 已挂载或 /mydatadisk 忙”(我将 /data 更改为 /mydatadisk)。该日志还包括对 lsblk、df 和 findmnt 的调用,以及对 mount 的立即调用。那个服务器故障问题没有帮助。接下来我要更改设备名称。我注意到在容器内,/dev/nvme0n1p1(即默认的 8GB)正在安装在 /mydatadisk 上。
  • 是的,我的最后一个问题是,当我应该使用“/dev/sdp”或类似名称时,我使用的设备名称是“/dev/xvdcz”。我已经看到对此的引用是像这样安装的磁盘的设备名称。查看 lsblk 的诊断输出,我认为 /dev/xvdcz 只是覆盖了与 docker 相关的磁盘,并没有为用户挂载生成新的磁盘/分区(我现在看到 3:我的 100GB 现在称为 nvme2n1 )。在容器内,df 显示我的 /mydatadisk 为 100GB!优秀!感谢您的帮助!
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2021-04-06
  • 2015-07-21
  • 1970-01-01
  • 2021-02-21
相关资源
最近更新 更多