将块设备映射添加到 Amazon EC2 实例
默认情况下,您启动的实例包含所有在 AMI 的块设备映射中指定的存储设备(您是从该 AMI 启动实例的)。您可以在启动实例时,为实例指定要对块储存设备映射执行的更改,而这些更新会覆盖 AMI 的块储存设备映射或与其合并。
在启动实例时更新块储存设备映射
您可以在启动实例时向其添加 EBS 卷和实例存储卷。请注意,针对实例更新块储存设备映射不会对启动实例的 AMI 的块储存设备映射造成永久性更改。
- Console
-
在启动时更新实例的卷
-
按照启动实例的步骤操作,但在完成以下步骤更新卷前不要启动实例。
-
(可选)要添加卷,请选择配置存储、添加新卷。选择卷大小和卷类型。
-
(可选)要隐藏由 AMI 的块设备映射指定的卷,请选择配置存储、移除。
-
(可选)要修改 EBS 卷的配置,请在配置存储窗格上选择高级。展开该卷的信息,然后根据需要进行任何更改。
-
在 Summary(摘要)面板中查看实例配置,然后选择 Launch instance(启动实例)。有关更多信息,请参阅 使用控制台中的启动实例向导来启动 EC2 实例。
- AWS CLI
-
在启动时更新实例的卷
使用 run-instances 命令和 --block-device-mappings
选项。
--block-device-mappings file://mapping.json
例如,假定某个 AMI 块设备映射指定的设置如下:
-
/dev/xvda
– EBS 根卷
-
/dev/sdh
– 从 snap-1234567890abcdef0
创建的 EBS 卷
-
/dev/sdj
– 空 EBS 卷,大小为 100
-
/dev/sdb
– 实例存储卷 ephemeral0
假设以下为 mapping.json
中的实例块设备映射。
[
{
"DeviceName": "/dev/xvda",
"Ebs": {
"VolumeSize": 100
}
},
{
"DeviceName": "/dev/sdj",
"NoDevice": ""
},
{
"DeviceName": "/dev/sdh",
"Ebs": {
"VolumeSize": 300
}
},
{
"DeviceName": "/dev/sdc",
"VirtualName": "ephemeral1"
}
]
此实例块设备映射会执行以下操作:
-
覆盖根卷 /dev/xvda
的大小,将其增加到 100 GiB。
-
阻止 /dev/sdj
连接到该实例。
-
覆盖 /dev/sdh
的大小,将其增加到 300 GiB。请注意,不需要再次指定快照 ID。
-
添加临时卷 /dev/sdc
。如果实例类型不支持多个实例存储卷,则这将无效。如果实例类型支持 NVMe 实例存储卷,则会自动枚举这些卷并将其包含在实例块设备映射中,并且无法覆盖。
- PowerShell
-
在启动时更新实例的卷
使用 New-EC2Instance cmdlet 以及 -BlockDeviceMapping
参数和 -BlockDeviceMapping
参数。
-BlockDeviceMapping $bdm
假设以下为 $bdm
中的实例块设备映射。
$bdm = @()
$root = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$root.DeviceName = "/dev/xvda"
$ebs1 = New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice
$ebs1.VolumeSize = 100
$root.Ebs = $ebs1
$bdm += $root
$sdj = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$sdj.DeviceName = "/dev/sdj"
$sdj.NoDevice = ""
$bdm += $sdj
$sdh = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$sdh.DeviceName = "/dev/sdh"
$ebs2 = New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice
$ebs2.VolumeSize = 300
$sdh.Ebs = $ebs2
$bdm += $sdh
$sdc = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$sdc.DeviceName = "/dev/sdc"
$sdc.VirtualName = "ephemeral1"
$bdm += $sdc
此实例块设备映射会执行以下操作:
-
覆盖根卷 /dev/xvda
的大小,将其增加到 100 GiB。
-
阻止 /dev/sdj
连接到该实例。
-
覆盖 /dev/sdh
的大小,将其增加到 300 GiB。请注意,不需要再次指定快照 ID。
-
添加临时卷 /dev/sdc
。如果实例类型不支持多个实例存储卷,则这将无效。如果实例类型支持 NVMe 实例存储卷,则会自动枚举这些卷并将其包含在实例块设备映射中,并且无法覆盖。
更新正在运行的实例的块储存设备映射
在更改此属性之前,您不需要停止该实例。
- AWS CLI
-
更新正在运行的实例的块设备映射
使用 modify-instance-attribute 命令。
添加 --block-device-mappings
选项:
--block-device-mappings file://mapping.json
在 mapping.json
中,指定更新。例如,以下更新会将根设备卷更改为持久保留。
[
{
"DeviceName": "/dev/sda1
",
"Ebs": {
"DeleteOnTermination": false
}
}
]
- PowerShell
-
更新正在运行的实例的块设备映射
使用 Edit-EC2InstanceAttribute cmdlet。
添加 -BlockDeviceMapping
选项:
-BlockDeviceMapping $bdm
在 bdm
中,指定更新。例如,以下更新会将根设备卷更改为持久保留。
$ebd = New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice
$ebd.DeleteOnTermination = false
$bdm = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$bdm.DeviceName = "/dev/sda1
"
$bdm.Ebs = $ebd
查看实例块储存设备映射中的 EBS 卷
您可以轻松枚举映射到实例的 EBS 卷。
- Console
-
查看实例的 EBS 卷
-
打开 Amazon EC2 控制台。
-
在导航窗格中,选择 Instances (实例)。
-
选择实例,然后查看存储选项卡中显示的详细信息。至少,以下信息适用于根设备:
-
Root device type(例如 EBS )
-
Root Device Name(例如,/dev/xvda
)
-
Block devices(例如,/dev/xvda
、/dev/sdf
和 /dev/sdj
)
如果使用块储存设备映射启动了带有其他 EBS 卷的实例,则它们将显示在 Block devices(块储存设备)下。此选项卡上不会显示任何实例存储卷。
-
要显示有关 EBS 卷的其他信息,请选择其卷 ID 以转到卷页面。
- AWS CLI
-
查看实例的 EBS 卷
可以使用 describe-instances 命令。
aws ec2 describe-instances \
--instance-ids i-1234567890abcdef0
\
--query Reservations[*].Instances[0].BlockDeviceMappings
- PowerShell
-
查看实例的 EBS 卷
使用 Get-EC2Instance cmdlet。
(Get-EC2Instance -InstanceId i-0bac57d7472c89bac
).Instances.BlockDeviceMappings
实例类型将决定对实例可用的实例存储卷的数量和类型。如果块储存设备映射中的实例存储卷数超过了对实例可用的实例存储卷数,则其他卷将被忽略。要查看实例的实例存储卷,请运行 lsblk 命令(Linux 实例)或打开 Windows 磁盘管理(Windows 实例)。要了解每种实例类型支持的实例存储卷数,请参阅 Amazon EC2 instance type specifications。
当您查看实例的块储存设备映射时,可以只查看 EBS 卷,但是不能查看实例存储卷。您用于查看实例的实例存储卷的方法取决于卷类型。
NVMe 实例存储卷
您可以使用 NVMe 命令行程序包 nvme-cli 来查询块储存设备映射中的 NVMe 实例存储卷。运行以下命令,下载程序包,并在实例上安装该程序包。
[ec2-user ~]$
sudo nvme list
以下是实例的示例输出。“模型”列中的文本表示卷是 EBS 卷还是实例存储卷。在这个例子中,/dev/nvme1n1
和 /dev/nvme2n1
均为实例存储卷。
Node SN Model Namespace
---------------- -------------------- ---------------------------------------- ---------
/dev/nvme0n1 vol06afc3f8715b7a597 Amazon Elastic Block Store 1
/dev/nvme1n1 AWS2C1436F5159EB6614 Amazon EC2 NVMe Instance Storage 1
/dev/nvme2n1 AWSB1F4FF0C0A6C281EA Amazon EC2 NVMe Instance Storage 1 ...
您可以使用磁盘管理或 PowerShell 列出 EBS 和实例存储 NVMe 卷。有关更多信息,请参阅 将 Amazon EC2 Windows 实例上的 NVMe 磁盘映射到卷。
HDD 或 SSD 实例存储卷
您可以使用实例元数据在块储存设备映射中查询 HDD 或 SSD 实例存储卷。未包含 NVMe 实例储存卷。
所有针对实例元数据的请求的基本 URI 均为 http://169.254.169.254/latest/
。有关更多信息,请参阅 使用实例元数据管理 EC2 实例。
首先,连接到运行中的实例。从该实例中,使用此查询获取其块储存设备映射。
- IMDSv2
-
[ec2-user ~]$
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/block-device-mapping/
- IMDSv1
-
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/block-device-mapping/
该响应包含实例的块储存设备名称。举例来说,由实例存储支持的 m1.small
实例的输出如下所示。
ami
ephemeral0
root
swap
ami
设备是实例所看到的根设备。实例存储卷命名为 ephemeral[0-23]
。swap
设备用于存储页面文件。如果您还映射了一些 EBS 卷,它们会依次显示为 ebs1
、ebs2
等。
要了解块储存设备映射中的单个块储存设备的详细信息,可将其名称添加到上述查询,如下所示。
- IMDSv2
-
[ec2-user ~]$
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0
- IMDSv1
-
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0
首先,连接到运行中的实例。从该实例中,使用此查询获取其块储存设备映射。
PS C:\>
Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/block-device-mapping/
该响应包含实例的块储存设备名称。举例来说,由实例存储支持的 m1.small
实例的输出如下所示。
ami
ephemeral0
root
swap
ami
设备是实例所看到的根设备。实例存储卷命名为 ephemeral[0-23]
。swap
设备用于存储页面文件。如果您还映射了一些 EBS 卷,它们会依次显示为 ebs1
、ebs2
等。
要了解块储存设备映射中的单个块储存设备的详细信息,可将其名称添加到上述查询,如下所示。
PS C:\>
Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0