扩容分区和文件系统(Linux)

在ECS控制台上扩容云盘容量后,对应分区和文件系统并未扩容,您还需要继续扩容云盘的分区和文件系统,将扩容部分的容量划分至已有分区及文件系统内,使系统下可以正常使用扩容容量。本文为您介绍如何扩容Linux实例云盘的分区和文件系统。

前提条件

  • 请确保实例满足以下条件:

  • 请确保云盘满足以下条件:

    • 状态为使用中(In_use)。

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

      重要

      为确保扩容操作顺利进行,请登录实例并执行df -h命令,以确认根分区的使用率未达到100%。如根分区的使用率已达到100%,请参见解决Linux实例磁盘空间满问题以获取相应的解决方案。

  • 已在ECS控制台扩容云盘容量。具体操作,请参见步骤一:扩容云盘容量

    说明

    如果您在扩容云盘容量时选择离线扩容,扩容后需要通过ECS控制台或API接口重启实例(在实例内部执行reboot命令重启无效)才能生效。具体操作,请参见重启实例

准备工作

  • (强烈建议)已创建云盘快照,做好数据备份。具体操作,请参见创建快照

    说明

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

  • 已清楚云盘扩容整体流程。具体信息请参见云盘扩容指引

通过一键扩容工具扩容分区及文件系统

若您不慎关闭步骤一:扩容云盘容量中的通过云助手扩容分区及文件系统界面,您也可以进入块存储EBS控制台,使用一键扩容工具扩容分区和文件系统。该工具可以利用助手自动生成扩容命令,并支持一键执行扩容命令,帮助您实现操作系统内的分区和文件系统扩容。

  1. 访问EBS控制台工具集下的扩容分区和文件系统工具

  2. 选择待操作的云盘,然后单击提交

  3. 工具将检测操作系统分区状态。如果显示操作系统未扩容分区字样,且解决方案中包含自动生成的命令,则可以按照如下操作进行一键扩容。

    说明

    如果未显示扩容命令,则说明工具暂不支持该种情况,您仍需要参考文档手动执行扩容。

    1. 解决方案区域的云助手工具页签中,确认自动生成的扩容命令,然后单击执行上述远程命令

      image.png

    2. 在弹出的发送命令对话框单击执行,系统将自动执行扩容命令。

    3. 看到命令执行成功提示后,单击取消关闭对话框。

      即可看到该云盘的分区和文件系统扩容成功。

      image.png

登录实例,自行扩容分区和文件系统

若您的环境无法通过云助手或一键扩容工具扩容分区及文件系统,您可选择登录实例,使用命令行实现扩容操作。

步骤1:记录待扩容云盘信息。

  1. 获取云盘信息。

    方式一:通过命令行获取

    1. 远程连接ECS实例。

      登录ECS管理控制台,点击左侧导航栏实例,选择目标实例,点击远程连接,登录实例。具体操作,请参见使用Workbench工具以SSH协议登录Linux实例

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

      sudo fdisk -lu

      截屏2024-11-20 12

      1. 确定云盘是否分区。 如上图所示,表示该实例有3块云盘,系统盘/dev/vda、数据盘/dev/vdb和数据/dev/vdc盘,我们以数据盘为例。其中:

        • vdb1表示数据盘/dev/vdb已分区,数字1是分区编号。

        • vdc表示数据盘/dev/vdc未分区(裸设备)

      2. 确定待扩容分区云盘。 我们以数据盘/dev/vdb为例。其中:

        SIZE表示容量大小,从图中可知/dev/vdb1分区的容量小于云盘/dev/vdb的容量,即/dev/vdb1分区需要扩容。

        说明

        您也可以通过运行lsblk命令查看哪个分区待扩容。

      3. 确定待扩容云盘的分区类型。 Disklabel type表示云盘的分区类型,值为dos表示MBR分区,值为gpt表示GPT分区。 我们以存在分区的数据盘/dev/vdb为例。示例中的数据盘的云盘名称为/dev/vdb,分区名称为/dev/vdb1,分区类型为MBR分区。

        说明
        • 不同操作系统的显示略有不同。如果没有Disk label type字段,可通过System字段判断。System值为Linux表示MBR分区,值为GPT表示GPT分区。

        • 较低版本的fdisk可能不能正常显示GPT分区表。您可以通过gdisk -l /dev/vdb命令查看分区类型。

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

      sudo file -s 裸设备名称/分区名称

      截屏2024-12-02 10

      以上示例表示:

      分区/dev/vdb1文件系统类型为ext4;

      未分区(裸设备)/dev/vdc的文件系统类型为ext4;

      未分区(裸设备)/dev/vdd无文件系统。

      说明

      您也可以使用sudo blkid指令,获取待扩容云盘的文件系统信息。

    方式二:通过控制台获取

    重要

    使用该方式时注意:

    • 该方式仅支持部分用户使用,支持情况以实际界面为准。

    • 该云盘所在的ECS实例已安装云助手Agent。具体操作,请参见安装云助手Agent

    1. 在实例详情页面的块存储页签下,找到待扩容的目标云盘。

    2. 鼠标悬浮至①处,再分别单击②处和③处的image图标,查看待扩容云盘的设备名、分区类型、分区名称、文件系统类型和挂载点。 image

  2. 判断需要执行的扩容步骤。

    说明

    具体的扩容示例,请参见扩容示例

