如何减少AWS EBS根卷大小?


16

扩大EC2实例就像呼吸一样容易(例如,创建AMI,从中启动实例,然后更改存储大小)。

但是减少它变得更加困难。我想减小Amazon Web Services(AWS)EC2实例弹性块存储(EBS)根卷的大小。网上有几个旧的高级过程。我发现的更详细的版本是关于StackOverflow问题的一年之久的答案:如何减少ebs卷容量,步骤具有相当高的水平:

创建一个所需大小的新EBS卷(例如/ dev / xvdg)

启动实例,并将两个EBS卷都附加到该实例

检查(原始根卷的)文件系统:(例如)e2fsck -f / dev / xvda1

最大收缩原始根卷:(例如ext2 / 3/4)resize2fs -M -p / dev / xvda1

用dd复制数据:

  • 选择块大小(我喜欢16MB)

  • 计算块数(使用resize2fs输出中的块数):块* 4 /(chunk_size_in_mb * 1024)-为安全起见

  • 复制数据:(例如)dd if = / dev / xvda1 ibs = 16M of = / dev / xvdg obs = 16M count = 80

在新的(较小的)EBS卷上调整文件系统的大小:(例如)resize2fs -p / dev / xvdg

检查(原始根卷的)文件系统:(例如)e2fsck -f / dev / xvdg

分离新的EBS根卷,并将其附加到原始实例

我无法找到详细的分步“操作方法”解决方案。

我的EBS根卷已附加到HVM Ubuntu实例。

任何帮助将非常感激。


这看起来是一个非常不错的分步“操作方法”解决方案。
ceejayoz'3

dd-复制磁盘到磁盘dd如果= / dev / xvdf = / dev / xvdh bs = 4k count = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Answers:


6

在AWS控制台中:

  1. 停止要调整大小的实例

  2. 创建活动卷的快照,然后从该快照创建“通用SSD”卷。

  3. 创建另一个“通用SSD”卷至所需大小。

  4. 通过以下方式将这3个卷附加到实例:

    • / dev / sda1用于活动卷。
    • / dev / xvdf表示目标大小的卷。
    • / dev / xvdg,用于从活动卷的快照制作的卷。
  5. 启动实例。

  6. 通过SSH登录到新实例。

  7. 创建以下新目录:

mkdir /source /target

  1. 在新卷上创建一个ext4文件系统:

mkfs.ext4 /dev/xvdf

  1. 将其安装到此目录:

mount -t ext4 /dev/xvdf /target

  1. 这非常重要,文件系统需要linux的e2label才能识别并引导它,在活动实例上使用“ e2label / dev / xvda1”来查看其内容,在这种情况下,标签为:“ /”

e2label /dev/xvdf /

  1. 挂载从快照创建的卷:

mount -t ext4 /dev/xvdg /source

  1. 复制内容:

rsync -ax /source/ /target

注意:“ / target”后面没有“ /”。另外,关于符号链接和属性可能会出现一些错误,但是调整大小仍然成功

  1. 挂载文件系统:

umount /target
umount /source

  1. 返回AWS控制台:停止实例,并分离所有卷。

  2. 将新大小的卷作为以下内容附加到实例:“ / dev / sda1”

  3. 启动实例,它应该启动。

步骤10重要:如上所述,用“ e2label”标记新卷,否则该实例将似乎在aws中启动,但不会通过连接检查。


9
我已经多次执行了这些步骤(Ubuntu 14.04),并且每次附加新卷时,实例都会停止。还有其他人遇到此问题吗?这真让我大吃一惊!
thiesdiggity 2015年

2
您不是唯一的一个。我已经尝试过此解决方案以及其他解决方案,并且喜欢您的自我,我的实例也将关闭。
blairmeister

1
@blairmeister我遇到了同样的问题,但是设法使它起作用了!如果您仍然遇到问题,请在下面查看我的回答:)
Ruben Serrate

我的e2label是cloudimg-rootfs ...遵循所有这些步骤,我可以在Ubuntu 14.04上确认不起作用
NineCattoRules

1
我对这个答案不满意,因为它没有涵盖足够的用例(例如引导卷)来保护用户免受意外损坏。
Jesse Adelman

6

如果该卷用作根(可引导)设备,则其他解决方案均无效。

新创建的磁盘缺少启动分区,因此在实例将其用作根卷之前,需要先安装GRUB并正确设置一些标志。

我用于缩小根卷的(到目前为止,正在工作)解决方案是:

背景:我们有一个实例A,我们要缩小其根卷。我们将此卷称为VA。我们希望将VA从30GB缩小到10GB

  1. 创建一个新的ec2实例B,其操作系统与实例A相同。作为存储,请选择一个与VA类型相同但大小为10GB的卷。(或您的目标尺寸是多少)。因此,现在我们有了一个实例B,它将这个新卷(我们称为VB)用作根卷。
  2. 新实例(B)运行之后。停止它并分离它的根卷(VB)。

注意:以下步骤主要来自@bill的解决方案:

  1. 停止要调整大小的实例(A)。

  2. 创建卷VA的快照,然后从该快照创建“通用SSD”卷。我们将其称为VASNAP。

  3. 在Amazon Linux上旋转一个新实例,我们将其称为C。我们将使用该实例将VASNAP的内容复制到VB。我们可能还可以使用实例A来执行这些步骤,但是我更喜欢在独立的计算机上执行。

  4. 将以下卷附加到VB的实例C. / dev / xvdf。/ dev / xvdg(用于VASNAP)。

  5. 重新启动实例C。

  6. 通过SSH登录实例C。

  7. 创建以下新目录:

