本文为您介绍如何扩容Linux实例云盘(系统盘或数据盘)的分区和文件系统。

操作场景

在ECS控制台上扩容云盘容量后,对应分区和文件系统并未扩容,您还需要进入ECS实例内部继续扩容云盘的分区和文件系统,将扩容部分的容量划分至已有分区或者新增分区,使云盘扩容生效。

本文操作适用于以下云盘扩容场景:

前提条件

操作视频

以下视频指导您如何扩容Linux实例的云盘。

准备工作:确认待扩容云盘及其分区信息

执行扩容分区和文件操作系统前,请先确认待扩容云盘和云盘分区信息,来确定要执行的操作。

  1. 远程连接ECS实例。
    具体操作,请参见 通过密码或密钥认证登录Linux实例
  2. 运行以下命令,确认待扩容云盘及其分区信息。
    fdisk -lu
    确认分区情况如图所示,表示该实例有2块云盘,系统盘 /dev/vda和数据盘 /dev/vdb,我们以数据盘 /dev/vdb为例。其中:
    • ①:云盘的设备名称。
    • ②:云盘是否分区及分区名称。
      • 已分区:有②处的分区信息表示已分区,Device取值为分区名称(示例中为/dev/vdb1),数字1是分区编号,则需扩容分区和文件系统。
      • 未分区(裸设备):没有②处的分区信息表示未分区,为裸设备。则无需扩容分区,直接执行步骤二:扩容文件系统
    • ③:云盘的分区类型。

      Disk label type值为dos表示MBR分区,值为gpt表示GPT分区。

      说明 不同操作系统的显示略有不同。如果没有 Disk label type字段,可通过 System字段判断。 System值为 Linux表示MBR分区,值为 GPT表示GPT分区。
    • ④:该云盘的总扇区大小(图示例125829120)。如果云盘的最后一块分区(示例中为/dev/vdb1)的End值(图示例83886079)和总扇区大小差距过大,表示该分区未利用所有云盘空间,待扩容分区。或者您可以通过lsblk命令查看哪个分区待扩容。

步骤一:扩容分区

本操作以公共镜像Alibaba Cloud Linux 2.1903 LTS 64位操作系统、在ECS实例内部将云盘分区/dev/vdb1由40 GB扩容至60 GB(已在控制台扩大容量为60 GB)为例,请您根据实际环境进行操作。

  1. 可选:根据准备工作确认的信息,如果您的云盘分区类型为MBR且在控制台扩容后容量大于2 TiB,需先转换分区为GPT分区。否则跳过该步骤。
    具体操作,请参见 转换Linux数据盘的分区类型
  2. 运行以下命令,安装工具。
    • Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本运行以下命令。
      1. 安装growpart工具。
        type growpart || yum install -y cloud-utils-growpart
      2. (可选)根据准备工作确认的信息,如果您的云盘分区类型为GPT,还需运行以下命令安装gdisk工具。
        type sgdisk || yum install -y gdisk
      说明 由于CentOS 6和CentOS 8结束生命周期(EOL),如果您使用的是CentOS 6或者CentOS 8系统的ECS实例,请先切换源地址。具体操作,请参见 CentOS 6 EOL如何切换源?CentOS 8 EOL如何切换源?
    • Debian 8及以上版本、Ubuntu14及以上版本运行以下命令。
      1. 更新软件源。
        apt-get update
      2. 安装cloud-guest-utils。
        type growpart || apt-get install -y cloud-guest-utils
      3. (可选)根据准备工作确认的信息,如果您的云盘分区类型为GPT,还需运行以下命令安装gdisk工具。
        type sgdisk || apt-get install -y gdisk
  3. 运行以下命令,扩容分区。
    以云盘分区名称 /dev/vdb1为例,运行如下命令。命令参数中的 /dev/vdb1之间需要空格分隔, 1是分区编号。
    LC_ALL=en_US.UTF-8 growpart /dev/vdb 1
    其中, LC_ALL=en_US.UTF-8是环境变量设置,为了兼容中文操作系统的字符编码。
    重要
    • 如果单盘有多个连续分区的情况,例如数据盘/dev/vdb有三个分区/dev/vdb1/dev/vdb2/dev/vdb3。扩容时,只需要扩容最后一个分区即可,即执行growpart /dev/vdb 3一个命令即可完成数据盘的分区扩容。
    • 使用growpart工具时,如果出现报错信息,请参见常见问题进行排查。
    如下图所示,输出 CHANGED字样时,表示分区扩容成功。 扩容分区
  4. 可选:CentOS 6等较低版本的操作系统,需要执行reboot命令重启实例,使分区扩容生效。
    通常情况下,扩容分区不需要执行重启。但如果您扩容的是 CentOS 6的系统盘或者 发现扩容后操作系统实际识别的分区没有扩展,这是操作系统版本较低的原因,需要重启实例使分区扩容生效。建议您选择业务低谷的时间段进行重启,避免影响业务运行。

