简单缩减 AWS EC2 实例附加的 EBS 卷的容量

缩减 AWS EC2 实例附加的 EBS 卷的容量的方法有很多,大多比较繁琐,本文使用一些技巧,来大大简化这个流程。

第一步:启动一个新实例

启动一个新的 EC2 实例。

  • 这个实例与需要被缩减 EBS 卷容量的实例尽可能相同,其中,操作系统和实例类型必须相同,所在的 AWS 区域及子网也必须相同。
  • 可以不为其添加密钥对。
  • 其 EBS 卷容量为需要缩减到的容量。
  • 添加储存时取消勾选「终止时删除」。

待实例启动后,终止(非停止)实例。

第二步:附加新的 EBS 卷

上一步终止新的实例后,其 EBS 卷被保留且已从实例分离,并拥有所有我们需要的分区,因此,我们不需要再进行任何分区操作啦。

转到 EBS 管理页面,将新的 EBS 卷连接到需要被缩减 EBS 卷容量的 EC2 实例。

第三步:迁移数据

列出所有可用块设备的信息,发现新的 EBS 卷是 nvme1n1,其中 nvme1n1p1 就是我们迁移的目标分区,而 nvme1n1p14nvme1n1p15 是引导所需要的分区,我们不用理会它们:

1
2
3
4
5
6
7
8
9
10
root@ip-***:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 30G 0 disk
├─nvme0n1p1 259:1 0 29.9G 0 part /
├─nvme0n1p14 259:2 0 3M 0 part
└─nvme0n1p15 259:3 0 124M 0 part /boot/efi
nvme1n1 259:4 0 20G 0 disk
├─nvme1n1p1 259:5 0 19.9G 0 part
├─nvme1n1p14 259:6 0 3M 0 part
└─nvme1n1p15 259:7 0 124M 0 part

挂载并清除新分区内所有数据:

1
2
3
mkdir -p /mnt/newebs
mount /dev/nvme1n1p1 /mnt/newebs
rm -rf /mnt/newebs/* # 也可以格式化新分区

迁移根目录(选做:深入理解各参数的含义)

1
rsync -aAHXxvP / /mnt/newebs/  # 如果没有 rsync,请安装

第四步:修复引导(大部分情况不需要)

列出卷的 UUID:

1
2
3
4
5
6
7
8
9
root@ip-***:~# blkid
/dev/nvme0n1: PTUUID="********-****-****-****-************" PTTYPE="gpt"
/dev/nvme0n1p1: UUID="********-****-****-****-************" TYPE="ext4" PARTUUID="********-****-****-****-************"
/dev/nvme0n1p14: PARTUUID="********-****-****-****-************"
/dev/nvme0n1p15: SEC_TYPE="msdos" UUID="****-****" TYPE="vfat" PARTUUID="********-****-****-****-************"
/dev/nvme1n1: PTUUID="********-****-****-****-************" PTTYPE="gpt"
/dev/nvme1n1p1: UUID="********-****-****-****-************" TYPE="ext4" PARTUUID="********-****-****-****-************"
/dev/nvme1n1p14: PARTUUID="********-****-****-****-************"
/dev/nvme1n1p15: SEC_TYPE="msdos" UUID="****-****" TYPE="vfat" PARTUUID="********-****-****-****-************"
  • 由于我们创建了一个和需要被缩减 EBS 卷容量的实例配置相同的实例,并取得了它的 EBS 卷,在大部分情况下,新卷和旧卷各分区的 UUID 应该是相同的,因此不需要修复引导。
  • 如果不是这样,请修复引导,替换引导配置中的 UUID 即可,此处不赘述。

第五步:替换根设备

  1. 取消挂载新 EBS 卷:
    1
    umount /mnt/newebs
  2. 转到实例管理页面,停止(非终止)需要被缩减 EBS 卷容量的实例。
  3. 在实例信息中的储存分页,复制根设备名称,一般为 /dev/xvda
  4. 转到 EBS 管理页面,断开新旧两个 EBS 卷的连接。
  5. 重新连接新 EBS 卷到该实例,设备处填入先前复制的根设备名称。
  6. 重新启动该实例。
  7. 验证实例工作正常后,为旧 EBS 卷创建一个快照作为备份,就可以删除它了。
  8. 某些情况下,停止并重新启动实例可能导致 IP 地址变更,如果你有一个指向该实例的域名,记得修改 DNS 记录。

Done!

是不是很简单w