步骤二:扩容分区和文件系统

扩容云盘容量后,对应分区和文件系统并未扩容,您还需要继续扩容云盘的分区和文件系统,将扩容的容量划分至已有分区及文件系统内,使系统能够正常使用扩容容量。本文为您介绍如何扩容RDS Custom实例云盘的分区和文件系统。

前提条件

  • RDS Custom实例满足以下条件:

    • 状态为运行中(Running)。

    • 操作系统是Alibaba Cloud Linux 2/3、CentOS 7及以上、Debian 11及以上或者Ubuntu14及以上版本。

  • 云盘满足以下条件:

    • 状态为使用中(In_use)。

    • 系统盘使用率未达到100%。

      重要

      为确保扩容操作顺利进行,请登录实例并执行df -h命令,以确认根分区的使用率未达到100%。

  • 扩容云盘容量但未扩容分区及文件系统。

注意事项

强烈建议扩容前创建云盘快照,做好数据备份。

说明

扩容分区和文件系统正常情况下不会丢失数据。为避免误操作导致数据丢失或异常,建议您创建快照备份云盘数据。

操作步骤

步骤1:查看待扩容云盘的信息并确认扩容步骤

  1. 连接RDS Custom实例

  2. 执行以下命令,确认待扩容云盘名称及分区信息。

    sudo fdisk -lu

    image

    1. 确定云盘是否分区。如图所示,该实例有3块云盘,系统盘/dev/nvme0n1、数据盘/dev/nvme1n1和数据盘/dev/nvme2n1。以数据盘为例,其中:

      • 数据盘/dev/nvme1n1已分区,存在/dev/nvme1n1p1的分区。

      • 数据盘/dev/nvme2n1未分区(裸设备)

    2. 确定待扩容云盘的分区类型。Disklabel type表示云盘的分区类型,值为gpt表示GPT分区,值为dos表示MBR分区。本文示例中云盘分区为GPT类型。

  3. 执行以下命令,获取待扩容云盘的文件系统信息。

    • 未分区的云盘

      sudo file -s /dev/裸设备名称
    • 已分区的云盘

      sudo file -s /dev/分区名称

    /dev/nvme1n1p1分区为例,执行以下命令。

    sudo file -s /dev/nvme1n1p1
    • 返回结果如下,表明分区/dev/nvme1n1p1文件系统类型为ext4;

      /dev/nvme1n1p1: Linux rev 1.0 ext4 filesystem data, UUID=342527ce-**** (needs journal recovery) (extents) (64bit) (large files) (huge files)
    • 如果返回结果为/dev/nvme1n1p1: data,则表示该分区未安装文件系统。

  4. 确认需要执行的扩容步骤。

步骤2:扩容分区

