扩容分区和文件系统(Linux)
扩容分区和文件系统(Linux)
前提条件
操作系统版本需符合要求。
请确保Linux实例的操作系统是Alibaba Cloud Linux 2/3、CentOS 6及以上、Debian 8及以上或者Ubuntu14及以上版本。
CentOS 6操作系统在扩容至2 TiB以上或者扩容GPT分区表时,需要参考离线扩容分区和文件系统(Linux数据盘)使用
parted命令进行操作,不能使用本文档介绍的growpart命令进行操作,否则会有分区表被破坏的风险。判断是否为GPT分区,可以参见本文档中的准备工作:获取目标云盘信息。如果为其他操作系统,请参见离线扩容分区和文件系统(Linux数据盘)进行扩容操作。
(强烈建议)已创建云盘快照,做好数据备份。具体操作,请参见创建快照。
已在ECS控制台扩容云盘容量。具体操作,请参见步骤一:扩容云盘容量。
如果您在扩容云盘容量时选择离线扩容,扩容后需要通过ECS控制台或API接口重启实例(在实例内部执行
reboot命令重启无效)才能生效。具体操作,请参见重启实例。
注意事项
本文档不适用于使用LVM(Logical Volume Manager)管理磁盘分区的场景。
如果您使用LVM管理磁盘分区,在控制台扩容云盘容量后,需要先通过LVM完成逻辑卷扩容,再进行文件系统扩容。具体操作,请参见扩容逻辑卷。
本文档不适用于云盘开启了多重挂载功能且使用了集群文件系统的场景。
因为多重挂载功能允许同一块云盘被多个挂载点同时访问,直接扩容分区和文件系统可能会影响到其他挂载点,可能会破坏集群的一致性或可用性。更多信息,请参见云盘多重挂载功能。
操作步骤
本文操作适用于以下云盘扩容场景:
Linux实例云盘,已分区,将扩容部分的容量划分至已有分区:需要扩容分区和文件系统。
Linux实例云盘,未分区(裸设备):无需执行步骤1:扩容分区,直接执行步骤2:扩容文件系统。
在文档末尾分别以扩容MBR分区、GPT分区、裸数据盘为例,为您展示了扩容分区和文件系统的命令示例,供您参考。
准备工作:获取目标云盘信息
执行扩容分区和文件系统操作前,请先获取待扩容云盘和云盘分区信息。
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
运行以下命令,确认待扩容云盘及其分区信息。
sudo fdisk -lu

