本文为您介绍如何扩容Linux实例云盘(系统盘或数据盘)的分区和文件系统。
操作场景
在ECS控制台上扩容云盘容量后,对应分区和文件系统并未扩容,您还需要进入ECS实例内部继续扩容云盘的分区和文件系统,将扩容部分的容量划分至已有分区或者新增分区,使云盘扩容生效。
本文操作适用于以下云盘扩容场景:Linux实例云盘,已分区,将扩容部分的容量划分至已有分区:需扩容分区和文件系统。说明 如果您希望新增分区而不是扩容已有分区,请参见扩展分区和文件系统_Linux数据盘。
Linux实例云盘,未分区(裸设备):无需扩容分区,直接执行步骤二:扩容文件系统。
前提条件
确保Linux实例的操作系统是Alibaba Cloud Linux 2/3、CentOS 6及以上、Debian 8及以上或者Ubuntu14及以上版本。说明 如果为其他操作系统,扩容操作请参见扩展分区和文件系统_Linux数据盘。
已参考步骤一:扩容云盘容量,在ECS控制台扩容云盘容量。
(强烈建议)已创建云盘快照,做好数据备份。具体操作,请参见创建快照。
如果您在执行步骤一:扩容云盘容量时未创建快照,强烈建议您在扩容分区和文件系统前,为云盘创建快照,做好数据备份。
准备工作:确认待扩容云盘及其分区信息
执行扩容分区和文件操作系统前,请先确认待扩容云盘和云盘分区信息,来确定要执行的操作。
远程连接ECS实例。具体操作,请参见通过密码或密钥认证登录Linux实例。
运行以下命令,确认待扩容云盘及其分区信息。放大查看复制代码
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)为例,请您根据实际环境进行操作。
可选:根据准备工作确认的信息,如果您的云盘分区类型为MBR且在控制台扩容后容量大于2 TiB,需先转换分区为GPT分区。否则跳过该步骤。具体操作,请参见转换Linux数据盘的分区类型。
运行以下命令,安装工具。
Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本运行以下命令。说明 由于CentOS 6和CentOS 8结束生命周期(EOL),如果您使用的是CentOS 6或者CentOS 8系统的ECS实例,请先切换源地址。具体操作,请参见CentOS 6 EOL如何切换源?和CentOS 8 EOL如何切换源?。
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
安装growpart工具。放大查看复制代码
type growpart || yum install -y cloud-utils-growpart
(可选)根据准备工作确认的信息,如果您的云盘分区类型为GPT,还需运行以下命令安装gdisk工具。放大查看复制代码
type sgdisk || yum install -y gdisk
扩容分区。以云盘分区名称/dev/vdb1为例,则运行如下命令。放大查看复制代码
LC_ALL=en_US.UTF-8 growpart /dev/vdb 1
重要如下图所示,输出CHANGED字样时,表示分区扩容成功。
如果单盘有多个连续分区的情况,例如数据盘/dev/vdb有三个分区/dev/vdb1、/dev/vdb2和/dev/vdb3。扩容时,只需要扩容最后一个分区即可,即执行growpart /dev/vdb 3一个命令即可完成数据盘的分区扩容。
使用growpart工具时,如果出现报错信息,请参见常见问题进行排查。
1是分区编号,/dev/vdb和1之间需要空格分隔。
LC_ALL=en_US.UTF-8是为了解决中文操作系统的编码问题。
可选:执行reboot命令重启实例。如果您扩容的是CentOS 6的系统盘或者发现扩容后操作系统实际识别的分区没有扩展,这是操作系统版本较低的原因,需要重启实例使分区扩容生效。
步骤二:扩容文件系统
说明 云盘和文件系统正在被使用的状态下,采用resize2fs等工具在线扩容文件系统,有可能会触发文件系统数据问题,该问题与镜像内核版本、resize2fs工具版本相关,与云盘扩容本身无关。建议您为云盘创建快照,做好数据备份。具体操作,请参见创建快照。运行以下命令,查看文件系统类型。放大查看复制代码
df -Th
Type值为文件系统类型,Mounted on值为分区的挂载目录。如下图,表示/dev/vdb1分区的文件系统类型为ext4,挂载目录为/mnt。
如果Filesystem取值后缀不带数字(例如/dev/vdc),则为裸设备。
运行以下命令,扩容文件系统。
扩容命令因文件系统类型而异,请您根据上一步中查询到的文件系统类型选择以下命令。
以扩容云盘分区/dev/vdb1的ext4文件系统为例,则运行如下命令:放大查看复制代码
resize2fs /dev/vdb1
以扩容裸设备/dev/vdc的ext4文件系统为例,则运行如下命令:放大查看复制代码
resize2fs /dev/vdc
ext4文件系统
xfs文件系统以扩容挂载目录为/mnt的xfs文件系统为例,则运行如下命令:放大查看复制代码
type xfs_growfs || yum install -y xfsprogs xfs_growfs /mnt
btrfs文件系统以扩容挂载目录为/mnt的btrfs文件系统为例,则运行如下命令:放大查看复制代码
btrfs filesystem resize max /mnt
运行以下命令,确认是否扩容成功。放大查看复制代码
df -Th
当查询结果中的文件系统容量和控制台容量一致时,表示扩容成功。
如下图所示,分区/dev/vdb1文件系统容量和控制台扩容容量(60 GB)基本一致,表示扩容完成。扩容完成后,您需要根据实际情况检查云盘数据是否正常。
如果扩容成功,ECS实例中的业务程序能够正常运行,则完成操作。
如果扩容失败,您可以通过备份的快照回滚数据。具体操作,请参见使用快照回滚云盘。
常见问题
说明 如果您遇到难以解决的问题,您可以加入云盘扩容问题客户钉钉群(钉钉群号:25920014655)与我们的工程师即时沟通。growpart相关问题
运行扩容分区growpart命令时,提示unexpected output in sfdisk --version [sfdisk,来自 util-linux 2.23.2]。
原因:中文版操作系统使用了非en_US.UTF-8的字符编码类型。
解决方案:重要 当您通过切换字符编码,成功完成扩容分区后,建议您按需切回原有字符编码。
运行以下命令,切换字符编码类型。放大查看复制代码
export.UTF-8
如果问题仍未解决,运行以下命令,切换字符编码类型。放大查看复制代码
export LC_ALL=en_US.UTF-8
运行locale命令查看ECS实例的字符编码类型,将非en_US.UTF-8的字符编码类型切换成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数据盘扩容分区。
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!。
原因:文件系统没有可扩容的空间,可能是分区扩容未生效导致。
解决方案:如果您发现扩容后操作系统实际识别的分区没有扩展,可能是操作系统版本较低的原因,请尝试执行<code style="box-sizing: border-box;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);font-family: var(--cb-typo-font-family-monospace,Operator Mono,Menlo,Monaco,Liberation Mono,DejaVu Sans Mono,Courier New,monospace);font-size: 1em;padding: 2px 4px;border-ra