缩小Amazon EBS卷大小


Answers:


27

我和您有同样的问题,所以我想出了解决方法。

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

这些步骤基本上是:

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

  2. 检查第一个卷的文件系统并修复所有错误。

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

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

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

  6. 通过检查第二卷中的错误来确保一切都正常。

  7. 拍摄第二卷的快照。

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

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

内核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

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

$ sudo resize2fs -M -p /dev/sdf

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

resize2fs应该告诉您shrunkin文件系统有多大。就我而言,它给了我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

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

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

$ sudo resize2fs -p /dev/sdg

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

$ sudo e2fsck -f /dev/sdg

这是我们在这台机器上需要做的所有事情,尽管安装新卷并不会造成任何伤害,就像测试一样。但是,此步骤几乎可以肯定是可选的,因为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

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

希望这可以帮助。


谢谢,这有所帮助!对于大容量(如1TB),在微型实例上,此过程将花费很长时间。我已经看到了无fsck,基于rsync的卷复制(例如,在这里ubuntuforums.org/showpost.php?p=9866025&postcount=27),但是基于dd的方法感觉可靠得多,即使对于非根卷也是如此。
chronos

sudo e2fsck -f /dev/sdf进行大小调整之前,第一个命令可能是必需的步骤(在我的特定实例上是Amazon Linux AMI)。
notacouch 2014年

1
应该很明显,但是不要忘记按照AWS文档,在卷(/ facepalm)上创建文件系统sudo mkfs -t ext4 /dev/sdg
notacouch 2014年

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/Euca2ools使用


0

我想减小普通EC2实例正在使用的卷的大小。我按照与此处其他答案类似的步骤进行操作,但是遇到了问题。因此,这是缩小根目录卷所需要做的工作...

在AWS控制台中

 1. Stop the source EC2 instance
 2. Create a snapshot of the volume you want to shrink
 3. Use the snapshot to create a new 'source' volume
 4. Created a new volume with smaller size (made sure it was big enough for the data on source)
 5. Attached both volumes to any EC2 instance (mine were /dev/sdf = source & /dev/sdg = target)
 6. Start the EC2 instance

在EC2实例上

 7. sudo su -   (everything from here is run as root)
 8. mkdir /source /target
 9. mount -t ext4 /dev/sdf /source
 10. mkfs.ext4 /dev/sdg
 11. mount -t ext4 /dev/sdg /target
 12. rsync -aHAXxSP /source/ /target 
     ** notice that there is no trailing '/' after target if 
       you put one there your data will be copied to 
       /target/source and you will have to move it up a directory
 13. cat /boot/grub/grub.conf  (indicated that grub is using root=LABEL=/)
 14. cat /source/etc/fstab (indicated that fstab was also using LABEL=/)
 15. e2label /dev/sdg /
 16. umount /source
 17. umount /target

返回AWS控制台

 18. Stop the instance
 19. Detach ALL volumes from the instance
 20. Attach the 'target' volume to the instance using /dev/sda1 as the device
 21. Start the instance

在这里,我们遇到的问题据我所知尚未提及。 实例开始很好,太好了!但是,当我尝试SSH到实例时,无法连接。经过上述步骤的许多变化之后,我最终决定尝试使用刚启动的EC2实例中的根卷。

在AWS控制台中

 1. Create a new EC2 instance with the right sized root volume
 2. Stop the new instance
 3. Detach the /dev/sda1 volume from the new instance
    ** used the 'source' volume from before & the new volume we just detached
 4. Attached both volumes to the original EC2 instance (/dev/sdf & /dev/sdg)
 5. Start the instance with the attached volumes

在EC2实例上

 1. sudo su - 
 2. mkdir /source /target (only need to do this if you don't already have these directories)
 3. mount -t ext4 /dev/sdf /source
 4. mount -t ext4 /dev/sdg /target (no need to create a file system because it is already there)
 5. rsync -aHAXxSP /source/ /target 
 6. umount /source
 7. umount /target

返回AWS控制台

 1. Stop the instance
 2. Detach the 'source' and 'target' volumes from instance
 3. Attach the 'target' volume to the instance from step 1 using /dev/sda1 as the device
 4. Start the instance
 5. ** we use an elastic IP so we just reassigned the IP to the new instance

希望这可以帮助某人


卷的大小只能增加,不能减少。从快照。
Ankit Kumar Rajpoot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.