步骤2:扩容分区。

  1. 请依照判断需要执行的扩容步骤,确认云盘是否需要执行扩容分区操作。

  2. 执行扩容分区指令。

    本操作以在ECS实例内部将云盘分区/dev/vdb1由40 GiB扩容至60 GiB(已在控制台扩大容量为60 GiB)为例,请您根据实际环境进行操作。

    根据不同的操作系统和分区类型,选择命令,扩容指定分区。

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

    重要
    • 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/vdb 1
    • 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/vdb 1 

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

    重要

    由于Debain9和Debain10结束生命周期(EOL),所以如果您使用的是Debain9和Debain10系统的ECS实例,请先切换源地址。具体操作,请参见Debian 9/10 EOL如何切换源?

    • MBR分区

      sudo apt-get update
      sudo apt-get install -y cloud-guest-utils
      sudo LC_ALL=en_US.UTF-8 growpart /dev/vdb 1
    • 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/vdb 1
    重要

    执行扩容分区命令时,您需要特别注意以下几种情况:

    • 使用growpart工具时,如果出现报错信息,请参照常见问题进行排查。

    • 命令参数中的/dev/vdb1之间需要空格分隔,1是分区编号。这两个参数需要您根据实际情况进行设定。

    • 如果您扩容的是系统盘,命令中的/dev/vdb需要替换为/dev/vda

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

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

    • 如果您是NVMe类型云盘,以分区名称/dev/nvme0n1p1为例,其中/dev/nvme0n1是设备名称。扩容时执行命令为growpart /dev/nvme0n1 1,而不是growpart /dev/nvme0n1p1 1

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

    如下图所示,输出CHANGED字样时,表示分区扩容成功。

    image.png

  3. 执行以下命令查看分区扩容是否生效。

    sudo fdisk -lu

    截屏2024-11-20 14

    如上图示例,/dev/vdb与/dev/vdb1容量一致,分区扩容已生效。

    说明

    CentOS 6等较低版本的操作系统,需要执行reboot命令重启实例,使分区扩容生效。

    通常情况下,扩容分区不需要执行重启。但如果您扩容的是CentOS 6操作系统的云盘或者发现扩容后操作系统实际识别的分区没有扩展,这是操作系统版本较低的原因,需要重启实例使分区扩容生效。建议您选择业务低谷的时间段进行重启,避免影响业务运行。

步骤3:扩容文件系统。

