如何减少 AWS EBS 根卷大小?

her*_*rve 22 ubuntu amazon-ec2 amazon-ebs

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

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

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

启动一个实例,并将两个 EBS 卷附加到它

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

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

用 dd 复制数据:

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

  • 计算块数(使用 resize2fs 输出中的块数): blocks*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 实例。

任何帮助将非常感激。

Rub*_*ate 13

如果将卷用作根(可引导)设备,则其他任何解决方案都不起作用。

新创建的磁盘缺少引导分区,因此需要安装 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. 将以下卷附加到实例 C。 /dev/xvdf for VB。/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
Run Code Online (Sandbox Code Playgroud)

现在继续执行步骤 11。

  1. 挂载到这个目录:

mount -t ext4 /dev/xvdf1 /target

  1. 这很重要,文件系统需要一个 e2label 供 Linux 识别并启动它,在活动实例上使用“e2label /dev/xvda1”来查看它应该是什么,在这种情况下,标签是:“/”

e2label /dev/xvdf1 /

  1. 在 /source 上挂载 VASNAP:

mount -t ext4 /dev/xvdg1 /source

  1. 复制内容:

rsync -vaxSHAX /source/ /target

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

  1. 卸载VB:

umount /target

  1. 返回 AWS 控制台:从实例 C 中分离 VB,并从 A 中分离 VA。

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

  3. 启动实例 A,现在它的根设备是 10GB :)

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

  • 我们不应该将第 17 步的卷附加到 `/dev/sda1` 而不是 `/dev/xvda` @RubenSerrate 吗? (2认同)

小智 7

在 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. 这很重要,文件系统需要一个 e2label 让 linux 识别并启动它,在活动实例上使用“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 中启动,但不会通过连接检查。

  • 我已经多次执行这些步骤(Ubuntu 14.04),每次附加新卷时,实例都会停止。还有其他人遇到这个问题吗?这是在绞尽脑汁! (11认同)
  • 你不是唯一的。我已经尝试过这个和其他解决方案,就像你的好自己一样,我的实例也只是关闭了。 (2认同)
  • @blairmeister 我有同样的问题,但设法让它工作!如果你仍然被卡住,请看下面我的回答:) (2认同)
  • 我不赞成这个答案,因为它没有涵盖足够的卷(例如作为启动卷)的用例来保护用户免受无意损坏。 (2认同)

Eri*_*ond 0

这是另一种方法;

在正在运行的 EC2 实例上附加并安装旧的 EBS 卷。如果您想要复制启动卷,最好在不同的实例上执行此操作,并将旧卷作为数据装载,而不是将该卷用作实时系统。

创建所需大小的新 EBS 卷。

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

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

rsync -vaxSHAX /oldvol/ /newvol/
Run Code Online (Sandbox Code Playgroud)

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

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

创建新卷的 EBS 快照。

将快照注册为新的 AMI。