如图所示,表示该实例有2块云盘,系统盘
/dev/vda和数据盘/dev/vdb,我们以数据盘/dev/vdb为例。其中:云盘
/dev/vdb的sectors=125829120,则云盘容量=125829120*512bytes=64.4GB(等于60GiB)分区
/dev/vdb1的sectors=(End-Start)=83886078,则分区容量= 83886078*512bytes=42.9GB(等于40GiB)不同操作系统的显示略有不同。如果没有
Disk label type字段,可通过System字段判断。System值为Linux表示MBR分区,值为GPT表示GPT分区。较低版本的fdisk可能不能正常显示GPT分区表。您可以通过
gdisk -l /dev/vdb命令查看分区类型。已分区:如果有②处的分区信息表示已分区,Device取值为分区名称(示例中为
/dev/vdb1),数字1是分区编号,则需扩容分区和文件系统。未分区(裸设备):如果没有②处的分区信息表示未分区,为裸设备。则无需执行步骤1:扩容分区,直接执行步骤2:扩容文件系统即可。
①:云盘的设备名称。
②:云盘是否分区及分区名称。
③:云盘的分区类型。
Disk label type值为dos表示MBR分区,值为gpt表示GPT分区。④:确认待扩容的分区。
由于容量= sectors值*512 bytes,图示例中:
根据计算得出
/dev/vdb1分区的容量小于云盘/dev/vdb的容量,即/dev/vdb1分区需要扩容。
步骤1:扩容分区
本操作以公共镜像Alibaba Cloud Linux 3.2104 LTS 64位操作系统、在ECS实例内部将云盘分区/dev/vdb1由40 GiB扩容至60 GiB(已在控制台扩大容量为60 GiB)为例,请您根据实际环境进行操作。
(条件必选)根据准备工作获取的信息,如果您的云盘分区类型为MBR且在控制台扩容后容量大于2 TiB,需先将分区转换为GPT分区。
具体操作,请参见转换Linux数据盘的分区类型。
运行以下命令,扩容指定分区。例如扩容分区名称为
/dev/vdb1的分区,则执行如下命令。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
命令参数中的
/dev/vdb和1之间需要空格分隔,1是分区编号。如果您扩容的是系统盘,命令中的
/dev/vdb需要替换为/dev/vda。
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
如下图所示,输出
CHANGED字样时,表示分区扩容成功。
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 2、growpart /dev/vdb 5完成分区的扩容。使用growpart工具时,如果出现报错信息,请参见常见问题进行排查。
(条件必选)CentOS 6等较低版本的操作系统,需要执行
reboot命令重启实例,使分区扩容生效。通常情况下,扩容分区不需要执行重启。但如果您扩容的是CentOS 6操作系统的云盘或者发现扩容后操作系统实际识别的分区没有扩展,这是操作系统版本较低的原因,需要重启实例使分区扩容生效。建议您选择业务低谷的时间段进行重启,避免影响业务运行。
步骤2:扩容文件系统
运行以下命令,获取需要扩容的文件系统的类型和挂载目录。
df -Th
Type值为文件系统类型,Mounted on值为分区的挂载目录。如下图表示/dev/vdb1分区的文件系统类型为ext4,挂载目录为/mnt。
如果Filesystem取值后缀不带数字(例如
/dev/vdc),则为裸设备。扩容文件系统。
扩容命令因文件系统类型而异,请您根据上一步中查询到的文件系统类型选择以下命令。
以扩容云盘分区
/dev/vdb1的ext*文件系统为例,则运行如下命令:sudo resize2fs /dev/vdb1
以扩容裸设备
/dev/vdc的ext*文件系统为例,则运行如下命令:sudo resize2fs /dev/vdc
以扩容挂载目录为/mnt的xfs文件系统为例,则运行如下命令:
type xfs_growfs || sudo yum install -y xfsprogs sudo xfs_growfs /mnt
以扩容挂载目录为/mnt的btrfs文件系统为例,则运行如下命令:
sudo btrfs filesystem resize max /mnt
运行以下命令,确认是否扩容成功。
df -Th
当查询结果中的文件系统容量和控制台容量一致时,表示扩容成功。
如下图所示,分区
/dev/vdb1文件系统容量(59 GiB)和云盘容量(60 GiB)基本一致(因为文件系统本身会占用部分存储空间),表示扩容完成。
扩容完成后,您需要根据实际情况检查云盘数据是否正常。
如果扩容成功,ECS实例中的业务程序能够正常运行,则完成操作。
如果扩容失败,您可以通过备份的快照回滚数据。具体操作,请参见使用快照回滚云盘。
如果是线下主机
检查和确认
确认分区大小:
sh深色版本sudo fdisk -l /dev/sda
确认文件系统大小:
sh深色版本df -h
扩充逻辑卷(LVM)
如果你的 /dev/sda3 是一个 LVM 物理卷(Physical Volume, PV)并且属于某个卷组(Volume Group, VG),你可以通过以下步骤来扩充它:
检查物理卷和卷组:
sh深色版本sudo pvssudo vgs
确认逻辑卷(Logical Volume, LV):
sh深色版本sudo lvs
假设你的逻辑卷是 /dev/mapper/ubuntu--vg-ubuntu--lv,并且它当前是 98G,我们可以尝试扩充它。
扩充逻辑卷
扩展物理卷: 如果
/dev/sda3已经是物理卷的一部分,你可以跳过这一步。否则,你需要将其初始化为物理卷:sh深色版本sudo pvcreate /dev/sda3
扩展卷组: 将新的物理卷添加到现有的卷组中:
sh深色版本sudo vgextend ubuntu-vg /dev/sda3
扩展逻辑卷: 扩展逻辑卷以使用卷组中的所有可用空间:
sh深色版本sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
调整文件系统大小: 根据你的文件系统类型,调整文件系统的大小。假设你的文件系统是 ext4:
sh深色版本sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
验证
检查逻辑卷大小:
sh深色版本sudo lvs
检查文件系统大小:
sh深色版本df -h
总结
如果你的 /dev/sda3 已经是一个 LVM 物理卷,并且属于某个卷组,你可以通过上述步骤来扩充逻辑卷。如果 /dev/sda3 不是 LVM 物理卷,那么你需要先将其初始化为物理卷并添加到卷组中,然后再进行扩充。
扩容示例
本节以MBR分区、GPT分区、裸数据盘为例展示扩容分区和文件系统的操作命令,供您参考。在实际扩容过程中,请您以实际环境为准。
设备名:/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
设备名:/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
设备名:/dev/vdc(裸数据盘未分区)
文件系统类型:ext4
操作系统:CentOS 7
扩容文件系统命令如下:
sudo resize2fs /dev/vdc