如果云盘未分区但存在文件系统,则无需执行扩容分区操作,直接执行步骤3:扩容文件系统即可。

  1. 执行以下命令扩容分区,以下以/dev/nvme1n1p1分区为例,其中/dev/nvme1n1是云盘名称,p1中的1是分区编号,两者之间需要空格分隔。请根据实际情况替换命令中的分区。

    Alibaba Cloud Linux 2/3版本、CentOS 7及以上版本

    • GPT分区(需安装gdisk工具)

      type growpart || sudo yum install -y cloud-utils-growpart
      sudo yum update cloud-utils-growpart
      type sgdisk || sudo yum install -y gdisk
      sudo LC_ALL=en_US.UTF-8 growpart /dev/nvme1n1 1 
    • MBR分区

      type growpart || sudo yum install -y cloud-utils-growpart
      sudo yum update cloud-utils-growpart
      sudo LC_ALL=en_US.UTF-8 growpart /dev/nvme1n1 1

    Debian 11及以上版本、Ubuntu14及以上版本

    • GPT分区(需安装gdisk工具)

      sudo apt-get update
      sudo apt-get install -y cloud-guest-utils
      type sgdisk || sudo apt-get install -y gdisk
      sudo LC_ALL=en_US.UTF-8 growpart /dev/nvme1n1 1
    • MBR分区

      sudo apt-get update
      sudo apt-get install -y cloud-guest-utils
      sudo LC_ALL=en_US.UTF-8 growpart /dev/nvme1n1 1
    重要
    • 对于NVMe类型云盘,以分区名称/dev/nvme1n1p1为例,其中/dev/nvme1n1是云盘名称,p1中的1是分区编号,两者之间需要空格分隔。扩容时执行命令为growpart /dev/nvme1n1 1

    • 对于虚拟云盘,以分区名称/dev/vdb1为例,其中/dev/vdb为云盘名称,1是分区编号,两者之间需要空格分隔。扩容命令为growpart /dev/vdb 1

    • LC_ALL=en_US.UTF-8是环境变量设置,为了兼容中文操作系统的字符编码。

    • 如果单盘有多个连续分区的情况,仅能扩容最后一个分区。例如当数据盘/dev/nvme3n1有三个分区/dev/nvme3n1p1/dev/nvme3n1p2/dev/nvme3n1p3。扩容时,只能扩容最后一个分区/dev/nvme3n1p3,即执行growpart /dev/nvme3n1 3命令即可完成数据盘的分区扩容。

    • 如果您需要扩容的云盘分区是MBR分区表下的扩展分区(通常判断方式是分区号大于等于5),您需要先对扩展分区扩容后再对逻辑分区进行扩容。例如您有/dev/nvme1n1p1(主分区)、/dev/nvme1n1p2(扩展分区)、/dev/nvme1n1p5(逻辑分区)三个分区,此时您需要依次执行growpart /dev/nvme1n1 2growpart /dev/nvme1n1 5完成分区的扩容。

    当返回如下CHANGED字样时,表示分区扩容成功。

    CHANGED: partition=1 start=2048 old: size=41938944 end=41940991 new: size=52426719 end=52428766
  2. 执行以下命令查看分区扩容是否生效。

    sudo fdisk -lu

    以扩容/dev/nvme1n1p1分区为例,云盘/dev/nvme1n1与分区/dev/nvme1n1p1容量一致,分区扩容已生效。

    image

步骤3:扩容文件系统

  1. 执行以下命令,获取待扩容设备的挂载目录。

    df -Th

    image

    Type值为文件系统类型,Mounted on值为分区的挂载目录。例如:

    • /dev/nvme2n1云盘的文件系统类型为ext4,挂载目录为/tmp。

    • /dev/nvme1n1p1分区的文件系统类型为ext4,挂载目录为/mnt。

    说明

    如果Filesystem取值为云盘名称(例如nvme2n1),则目标云盘未进行分区,为裸设备。如果为分区名称(例如/dev/nvme1n1p1),则目标云盘已进行分区。

  2. 执行以下命令,扩容文件系统。

    ext*(例如ext2、ext3、ext4)文件系统

    • 未分区的云盘,例如云盘/dev/nvme2n1

      sudo resize2fs /dev/nvme2n1
    • 已分区的云盘,例如云盘分区/dev/nvme1n1p1。

      sudo resize2fs /dev/nvme1n1p1

    xfs文件系统

    以扩容挂载目录为/mntxfs文件系统为例,请根据实际情况替换命令中的挂载目录。

    • Alibaba Cloud Linux 2/3版本、CentOS 7及以上版本

      type xfs_growfs || sudo yum install -y xfsprogs
      sudo xfs_growfs /mnt
    • Debian 11及以上版本、Ubuntu14及以上版本

      type xfs_growfs || sudo apt-get install -y xfsprogs
      sudo xfs_growfs /mnt

    btrfs文件系统

    以扩容挂载目录为/mntbtrfs文件系统为例,请根据实际情况替换命令中的挂载目录。

    sudo btrfs filesystem resize max /mnt
  3. 执行df -Th命令,确认是否扩容成功。

    例如,分区/dev/nvme1n1p1所在云盘扩容后容量为25 GiB,文件系统扩容完成后容量也为25 GiB。

    说明

    由于文件系统本身会占用一定的存储空间,因此在文件系统扩容完成后,其可用容量可能会略小于云盘扩容后的总容量。

常见问题

