缩小 Amazon EBS 卷大小

Pet*_*mit 25 amazon-ebs amazon-web-services

我已经看到了这个关于 EBS 卷增长的答案,但我想缩小一个。

默认的 Ubuntu Server 映像是 15 GB,而我最多只需要 2 GB(我使用不同的数据卷)。有没有办法缩小卷的大小?

小智 27

我和你有同样的问题,所以我想出了如何去做。

首先,我是从美国东部地区的 Ubuntu 32 位 EBS 支持的 ami 中完成的,其他操作系统或图像可能会有所不同。但是,我怀疑您应该没问题,只要您使用的是 ext* 文件系统。它可能适用于其他文件系统,但您必须自己弄清楚如何调整它们的大小。

步骤基本上是:

  1. 将两个卷附加到正在运行的实例,第一个基于您要缩小的快照,第二个是具有您要缩小到的新大小的空白卷。

  2. 检查第一卷的文件系统并修复任何错误。

  3. 缩小第一个卷上的文件系统,使其大小仅与保存数据所需的一样大。

  4. 将文件系统从第一个卷复制到第二个卷。

  5. 将第二个卷上的文件系统扩展到它的最大大小。

  6. 检查第二卷是否有错误,确保一切正常。

  7. 拍摄第二卷的快照。

  8. 根据您刚刚拍摄的第二个卷的快照创建机器映像。

您首先需要从要缩小的 ami 中获取一些信息。特别是,您需要内核 ID 和 ramdisk ID,如果有的话(我缩小的图像没有 ramdisk)。所有这些信息都可以从 aws 管理控制台的 AMI 窗口中获得。

内核 ID 看起来像 kia-xxxxxxxx,快照 ID 看起来像 snap-xxxxxxxx,而 ramdisk ID 看起来像 RIA-xxxxxxxx。

接下来,启动一个 linux 实例。我启动了一个 Ubuntu 实例。如果您愿意,可以使用 t1.micro 实例。执行这些后续步骤并不需要太多能量。

机器运行后,附上您在第一步中写下的快照。就我而言,我将它附加到 /dev/sdf

然后,创建一个具有所需大小的新卷。就我而言,我创建了一个 5GB 的卷,因为这是我想将其缩小到的大小。不要从快照创建这个新卷。我们需要一个新的空白卷。接下来,将它附加到正在运行的实例,在我的情况下,我将它附加为 /dev/sdg

接下来,通过 ssh 进入机器,但不要挂载附加的卷。

此时,我偏执偏执,选择大容量检查文件系统,以确保没有错误。如果您确信没有,则可以跳过此步骤:

$ sudo e2fsck -f /dev/sdf
Run Code Online (Sandbox Code Playgroud)

接下来,我调整了大卷上的文件系统的大小,使其仅与磁盘上的数据一样大:

$ sudo resize2fs -M -p /dev/sdf
Run Code Online (Sandbox Code Playgroud)

-M 缩小它,-p 打印进度。

resize2fs 应该告诉你收缩文件系统有多大。就我而言,它给了我 4K 块的大小。

我们现在将 shrunkin 文件系统复制到新磁盘。我们要以 16MB 的块复制数据,所以我们需要弄清楚我们需要复制多少个 16MB 的块。这就是缩小的文件系统大小派上用场的地方。

就我而言,缩小后的文件系统仅超过 1 GB,因为我在拍摄快照之前在基本 Ubuntu 系统上安装了很多其他程序。我可能只需复制四舍五入到最接近的 16MB 的文件系统的大小就可以逃脱,但我想安全地使用它。

因此,128 次 16MB 块 = 2GB:

$ sudo dd if=/dev/sdf ibs=16M of=/dev/sdg obs=16M count=128
Run Code Online (Sandbox Code Playgroud)

我以 16MB 的块复制,因为使用 EBS,您需要为每次读取和写入付费,所以我想尽可能减少它们的数量。我不知道这样做是否会这样做,但它可能没有伤害。

然后,我们需要调整刚刚复制到新卷的文件系统的大小,以便它使用卷上的所有可用空间。

$ sudo resize2fs -p /dev/sdg
Run Code Online (Sandbox Code Playgroud)

最后,检查一下,以确保一切正常:

$ sudo e2fsck -f /dev/sdg
Run Code Online (Sandbox Code Playgroud)

这就是我们需要在这台机器上做的所有事情,尽管挂载新卷并没有什么坏处,只是作为一个测试。然而,这一步几乎可以肯定是可选的,因为 e2fsck 应该已经发现了任何问题。

我们现在需要对新卷进行快照,并基于它创建一个 AMI。我们已经完成了机器,因此您可以根据需要终止它。

如果您安装了小卷,请确保将其卸载,然后拍摄它的快照。同样,您可以在管理控制台中执行此操作。

最后一步需要命令行 ec2 工具。

编辑:

由于此答案已发布,AWS 控制台允许您只需右键单击快照并选择从快照创建映像。您仍然需要选择适当的内核 ID。如果它没有出现在列表中,请确保您选择了合适的架构。

我们使用 ec2-register 应用程序根据您刚刚拍摄的快照注册 AMI,因此请记下您刚刚拍摄的快照中的 snap-xxxxxxxx 值。

然后,您应该使用如下命令:

ec2-register -C cert.pem -K sk.pem -n The_Name_of_Your_New_Image
-d Your_Description_of_This_New_AMI --kernel aki-xxxxxxxx
-b "/dev/sda1=snap-xxxxxxxx" --root-device-name /dev/sda1
Run Code Online (Sandbox Code Playgroud)

您当然需要将内核 ID 替换为您在开始时记下的 ID,并将快照 ID 替换为您在上一步中创建的 ID。您还需要将其指向上面的密钥(称为 sk.pem)和 x509 证书(称为 cert.pem)。您当然可以选择任何您想要的名称和描述。

希望这可以帮助。

  • 应该很明显,但不要忘记按照 AWS 文档`sudo mkfs -t ext4 /dev/sdg` 在卷 (/facepalm) 上创建文件系统。 (2认同)

小智 1

是的,我也想知道这个问题。以下教程有点过头了,但我认为它包含必要的工具: http://www.linuxconfig.org/Howto_CREATE_BUNDLE_UPLOAD_and_ACCESS_custom_Debian_AMI_using_ubuntu

应该可以启动大型 AMI,创建新的 EBS,将 EBS 连接到正在运行的实例,然后将正在运行的 AMI 复制到新的 EBS,而不是像上面那样安装到新的磁盘映像上。最后,将新的 EBS 注册为 AMI。

查看此博文了解更多背景信息,尤其是 freremark 的评论: http://alestic.com/2010/01/public-ebs-boot-amis-for-ubuntu-on-amazon-ec2

最后一点,euca2ools 似乎是 ec2-ami-tools 的一个很好的替代品 - euca2ools 包含实际的联机帮助页!它们与 ec2-* 命令具有相同的名称,只是带有 euca- 前缀。 http://open.eucalyptus.com/wiki/Euca2oolsUsing