-
前提条件
-
确保Linux实例的操作系统是Alibaba Cloud Linux 2/3、CentOS 6及以上、Debian 8及以上或者Ubuntu14及以上版本。
说明如果为其他操作系统,扩容操作请参见扩展分区和文件系统_Linux数据盘。
-
已在ECS控制台扩容云盘容量。具体操作,请参见步骤一:扩容云盘容量。
-
(强烈建议)已创建云盘快照,做好数据备份。具体操作,请参见创建一个云盘快照。
说明扩容分区和文件系统正常情况不会丢失数据。为避免误操作导致数据丢失或异常,建议您创建快照备份云盘数据。
-
本文档不适用于开启了多重挂载功能且使用了集群文件系统的场景。更多信息,请参见开启多重挂载功能。
操作步骤
本文操作适用于以下云盘扩容场景:
-
Linux实例云盘,已分区,将扩容部分的容量划分至已有分区:需扩容分区和文件系统。
说明如果您希望新增分区而不是扩容已有分区,请参见扩展分区和文件系统_Linux数据盘。
-
Linux实例云盘,未分区(裸设备):无需执行步骤1:扩容分区,直接执行步骤2:扩容文件系统。
在文档末尾分别以扩容MBR分区、GPT分区、裸数据盘为例,为您展示了扩容分区和文件系统的命令示例,供您参考。
准备工作:获取目标云盘信息
执行扩容分区和文件操作系统前,请先获取待扩容云盘和云盘分区信息。
方式一:通过命令行获取方式二:通过控制台获取-
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
-
运行以下命令,确认待扩容云盘及其分区信息。
fdisk -lu
如图所示,表示该实例有2块云盘,系统盘
/dev/vda
和数据盘/dev/vdb
,我们以数据盘/dev/vdb
为例。其中:-
①:云盘的设备名称。
-
②:云盘是否分区及分区名称。
-
已分区:如果有②处的分区信息表示已分区,Device取值为分区名称(示例中为
/dev/vdb1
),数字1
是分区编号,则需扩容分区和文件系统。 -
未分区(裸设备):如果没有②处的分区信息表示未分区,为裸设备。则无需执行步骤1:扩容分区,直接执行步骤2:扩容文件系统即可。
-
-
③:云盘的分区类型。
Disk label type
值为dos
表示MBR分区,值为gpt
表示GPT分区。说明-
不同操作系统的显示略有不同。如果没有
Disk label type
字段,可通过System
字段判断。System
值为Linux
表示MBR分区,值为GPT
表示GPT分区。 -
较低版本的fdisk可能不能正常显示GPT分区表。您可以通过
gdisk -l /dev/vdb
命令查看分区类型。
-
-
④:确认待扩容的分区。
由于容量= sectors值*512 bytes,图示例中:
-
云盘
/dev/vdb
的sectors=125829120,则云盘容量=125829120*512bytes=64.4GB(等于60GiB) -
分区
/dev/vdb1
的sectors=(End-Start)=83886078,则分区容量= 83886078*512bytes=42.9GB(等于40GiB)
根据计算得出
/dev/vdb1
分区的容量小于云盘/dev/vdb
的容量,即/dev/vdb1
分区需要扩容。说明您也可以通过运行
lsblk
命令查看哪个分区待扩容。 -
-
步骤1:扩容分区
本操作以公共镜像Alibaba Cloud Linux 2.1903 LTS 64位操作系统、在ECS实例内部将云盘分区
/dev/vdb1
由40 GiB扩容至60 GiB(已在控制台扩大容量为60 GiB)为例,请您根据实际环境进行操作。-
可选:根据准备工作获取的信息,如果您的云盘分区类型为MBR且在控制台扩容后容量大于2 TiB,需先转换分区为GPT分区。
具体操作,请参见转换Linux数据盘的分区类型。
-
运行以下命令,扩容指定分区。例如扩容分区名称为
/dev/vdb1
的分区,则执行如下命令。说明命令参数中的
/dev/vdb
和1
之间需要空格分隔,1
是分区编号。Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本Debian 8及以上版本、Ubuntu14及以上-
MBR分区
type growpart || yum install -y cloud-utils-growpart LC_ALL=en_US.UTF-8 growpart /dev/vdb 1
-
GPT分区(需安装gdisk工具)
type growpart || yum install -y cloud-utils-growpart type sgdisk || yum install -y gdisk LC_ALL=en_US.UTF-8 growpart /dev/vdb 1
说明由于CentOS 6和CentOS 8结束生命周期(EOL),如果您使用的是CentOS 6或者CentOS 8系统的ECS实例,请先切换源地址。具体操作,请参见CentOS 6 EOL如何切换源?和CentOS 8 EOL如何切换源?。
重要以下几种分区情况,您需要特别注意:
-
LC_ALL=en_US.UTF-8
是环境变量设置,为了兼容中文操作系统的字符编码。 -
如果您扩容的是系统盘,系统盘的设备名称通常为
/dev/vda
。 -
如果单盘有多个连续分区的情况,仅能扩容最后一个分区。例如数据盘
/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 2
、growpart /dev/vdb 5
完成分区的扩容。 -
使用growpart工具时,如果出现报错信息,请参见常见问题进行排查。
如下图所示,输出
CHANGED
字样时,表示分区扩容成功。 -
-
可选:CentOS 6等较低版本的操作系统,需要执行
reboot
命令重启实例,使分区扩容生效。通常情况下,扩容分区不需要执行重启。但如果您扩容的是CentOS 6操作系统的云盘或者发现扩容后操作系统实际识别的分区没有扩展,这是操作系统版本较低的原因,需要重启实例使分区扩容生效。建议您选择业务低谷的时间段进行重启,避免影响业务运行。
步骤2:扩容文件系统
-
运行以下命令,获取需要扩容的文件系统的类型和挂载目录。
df -Th
Type
值为文件系统类型,Mounted on
值为分区的挂载目录。如下图表示/dev/vdb1
分区的文件系统类型为ext4,挂载目录为/mnt。
如果Filesystem取值后缀不带数字(例如
/dev/vdc
),则为裸设备。 -
扩容文件系统。
扩容命令因文件系统类型而异,请您根据上一步中查询到的文件系统类型选择以下命令。
说明云盘和文件系统正在被使用的状态下,采用resize2fs等工具在线扩容文件系统,有可能会触发文件系统数据问题,该问题与镜像内核版本、resize2fs工具版本相关,与云盘扩容本身无关。建议您为云盘创建快照,做好数据备份。具体操作,请参见创建一个云盘快照。
ext*(例如ext2、ext3、ext4)文件系统xfs文件系统btrfs文件系统-
以扩容云盘分区
/dev/vdb1
的ext*文件系统为例,则运行如下命令:resize2fs /dev/vdb1
-
以扩容裸设备
/dev/vdc
的ext*文件系统为例,则运行如下命令:resize2fs /dev/vdc
-
-
运行以下命令,确认是否扩容成功。
df -Th
当查询结果中的文件系统容量和控制台容量一致时,表示扩容成功。
如下图所示,分区
/dev/vdb1
文件系统容量(59 GiB)和云盘容量(60 GiB)基本一致(因为文件系统本身会占用部分存储空间),表示扩容完成。扩容完成后,您需要根据实际情况检查云盘数据是否正常。
-
如果扩容成功,ECS实例中的业务程序能够正常运行,则完成操作。
-
如果扩容失败,您可以通过备份的快照回滚数据。具体操作,请参见使用快照回滚云盘。
-
扩容示例
本节以MBR分区、GPT分区、裸数据盘为例展示扩容分区和文件系统的操作命令,供您参考。在实际扩容过程中,请您以实际环境为准。
示例1:扩容MBR分区和ext4文件系统示例2:扩容GPT分区和xfs文件系统示例3:扩容裸数据盘-
设备名:/dev/vda(系统盘)
-
1个分区:/dev/vda1
-
文件系统类型:ext4
-
操作系统:Alibaba Cloud Linux 2
扩容分区和文件系统命令如下:
type growpart || yum install -y cloud-utils-growpart LC_ALL=en_US.UTF-8 growpart /dev/vda 1 resize2fs /dev/vda1
常见问题
说明如果您遇到难以解决的问题,您可以加入云盘扩容问题客户钉钉群(钉钉群号:25920014655)与我们的工程师即时沟通。
growpart相关问题resize2fs相关问题-
问题:运行扩容分区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。如果问题仍未解决,请参考扩展分区和文件系统_Linux数据盘扩容分区。
-
问题:运行扩容分区growpart命令时,提示
FAILED: unable to determine partition type
。原因:您的云盘是裸设备,未分区。裸设备无需执行扩容分区操作,直接扩容文件系统即可。
解决方案:直接步骤3:扩容文件系统。
-
问题:运行扩容分区growpart命令时,提示
WARNING: MBR/dos partitioned disk is larger than 2TB. Additional space will go unused.
。原因:MBR分区类型不支持2 TiB以上的云盘。
解决方案:先将分区类型从MBR转换为GPT,然后再扩容分区。具体操作,请参见转换MBR分区为GPT分区。
-
问题:运行扩容分区growpart命令时,提示
mkdir: cannot create directory ... No space left on device
原因:磁盘空间不足,导致growpart命令创建临时目录时失败。
解决方案:清理无用的文件释放空间,然后再进行扩容。
-
问题:为什么在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数据盘扩容分区。
-
-
问题:设备名以
/dev/mapper
开头的分区未扩容成功。原因:设备名以
/dev/mapper
开头,通常是通过LVM(Logical Volume Manager)管理磁盘分区。解决方案:需要先通过LVM扩容逻辑卷,然后再扩容文件系统。具体操作,请参见通过LVM扩容逻辑卷。
-
问题:运行扩容分区growpart命令时,提示
NOCHANGE: partition 1 could only be grown by 2015 [fudge=2048]
。原因:扩容分区时没有更多可用空间。通常是因为在控制台离线扩容云盘后,未通过控制台或OpenAPI重启实例,导致云盘本身没有得到扩容。
解决方案:离线扩容后,必须通过ECS控制台或者OpenAPI重启实例才能使云盘扩容生效,在ECS实例内部重启(执行
reboot
命令)无效。具体操作,请参见重启实例或者RebootInstance。
-
参考文档