growpart相关问题

  • 问题1:运行扩容分区growpart命令时,提示unexpected output in sfdisk --version [sfdisk,来自 util-linux 2.23.2]

    原因:中文版操作系统使用了非en_US.UTF-8的字符编码类型。

    解决方案

    • 运行locale命令查看RDS Custom实例的字符编码类型,将非en_US.UTF-8的字符编码类型切换成en_US.UTF-8

      • 运行以下命令,切换字符编码类型。

        export LANG=en_US.UTF-8
      • 如果问题仍未解决,运行以下命令,切换字符编码类型。

        export LC_ALL=en_US.UTF-8
    • 如果问题仍未解决,请您尝试重启RDS Custom实例。

    重要

    当您通过切换字符编码,成功完成扩容分区后,建议您按需切回原有字符编码。

  • 问题2:运行扩容分区growpart命令时,提示unexpected output in sfdisk --version [sfdisk (util-linux-ng 2.17.2)]

    原因:您的fdisk版本与growpart版本不兼容。

    解决方案:尝试将growpart版本降低到0.27。如果问题仍未解决,请参考扩展分区和文件系统_Linux数据盘扩容分区。

  • 问题3:运行扩容分区growpart命令时,提示FAILED: unable to determine partition type

    原因:您的云盘是裸设备,未分区。裸设备无需执行扩容分区操作,直接扩容文件系统即可。

    解决方案:直接执行步骤3:扩容文件系统

  • 问题4:运行扩容分区growpart命令时,提示WARNING: MBR/dos partitioned disk is larger than 2TB. Additional space will go unused.

    原因:MBR分区类型不支持2 TiB以上的云盘。

    解决方案:先将分区类型从MBR转换为GPT,然后再扩容分区。具体操作,请参见转换MBR分区为GPT分区

  • 问题5:运行扩容分区growpart命令时,提示mkdir: cannot create directory ... No space left on device

    原因:磁盘空间不足,导致growpart命令创建临时目录时失败。

    解决方案扩容云盘容量

  • 问题7:设备名以/dev/mapper开头的分区未扩容成功。

    原因:设备名以/dev/mapper开头,通常是通过LVM管理磁盘分区。

    解决方案:需要先通过LVM扩容逻辑卷,然后再扩容文件系统。具体操作,请参见通过LVM扩容逻辑卷

  • 问题8:运行扩容分区growpart命令时,提示NOCHANGE: partition 1 could only be grown by 2015 [fudge=2048]

    原因:扩容分区时没有更多可用空间。通常是因为在控制台离线扩容云盘后,未通过控制台或OpenAPI重启实例,导致云盘本身没有得到扩容。

    解决方案:离线扩容后,必须通过重启实例才能使云盘扩容生效。具体操作,请参见重启实例

resize2fs相关问题

  • 问题1:运行扩容文件系统resize2fs命令时,提示Couldn't find valid filesystem superblock. open: Is a directory while opening /mnt

    原因:扩容文件系统时,resize2fs指定的是云盘分区名称,不是云盘设备名称或者分区的挂载目录。

    解决方案:扩容文件系统时,请您指定正确的分区名称。

  • 问题2:运行扩容文件系统resize2fs命令时,提示The filesystem is already ... blocks long. Nothing to do!

    原因:文件系统没有可扩容的空间,可能是分区未扩容或者扩容未生效导致。

    解决方案

    • 请先确认是否成功执行growpart扩容分区的步骤,如果遗漏请您先执行growpart命令扩容分区。

    • 如果您成功执行了growpart命令扩容分区,并输出CHANGED字样后,在执行resize2fs命令时仍有上述报错。这可能是因为操作系统版本较低,无法在线更新系统分区表。请尝试执行reboot命令重启实例后,再执行resize2fs命令。

  • 问题3:运行扩容文件系统resize2fs命令时,提示resize2fs: Permission denied to resize filesystem

    原因:可能是文件系统不一致,导致文件系统扩容失败。

    解决方案

    • 运行dmesg -T | grep fs命令,如果输出There are errors in the filesystem类似信息,说明文件系统不一致。

    • 为云盘做好数据备份。具体操作,请参见创建快照

    • 尝试使用e2fsck命令进行修复。e2fsck命令的使用方法请参考其手册。

相关文档

RDS Custom简介