mkdir /source /target

  1. 用ext4文件系统格式化VB的主分区:

mkfs.ext4 /dev/xvdf1

如果没有错误,请继续执行步骤11。否则,如果没有/dev/xvdf1,则需要执行以下i-vii创建分区:

i)如果/dev/xvdf1由于某种原因不存在,则需要创建它。首先输入:

sudo fdisk /dev/xvdf

ii)输入以下内容擦拭磁盘: wipefs

iii)通过输入以下内容创建一个新分区: n

iv)输入p以创建主分区

v)继续按Enter键以继续使用默认设置。

vi)当再次要求输入命令时,请输入w以写入更改并退出。

vii)/dev/xvdf1通过执行以下操作来验证您是否具有分区: lsblk

您应该看到类似以下内容:

NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  250G  0 disk
└─xvda1 202:1    0  250G  0 part
xvdf    202:80   0   80G  0 disk
└─xvdf1 202:81   0   80G  0 part 
xvdg    202:96   0  250G  0 disk
└─xvdg1 202:97   0  250G  0 part

现在继续执行步骤11。

  1. 将其挂载到以下目录:

mount -t ext4 /dev/xvdf1 /target

  1. 这是非常重要的,文件系统需要Linux的e2label才能识别并引导它,在活动实例上使用“ e2label / dev / xvda1”查看其内容,在这种情况下,标签为:“ /”

e2label /dev/xvdf1 /

  1. 在/ source上挂载VASNAP:

mount -t ext4 /dev/xvdg1 /source

  1. 复制内容:

rsync -vaxSHAX /source/ /target

注意:“ / target”后面没有“ /”。另外,关于符号链接和属性可能会出现一些错误,但是调整大小仍然成功

  1. Umount VB:

umount /target

  1. 返回AWS控制台:从实例C断开VB,并从A断开VA。

  2. 将新大小的卷(VB)附加到实例,如下所示:“ / dev / xvda”

  3. 引导实例A,现在它的根设备为10GB :)

  4. 删除实例B和C,以及所有卷,但删除VB,VB现在是实例A的根卷。


您的操作系统是什么?
NineCattoRules

@NineCattoRules Amazon Linux
Ruben

我在Ubuntu 14.04上尝试过,但无法正常工作
NineCattoRules

@NineCattoRules糟糕...我可以确认它适用于Amazon Linux,最近不得不这样做。
鲁宾·塞拉特

1
我们不应该将第17步中的卷附加到/dev/sda1@RubenSerrate中/dev/xvda吗?
alper

2

以下步骤对我有用

步骤1.创建根ebs卷的快照,并从快照创建新卷(我们称此卷为副本)

步骤2.创建具有所需大小的ebs根卷的新实例。(让我们将此卷调整大小)此ebs卷将具有正确的引导分区。(从头开始创建新的ebs卷对我不起作用)

步骤3.将卷调整大小和卷复制附加到实例。

步骤4.格式化卷调整大小。

sudo fdisk -l
    sudo mkfs -t ext4 /dev/xvdf1

注意:确保/dev/xvdf1未输入分区卷/dev/xvdf

步骤5.挂载卷调整大小和卷复制mkdir / mnt / copy mkdir / mnt / resize

sudo mount /dev/xvdh1 /mnt/copy
sudo mount /dev/xvdf1 /mnt/resize

步骤6.复制文件

rsync -ax /mnt/copy/ /mnt/resize

步骤7.确保e2label与根卷相同

sudo E2label /dev/xvdh1 > cloudimg-rootfs
sudo E2label /dev/xvdf1 cloudimg-rootfs

步骤8.更新卷副本上的grub.conf以匹配被引用的新卷

在/boot/grub/grub.cfg中搜索并替换uudid

ubuntu@server:~/mnt$ sudo blkid
/dev/xvdh1: LABEL="cloudimg-rootfs" UUID="1d61c588-f8fc-47c9-bdf5-07ae1a00e9a3" TYPE="ext4"
/dev/xvdf1: LABEL="cloudimg-rootfs" UUID="78786e15-f45d-46f9-8524-ae04402d1116" TYPE="ext4"

步骤9.卸载卷

步骤10.将新调整大小的ebs卷附加到实例/ dev / sda1


1
将@ruben锯齿状答案与grub UUID更新结合起来对我有用。
乔纳森·迈姆

我刚刚浪费了一些时间,请注意:blkid不运行就sudo返回缓存的结果,而不验证它们。因此,看起来UUID尚未更改。
Akhil Nair

0

这是另一种方法。

在运行的EC2实例上附加并挂载旧的EBS卷。如果要复制引导卷,则最好在不同的实例上进行,将旧卷作为数据装入,而不要将该卷用作活动系统。

创建所需大小的新EBS卷。

将新卷附加到实例,并(仔细地)在其上格式化新文件系统(例如,使用mkfs)。安装它。

将旧文件系统内容从旧卷复制到新卷:

rsync -vaxSHAX /oldvol/ /newvol/

卸载新卷并将其与实例分离。

如果要复制根文件系统,则:

创建新卷的EBS快照。

将快照注册为新的AMI。


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.