说明
  • 如果您使用LVM管理磁盘分区,在完成扩容云盘容量和分区后,需要先通过LVM完成逻辑卷扩容,再进行文件系统扩容。具体操作,请参见扩容逻辑卷

    如何确认使用了LVM逻辑卷

    进入实例内部,执行以下命令

    sudo lsblk

    示例回执:

    NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    vda            253:0    0   50G  0 disk 
    ├─vda1         253:1    0    2M  0 part 
    ├─vda2         253:2    0  200M  0 part /boot/efi
    └─vda3         253:3    0 49.8G  0 part /
    vdb            253:16   0   40G  0 disk 
    └─vdb1         253:17   0   40G  0 part 
      └─vg_01-lv01 252:0    0   40G  0 lvm

    若回执出现TYPE类型为lvm分区,则表示当前使用了lvm逻辑卷,如示例回执,表示/dev/vdb1已被用作逻辑卷,因此需要先扩容物理卷及逻辑卷后,再执行文件系统扩容。

  • 如果您的云盘当前开启了多重挂载且使用了集群文件系统,在扩容云盘容量后,您需要自行操作集群文件系统的扩容,当前内容并不适用。常用的集群文件系统包括OCFS2、GFS2、Veritas CFS、Oracle ACFS和DBFS等。请注意,Ext2、Ext3、Ext4、XFS、NTFS等单机文件系统,在多重挂载情况下无法保证多实例间数据同步,会导致数据不一致等问题。更多信息,请参见云盘多重挂载功能

  1. 请依照判断需要执行的扩容步骤,确认云盘是否需要执行扩容文件系统操作。

  2. 运行以下命令,获取需要扩容的文件系统的类型和挂载目录。

    df -Th

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

    image.png

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

  3. 扩容文件系统。

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

    说明

    云盘和文件系统在使用的状态下,采用resize2fs等工具在线扩容文件系统,有可能会触发文件系统数据问题,该问题与镜像内核版本、resize2fs工具版本相关,与云盘扩容本身无关。建议您为云盘创建快照,做好数据备份。具体操作,请参见创建快照

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

    • 以扩容云盘分区/dev/vdb1ext*文件系统为例,则运行如下命令:

      sudo resize2fs /dev/vdb1
      说明

      如果您扩容的是系统盘,命令中的/dev/vdb1需要替换为/dev/vda1

    • 以扩容裸设备/dev/vdcext*文件系统为例,则运行如下命令:

      sudo resize2fs /dev/vdc

    xfs文件系统

    以扩容挂载目录为/mntxfs文件系统为例,则运行如下命令:

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

    type xfs_growfs || sudo yum install -y xfsprogs
    sudo xfs_growfs /mnt

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

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

    btrfs文件系统

    以扩容挂载目录为/mntbtrfs文件系统为例,则运行如下命令:

    sudo btrfs filesystem resize max /mnt
  4. 运行以下命令,确认是否扩容成功。

    df -Th

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

    如下图所示,分区/dev/vdb1文件系统容量(59 GiB)和云盘容量(60 GiB)基本一致(因为文件系统本身会占用部分存储空间),表示扩容完成。image.png

    扩容完成后,您需要根据实际情况检查云盘数据是否正常。

    • 如果扩容成功,ECS实例中的业务程序能够正常运行,则完成操作。

    • 如果扩容失败,您可以通过备份的快照回滚数据。具体操作,请参见使用快照回滚云盘

扩容示例

本节以MBR分区、GPT分区、裸数据盘为例展示扩容分区和文件系统的操作命令,供您参考。在实际扩容过程中,请您以实际环境为准。

示例1:扩容MBR分区和ext4文件系统

  • 设备名:/dev/vda(系统盘)

  • 1个分区:/dev/vda1

  • 文件系统类型:ext4

  • 操作系统:Alibaba Cloud Linux 3

扩容分区和文件系统命令如下:

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

示例2:扩容GPT分区和xfs文件系统

  • 设备名:/dev/vdb(数据盘)

  • 2个分区:/dev/vdb1 、/dev/vdb2

  • 文件系统类型:xfs

  • /dev/vdb2的挂载目录:/mnt

  • 操作系统:Debian 12

扩容分区和文件系统命令如下:

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/vdb 2
type xfs_growfs || sudo apt-get install -y xfsprogs
sudo xfs_growfs /mnt

示例3:扩容存在文件系统的裸数据盘

  • 设备名:/dev/vdc(裸数据盘未分区)

  • 文件系统类型:ext4

  • 操作系统:CentOS 7

扩容文件系统命令如下:

sudo resize2fs /dev/vdc

常见问题

growpart相关问题

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

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

    解决方案

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

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

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

        export LC_ALL=en_US.UTF-8
    • 如果问题仍未解决,请您尝试运行reboot命令重启ECS实例。

    重要

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

  • 问题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命令创建临时目录时失败。

    解决方案:清理无用的文件释放空间,然后再进行扩容。具体操作,请参见解决Linux实例磁盘空间满问题

  • 问题6:在CentOS 6中安装growpart工具时提示Error: Cannot retrieve repository metadata

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

    解决方案

    • 在CentOS 6中切换yum源。具体操作,请参见CentOS 6 EOL如何切换源?

      说明

      CentOS 6操作系统版本已结束生命周期(EOL),如果您需要使用yum安装软件包,需要先切换yum源。

    • 重新运行以下命令,安装growpart工具。

      type growpart || sudo yum install -y cloud-utils-growpart
    • 如果问题仍未解决,请参考扩展分区和文件系统_Linux数据盘扩容分区。

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

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

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

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

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

    解决方案:离线扩容后,必须通过ECS控制台或者OpenAPI重启实例才能使云盘扩容生效,在ECS实例内部重启(执行reboot命令)无效。具体操作,请参见重启实例或者RebootInstance

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类似信息,说明文件系统不一致。

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

    • 在业务允许的情况下,运行umount命令,根据实际环境卸载已挂载的分区或者整块盘。

      说明

      如果是系统盘(无法umount),则要使用卸载系统盘再挂载到其他实例上的方式,进行修复。具体操作,请参见卸载或挂载系统盘

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