扩展 EC2HardwareBuilder class 以将引导卷的其他大小设置为 10GB
extend EC2HardwareBuilder class to set an other size for the boot volume as 10GB
我结合使用 Apache Brooklyn 和 jCloud EC2 在 AWS 上创建 ec2 实例。
ec2 实例设置:
- 区域:eu-central-1(法兰克福)
- 图片编号:ami-10d1367f
- 名称:amzn-ami-minimal-hvm-2016.03.0.x86_64-s3
- RootDeviceType:实例存储
- 虚拟化类型:hvm
- 硬件编号:d2x_large
- vCPU:4
- 内存:30.5 GB
- 存储空间:3x2000 GB
每次创建 ec2 实例时,根分区只有 10GB 磁盘 space。我在jCloud [ECHardwareBuilder]:(https://github.com/jclouds/jclouds/blob/master/apis/ec2/src/main/java/org/jclouds/ec2/compute/domain/EC2HardwareBuilder.java#L731)
中发现了问题
/**
* @see InstanceType#D2_XLARGE
*/
public static EC2HardwareBuilder d2_xlarge() {
return new EC2HardwareBuilder(InstanceType.D2_XLARGE).d2()
.ram(31232)`enter code here`
.processors(ImmutableList.of(new Processor(4.0, 3.5)))
.volumes(ImmutableList.<Volume>of(
new VolumeBuilder().type(LOCAL).size(10.0f).device("/dev/sda1").bootDevice(true).durable(false).build(),
new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdb").bootDevice(false).durable(false).build(),
new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdc").bootDevice(false).durable(false).build(),
new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdd").bootDevice(false).durable(false).build()))
.is64Bit(true);
}
我的问题是:
- 是否可以创建我自己的 class 来扩展 EC2HardwareBuilder,以便我可以将根卷大小更改为 2000?
- 如何将此 class 注入 brooklyn,以便使用它代替旧的 EC2HardwareBuilder class?
EC2HardwareBuilder.d2_xlarge
方法仅表示该实例类型的默认值。它不控制实际配置的内容。
如果您手动配置,您可以看到这一点 - 在存储下,它提供 /dev/sdb、/dev/sdc 和 /dev/sdd。如果您尝试编辑此 "storage" 部分,它只会让您选择 /dev/sd{b-m} 的设备。它不会让您选择 /dev/sda1。当我使用默认设置部署时,它实际上为 /dev/xvda1:
提供了一个 2G 分区
[ec2-user@ip-172-31-5-36 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 2.0G 686M 1.3G 36% /
devtmpfs 15G 72K 15G 1% /dev
tmpfs 15G 0 15G 0% /dev/shm
当我使用下面的蓝图(使用 brooklyn master)与 Brooklyn 一起部署时,它还为 /dev/xvda1:
提供了一个 2G 分区
location:
jclouds:aws-ec2:eu-central-1:
hardwareId: d2.xlarge
imageId: eu-central-1/ami-10d1367f
services:
- type: org.apache.brooklyn.entity.machine.MachineEntity
你能确认你得到的肯定是 10G 而不是 2G 吗?我怀疑大小取决于 AMI。
从 jclouds 的角度来看,问题在于无法通过 EC2 api 发现此信息,因此在 jclouds 中进行了硬编码!
我们可以添加 jclouds 功能增强以更改使用 /dev/sd{b-m} 中的哪一个(可以在 AWS 网络控制台中完成),但这不能解决您的问题。
如 http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html#storage-for-the-root-device 中所述,Amazon Instance Store-Backed AMI "root device volume" 的大小限制为 10 GiB。
要拥有更大的根分区,您可以:
- 使用 EBS 支持的 AMI
- 尝试即时调整它的大小(但这实际上是 移动 到不同的分区,而不是仅仅向右调整大小;关于这个的讨论, 参见 https://askubuntu.com/a/728141, which links to https://unix.stackexchange.com/a/227318)
- 解决它:
/
中的什么需要全部 space?你能把 /dev/sdb 挂载到合适的目录吗?
我个人更喜欢 "work around it" 方法(假设 EBS-Backed 不适合您)。
为了将来参考,如果您确实想覆盖 EC2HardwareBuilder.d2_xlarge 等方法的行为,那么很遗憾,您不能!这些是静态方法。你必须用你自己的 class 版本构建一个 jar(当然是针对正确版本的 jclouds 编译的),并将其放入 $BROOKLYN_HOME./lib/patch/
.
通常,jclouds 非常适合通过在 guice 中配置事物(以更改注入的依赖项)来覆盖和自定义事物,但不幸的是这里没有。
如果您确实想使用 guice,您可以绑定整个 EC2HardwareSupplier
的不同实现(从而避免静态调用),但我们需要非常小心else 也在调用这些静态方法。
我结合使用 Apache Brooklyn 和 jCloud EC2 在 AWS 上创建 ec2 实例。
ec2 实例设置:
- 区域:eu-central-1(法兰克福)
- 图片编号:ami-10d1367f
- 名称:amzn-ami-minimal-hvm-2016.03.0.x86_64-s3
- RootDeviceType:实例存储
- 虚拟化类型:hvm
- 硬件编号:d2x_large
- vCPU:4
- 内存:30.5 GB
- 存储空间:3x2000 GB
每次创建 ec2 实例时,根分区只有 10GB 磁盘 space。我在jCloud [ECHardwareBuilder]:(https://github.com/jclouds/jclouds/blob/master/apis/ec2/src/main/java/org/jclouds/ec2/compute/domain/EC2HardwareBuilder.java#L731)
中发现了问题/**
* @see InstanceType#D2_XLARGE
*/
public static EC2HardwareBuilder d2_xlarge() {
return new EC2HardwareBuilder(InstanceType.D2_XLARGE).d2()
.ram(31232)`enter code here`
.processors(ImmutableList.of(new Processor(4.0, 3.5)))
.volumes(ImmutableList.<Volume>of(
new VolumeBuilder().type(LOCAL).size(10.0f).device("/dev/sda1").bootDevice(true).durable(false).build(),
new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdb").bootDevice(false).durable(false).build(),
new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdc").bootDevice(false).durable(false).build(),
new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdd").bootDevice(false).durable(false).build()))
.is64Bit(true);
}
我的问题是:
- 是否可以创建我自己的 class 来扩展 EC2HardwareBuilder,以便我可以将根卷大小更改为 2000?
- 如何将此 class 注入 brooklyn,以便使用它代替旧的 EC2HardwareBuilder class?
EC2HardwareBuilder.d2_xlarge
方法仅表示该实例类型的默认值。它不控制实际配置的内容。
如果您手动配置,您可以看到这一点 - 在存储下,它提供 /dev/sdb、/dev/sdc 和 /dev/sdd。如果您尝试编辑此 "storage" 部分,它只会让您选择 /dev/sd{b-m} 的设备。它不会让您选择 /dev/sda1。当我使用默认设置部署时,它实际上为 /dev/xvda1:
提供了一个 2G 分区
[ec2-user@ip-172-31-5-36 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 2.0G 686M 1.3G 36% /
devtmpfs 15G 72K 15G 1% /dev
tmpfs 15G 0 15G 0% /dev/shm
当我使用下面的蓝图(使用 brooklyn master)与 Brooklyn 一起部署时,它还为 /dev/xvda1:
提供了一个 2G 分区
location:
jclouds:aws-ec2:eu-central-1:
hardwareId: d2.xlarge
imageId: eu-central-1/ami-10d1367f
services:
- type: org.apache.brooklyn.entity.machine.MachineEntity
你能确认你得到的肯定是 10G 而不是 2G 吗?我怀疑大小取决于 AMI。
从 jclouds 的角度来看,问题在于无法通过 EC2 api 发现此信息,因此在 jclouds 中进行了硬编码!
我们可以添加 jclouds 功能增强以更改使用 /dev/sd{b-m} 中的哪一个(可以在 AWS 网络控制台中完成),但这不能解决您的问题。
如 http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html#storage-for-the-root-device 中所述,Amazon Instance Store-Backed AMI "root device volume" 的大小限制为 10 GiB。
要拥有更大的根分区,您可以:
- 使用 EBS 支持的 AMI
- 尝试即时调整它的大小(但这实际上是 移动 到不同的分区,而不是仅仅向右调整大小;关于这个的讨论, 参见 https://askubuntu.com/a/728141, which links to https://unix.stackexchange.com/a/227318)
- 解决它:
/
中的什么需要全部 space?你能把 /dev/sdb 挂载到合适的目录吗?
我个人更喜欢 "work around it" 方法(假设 EBS-Backed 不适合您)。
为了将来参考,如果您确实想覆盖 EC2HardwareBuilder.d2_xlarge 等方法的行为,那么很遗憾,您不能!这些是静态方法。你必须用你自己的 class 版本构建一个 jar(当然是针对正确版本的 jclouds 编译的),并将其放入 $BROOKLYN_HOME./lib/patch/
.
通常,jclouds 非常适合通过在 guice 中配置事物(以更改注入的依赖项)来覆盖和自定义事物,但不幸的是这里没有。
如果您确实想使用 guice,您可以绑定整个 EC2HardwareSupplier
的不同实现(从而避免静态调用),但我们需要非常小心else 也在调用这些静态方法。