步骤二:扩容文件系统

说明 云盘和文件系统正在被使用的状态下,采用resize2fs等工具在线扩容文件系统,有可能会触发文件系统数据问题,该问题与镜像内核版本、resize2fs工具版本相关,与云盘扩容本身无关。建议您为云盘创建快照,做好数据备份。具体操作,请参见 创建一个云盘快照
  1. 运行以下命令,查看文件系统类型。
    df -Th

    Type值为文件系统类型,Mounted on值为分区的挂载目录。如下图,表示/dev/vdb1分区的文件系统类型为ext4,挂载目录为/mnt

    文件系统类型

    如果Filesystem取值后缀不带数字(例如/dev/vdc),则为裸设备。

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

    扩容命令因文件系统类型而异,请您根据上一步中查询到的文件系统类型选择以下命令。

    • ext*(例如ext2、ext3、ext4)文件系统
      • 以扩容云盘分区/dev/vdb1ext*文件系统为例,则运行如下命令:
        resize2fs /dev/vdb1
      • 以扩容裸设备/dev/vdcext*文件系统为例,则运行如下命令:
        resize2fs /dev/vdc
    • xfs文件系统
      以扩容挂载目录为 /mntxfs文件系统为例,则运行如下命令:
      type xfs_growfs || yum install -y xfsprogs
      xfs_growfs /mnt
    • btrfs文件系统
      以扩容挂载目录为 /mntbtrfs文件系统为例,则运行如下命令:
      btrfs filesystem resize max /mnt
  3. 运行以下命令,确认是否扩容成功。
    df -Th

    当查询结果中的文件系统容量和控制台容量一致时,表示扩容成功。

    如下图所示,分区 /dev/vdb1文件系统容量和控制台扩容容量(60 GB)基本一致,表示扩容完成。 扩容效果
    扩容完成后,您需要根据实际情况检查云盘数据是否正常。
    • 如果扩容成功,ECS实例中的业务程序能够正常运行,则完成操作。
    • 如果扩容失败,您可以通过备份的快照回滚数据。具体操作,请参见使用快照回滚云盘

常见问题

说明 如果您遇到难以解决的问题,您可以加入云盘扩容问题客户钉钉群(钉钉群号:25920014655)与我们的工程师即时沟通。

growpart相关问题

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

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

    解决方案
    1. 运行locale命令查看ECS实例的字符编码类型,将非en_US.UTF-8的字符编码类型切换成en_US.UTF-8
      1. 运行以下命令,切换字符编码类型。
        export LANG=en_US.UTF-8
      2. 如果问题仍未解决,运行以下命令,切换字符编码类型。
        export LC_ALL=en_US.UTF-8
    2. 如果问题仍未解决,请您尝试运行reboot命令重启ECS实例。
    重要 当您通过切换字符编码,成功完成扩容分区后,建议您按需切回原有字符编码。
  2. 运行扩容分区growpart命令时,提示unexpected output in sfdisk --version [sfdisk (util-linux-ng 2.17.2)]

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

    解决方案:尝试将growpart版本降低到0.27。

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

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

    解决方案:直接扩容文件系统

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

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

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

  5. 为什么在CentOS 6中安装growpart工具时提示Error: Cannot retrieve repository metadata

    原因:CentOS 6操作系统版本已结束生命周期(EOL),继续使用默认源会导致无法安装包。

    解决方案
    1. 在CentOS 6中切换yum源。具体操作,请参见CentOS 6 EOL如何切换源?
      说明 CentOS 6操作系统版本已结束生命周期(EOL),如果您需要使用yum安装软件包,需要先切换yum源。
    2. 重新运行以下命令,安装growpart工具。
      type growpart || yum install -y cloud-utils-growpart
    3. 如果问题仍未解决,请参考扩展分区和文件系统_Linux数据盘扩容分区。

resize2fs相关问题

  1. 问题:运行扩容文件系统resize2fs命令时,提示如下信息。
    resize2fs: Device or resource busy while trying to open /dev/vda
    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!

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

    解决方案:如果您发现扩容后操作系统实际识别的分区没有扩展,可能是操作系统版本较低的原因,请尝试执行reboot命令重启实例,使分区扩容生效。