本文为您介绍如何扩容Linux实例云盘(系统盘或数据盘)的分区和文件系统。
操作场景
在ECS控制台上扩容云盘容量后,对应分区和文件系统并未扩容,您还需要进入ECS实例内部继续扩容云盘的分区和文件系统,将扩容部分的容量划分至已有分区或者新增分区,使云盘扩容生效。
- Linux实例云盘,已分区,将扩容部分的容量划分至已有分区:需扩容分区和文件系统。
说明 如果您希望新增分区而不是扩容已有分区,请参见 扩展分区和文件系统_Linux数据盘。
- Linux实例云盘,未分区(裸设备):无需扩容分区,直接执行步骤二:扩容文件系统。
前提条件
- 确保Linux实例的操作系统是Alibaba Cloud Linux 2/3、CentOS 6及以上、Debian 8及以上或者Ubuntu14及以上版本。
说明 如果为其他操作系统,扩容操作请参见 扩展分区和文件系统_Linux数据盘。
- 已参考步骤一:扩容云盘容量,在ECS控制台扩容云盘容量。
- (强烈建议)已创建云盘快照,做好数据备份。具体操作,请参见创建一个云盘快照。
如果您在执行步骤一:扩容云盘容量时未创建快照,强烈建议您在扩容分区和文件系统前,为云盘创建快照,做好数据备份。
操作视频
以下视频指导您如何扩容Linux实例的云盘。
准备工作:确认待扩容云盘及其分区信息
执行扩容分区和文件操作系统前,请先确认待扩容云盘和云盘分区信息,来确定要执行的操作。
- 远程连接ECS实例。
具体操作,请参见 通过密码或密钥认证登录Linux实例。
- 运行以下命令,确认待扩容云盘及其分区信息。
fdisk -lu
如图所示,表示该实例有2块云盘,系统盘
/dev/vda
和数据盘/dev/vdb
,我们以数据盘/dev/vdb
为例。其中:- ①:云盘的设备名称。
- ②:云盘是否分区及分区名称。
- 已分区:有②处的分区信息表示已分区,Device取值为分区名称(示例中为
/dev/vdb1
),数字1
是分区编号,则需扩容分区和文件系统。 - 未分区(裸设备):没有②处的分区信息表示未分区,为裸设备。则无需扩容分区,直接执行步骤二:扩容文件系统。
- 已分区:有②处的分区信息表示已分区,Device取值为分区名称(示例中为
- ③:云盘的分区类型。
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)为例,请您根据实际环境进行操作。
- 可选:根据准备工作确认的信息,如果您的云盘分区类型为MBR且在控制台扩容后容量大于2 TiB,需先转换分区为GPT分区。否则跳过该步骤。
具体操作,请参见 转换Linux数据盘的分区类型。
- 运行以下命令,安装工具。
- Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本运行以下命令。
- 安装growpart工具。
type growpart || yum install -y cloud-utils-growpart
- (可选)根据准备工作确认的信息,如果您的云盘分区类型为GPT,还需运行以下命令安装gdisk工具。
type sgdisk || yum install -y gdisk
说明 由于CentOS 6和CentOS 8结束生命周期(EOL),如果您使用的是CentOS 6或者CentOS 8系统的ECS实例,请先切换源地址。具体操作,请参见 CentOS 6 EOL如何切换源?和 CentOS 8 EOL如何切换源?。 - 安装growpart工具。
- Debian 8及以上版本、Ubuntu14及以上版本运行以下命令。
- 更新软件源。
apt-get update
-
安装cloud-guest-utils。
type growpart || apt-get install -y cloud-guest-utils
- (可选)根据准备工作确认的信息,如果您的云盘分区类型为GPT,还需运行以下命令安装gdisk工具。
type sgdisk || apt-get install -y gdisk
- 更新软件源。
- Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本运行以下命令。
- 运行以下命令,扩容分区。
以云盘分区名称
/dev/vdb1
为例,运行如下命令。命令参数中的/dev/vdb
和1
之间需要空格分隔,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
字样时,表示分区扩容成功。 - 如果单盘有多个连续分区的情况,例如数据盘
- 可选:CentOS 6等较低版本的操作系统,需要执行
reboot
命令重启实例,使分区扩容生效。通常情况下,扩容分区不需要执行重启。但如果您扩容的是 CentOS 6的系统盘或者 发现扩容后操作系统实际识别的分区没有扩展,这是操作系统版本较低的原因,需要重启实例使分区扩容生效。建议您选择业务低谷的时间段进行重启,避免影响业务运行。
步骤二:扩容文件系统
- 运行以下命令,查看文件系统类型。
df -Th
Type值为文件系统类型,Mounted on值为分区的挂载目录。如下图,表示
/dev/vdb1
分区的文件系统类型为ext4,挂载目录为/mnt。如果Filesystem取值后缀不带数字(例如
/dev/vdc
),则为裸设备。 - 运行以下命令,扩容文件系统。
扩容命令因文件系统类型而异,请您根据上一步中查询到的文件系统类型选择以下命令。
- ext*(例如ext2、ext3、ext4)文件系统
- 以扩容云盘分区
/dev/vdb1
的ext*文件系统为例,则运行如下命令:resize2fs /dev/vdb1
- 以扩容裸设备
/dev/vdc
的ext*文件系统为例,则运行如下命令:resize2fs /dev/vdc
- 以扩容云盘分区
- xfs文件系统
以扩容挂载目录为 /mnt的 xfs文件系统为例,则运行如下命令:
type xfs_growfs || yum install -y xfsprogs xfs_growfs /mnt
- btrfs文件系统
以扩容挂载目录为 /mnt的 btrfs文件系统为例,则运行如下命令:
btrfs filesystem resize max /mnt
- ext*(例如ext2、ext3、ext4)文件系统
- 运行以下命令,确认是否扩容成功。
df -Th
当查询结果中的文件系统容量和控制台容量一致时,表示扩容成功。
如下图所示,分区/dev/vdb1
文件系统容量和控制台扩容容量(60 GB)基本一致,表示扩容完成。扩容完成后,您需要根据实际情况检查云盘数据是否正常。- 如果扩容成功,ECS实例中的业务程序能够正常运行,则完成操作。
- 如果扩容失败,您可以通过备份的快照回滚数据。具体操作,请参见使用快照回滚云盘。
常见问题
growpart相关问题
- 运行扩容分区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实例。
重要 当您通过切换字符编码,成功完成扩容分区后,建议您按需切回原有字符编码。 - 运行
- 运行扩容分区growpart命令时,提示
unexpected output in sfdisk --version [sfdisk (util-linux-ng 2.17.2)]
。原因:您的fdisk版本与growpart版本不兼容。
解决方案:尝试将growpart版本降低到0.27。
- 运行扩容分区growpart命令时,提示
FAILED: unable to determine partition type
。原因:您的云盘是裸设备,未分区。裸设备无需执行扩容分区操作,直接扩容文件系统即可。
解决方案:直接扩容文件系统。
- 运行扩容分区growpart命令时,提示
WARNING: MBR/dos partitioned disk is larger than 2TB. Additional space will go unused.
。原因:MBR分区类型不支持2 TiB以上的云盘。
解决方案:先将分区类型从MBR转换为GPT,然后再扩容分区。具体操作,请参见转换MBR分区为GPT分区。
- 为什么在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 || yum install -y cloud-utils-growpart
- 如果问题仍未解决,请参考扩展分区和文件系统_Linux数据盘扩容分区。
- 在CentOS 6中切换yum源。具体操作,请参见CentOS 6 EOL如何切换源?。
resize2fs相关问题
- 问题:运行扩容文件系统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指定的是云盘分区名称,不是云盘设备名称或者分区的挂载目录。
解决方案:扩容文件系统时,请您指定正确的分区名称。
- 问题:运行扩容文件系统resize2fs命令时,提示
The filesystem is already ... blocks long. Nothing to do!
。原因:文件系统没有可扩容的空间,可能是分区扩容未生效导致。
解决方案:如果您发现扩容后操作系统实际识别的分区没有扩展,可能是操作系统版本较低的原因,请尝试执行
reboot
命令重启实例,使分区扩容生效。