文档首页/ 云硬盘 EVS/ 最佳实践/ 离线扩容分区和文件系统(Linux数据盘)
更新时间:2025-09-17 GMT+08:00
分享

离线扩容分区和文件系统(Linux数据盘)

部分老旧版本的Linux操作系统,无法使用一些在线工具(如 growpart, resize2fs)对处于挂载(mount)状态的云硬盘进行扩容。为了解决上述问题,可采用离线扩容方式,即先将云硬盘从原实例卸载(umount),再扩容。本文主要介绍如何离线扩容Linux数据盘。

前提条件

确认分区表格式和文件系统

  1. 确认分区表格式和文件系统。

    1. 运行如下命令确认数据盘的分区表格式。

      sudo fdisk -lu /dev/vdb

      本示例以数据盘“/dev/vdb”已设置分区“/dev/vdb1”为例,则显示结果如下。

      Device    Boot  Start    End   Sectors  Size  Id  Type 
      /dev/vdb1  *    2048 83886046 83883999   40G  83  Linux
      • 如果Type为Linux,说明数据盘使用的是MBR分区表格式。
      • 如果Type为GPT,说明数据盘使用的是GPT分区表格式。
    2. 运行如下命令确认当前分区的文件系统类型。

      blkid /dev/vdb1

      [test@ecs-test-0001 ~]# blkid /dev/vdb1 /dev/vdb1: UUID="b9a07b7b-9322-4e05-ab9b-14b8050cd8cc" TYPE="ext4"

      “TYPE”的值表示当前分区的文件系统类型。

  2. 确认文件系统的状态是否正常。

    如果文件系统状态不正常,请排查修复后再进行之后的操作。
    表1 状态确认

    文件系统

    命令

    状态说明

    ext*文件系统

    sudo e2fsck -n /dev/vdb1

    当ext*和xfs文件系统状态为“clean”,表示文件系统状态正常。

    xfs文件系统

    sudo xfs_repair -n /dev/vdb1

    btrfs文件系统

    sudo btrfsck /dev/vdb1

    • 当btrfs文件系统包含“found xxxx bytes used err is 0”时,表示文件系统状态正常。

  3. 选择扩容分区或文件系统的方式

    根据您查询到的分区格式和文件系统情况确定操作选项。

    扩容场景

    相关操作

    数据盘已分区并创建文件系统

    全新数据盘,未分区,未创建文件系统

    在控制台扩容数据盘空间后,请参见初始化数据盘

    数据盘是裸设备,已创建文件系统,未分区

    在控制台扩容数据盘空间后,请参见扩容裸设备文件系统

    数据盘未挂载到实例上

    挂载数据盘到实例后,请参见本文档的操作步骤完成扩容。

    • MBR分区支持的磁盘最大容量为2TiB,超过2TiB的部分无法使用。为避免造成数据丢失,建议您创建一块大于2TiB的云硬盘,格式化一个GPT分区,再将MBR分区中的数据拷贝到GPT分区中。
    • 当出现因扩容格式化工具问题导致的扩容失败时,您可以提前升级工具版本,或者卸载工具后重新安装。

扩大已有MBR分区

为了防止数据丢失,不建议对已挂载的分区和文件系统直接进行扩容操作。请先将分区取消挂载(umount),完成扩容操作并确认无误后,再重新挂载(mount)。针对不同的Linux内核版本,推荐如下操作方式:

  • 实例内核版本小于3.6:先取消挂载该分区,再修改分区表,最后扩容文件系统。
  • 实例内核版本大于等于3.6:先修改对应分区表,再通知内核更新分区表,最后扩容文件系统。
  1. 修改分区表。

    1. 运行如下命令查看分区信息,并记录旧分区的起始(Start)和结束(End)的扇区位置。

      sudo fdisk -lu /dev/vdb

      [test@ecs-test-0001 ~]# sudo fdisk -lu /dev/vdb
      Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
      Units = sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disk label type: dos
      Disk identifier: 0xedd8c529
      Device Boot      Start         End      Blocks   Id  System
      /dev/wdb1        2048       20971519    10484736   83  Linux

      本示例中/dev/vdb的起始扇区是2048,结束扇区是20971519。

    2. 查看数据盘的挂载路径,根据返回的文件路径卸载分区,直至完全卸载已挂载的分区。
      1. 查看数据盘挂载信息。

        mount | grep "/dev/vdb"

      2. 取消挂载数据盘。

        sudo umount /dev/vdb1

      3. 查看操作结果。

        mount | grep "/dev/vdb"

        示例结果如下所示。

        [test@ecs-test-0001 ~]# mount | grep "/dev/vdb" /dev/vdb1 on /mnt type ext4 (rw,relatime,data=ordered) 
        [test@ecs-test-0001 ~]# sudo umount /dev/vdb1 
        [test@ecs-test-0001 ~]# mount | grep "/dev/vdb"
    3. 使用fdisk工具删除旧分区。

      此操作可能造成数据丢失,建议提前进行备份操作。

      sudo fdisk -u /dev/vdb

      1. 输入“p”,按“Enter”,打印分区表信息。
      2. 输入“d”,按“Enter”,删除当前分区表。
      3. 输入“p”,按“Enter”,确认已删除当前分区。
      4. 输入“w”,按“Enter”,写入分区结果并退出。
        [test@ecs-test-0001 ~]# sudo fdisk -u /dev/vdb
        Welcome to fdisk (util-linux 2.23.2).
        Changes will remain in memory only, until you decide to write them.
        Be careful before using the write command.
        
        Command (m for help): p
        
        Disk /dev/vdb: 42.9 GB, 42949672960 bytes, 83886080 sectors
        Units = sectors of 1 * 512 = 512 bytes
        Sector size (logical/physical): 512 bytes / 512 bytes
        I/O size (minimum/optimal): 512 bytes / 512 bytes
        Disk label type: dos
        Disk identifier: 0x9277b47b
        
        Device Boot Start End Blocks Id System
        /dev/vdb1 2048 41943039 20970496 83 Linux
        
        Command (m for help): d
        Selected partition 1
        Partition 1 is deleted
        Command (m for help): p
        Disk /dev/vdb: 42.9 GB, 42949672960 bytes, 83886080 sectors
        Units = sectors of 1 * 512 = 512 bytes
        Sector size (logical/physical): 512 bytes / 512 bytes
        I/O size (minimum/optimal): 512 bytes / 512 bytes
        Disk label type: dos
        Disk identifier: 0x9277b47b
        Device Boot Start End Blocks Id System
        Command (m for help): w
        The partition table has been altered!
        Calling ioctl() to re-read partition table.
        Syncing disks.
    4. 使用fdisk命令新建分区。

      sudo fdisk -u /dev/vdb

      1. 输入“p”,按“Enter”,打印分区表信息。
      2. 输入“n”,按“Enter”,新建分区。
      3. 输入“p”,按“Enter”,选择分区类型为主分区。
      4. 输入“1”,按“Enter”,选择主分区编号。此处以选择“1”为例。
      5. 此处以选择默认起始磁柱值为例,按“Enter”。
      6. 此处以选择默认截止磁柱值为例,按“Enter”。
      7. 输入“w”,按“Enter”,写入分区结果并退出。

        如下示例为使用fdisk工具将“/dev/vdb1”由20GiB扩容到40GiB。

        [test@ecs-test-0001 ~]# sudo fdisk -u /dev/vdb
        Welcome to fdisk (util-linux 2.23.2).
        Changes will remain in memory only, until you decide to write them.
        Be careful before using the write command.
        
        Command (m for help): p
        Disk /dev/vdb: 42.9 GB, 42949672960 bytes, 83886080 sectors
        Units = sectors of 1 * 512 = 512 bytes
        Sector size (logical/physical): 512 bytes / 512 bytes
        I/O size (minimum/optimal): 512 bytes / 512 bytes
        Disk label type: dos
        Disk identifier: 0x38717fc1
        Device Boot Start End Blocks Id System
        
        Command (m for help): n
        Partition type:
        p   primary (0 primary, 0 extended, 4 free)
        e   extended
        Select (default p): p
        Partition number (1-4, default 1): 1
        First sector (2048-83886079, default 2048):
        Using default value 2048
        Last sector, +sectors or +size{K,M,G} (2048-83886079, default 83886079):
        Partition 1 of type Linux and of size 40 GiB is set
        Command (m for help): w
        The partition table has been altered!
        Calling ioctl() to re-read partition table.
        Syncing disks.
    5. 执行如下任一命令通知内核读取数据盘的分区表。
      • sudo partprobe /dev/vdb
      • sudo partprobe /dev/vdb1
    6. 运行如下命令查看数据盘信息,确保分区表添加成功。

      sudo lsblk /dev/vdb

    7. 运行如下命令再次检查文件系统,确认扩容分区后的文件系统状态为“clean”。

      sudo e2fsck -f /dev/vdb1

      如果运行命令后文件系统状态不显示为“clean”,请尝试使用sudo e2fsck -n /dev/vdb1检查。

  2. 扩容文件系统。

    • ext*文件系统(例如ext3和ext4)。
      1. 调整ext*文件系统大小。

        sudo resize2fs /dev/vdb1

      2. 分区挂载到“/mnt”。

        sudo mount /dev/vdb1 /mnt

    • xfs文件系统。
      1. 分区挂载到“/mnt”。

        sudo mount /dev/vdb1 /mnt

      2. 调整xfs文件系统大小。
        sudo xfs_growfs /mnt

        新版xfs_growfs根据挂载点识别待扩容设备,例如xfs_growfs /mnt。您可以运行xfs_growfs --help查看不同版本xfs_growfs的使用方法。

    • btrfs文件系统。
      1. 分区挂载到“/mnt”。

        sudo mount /dev/vdb1 /mnt

      2. 调整btrfs文件系统大小。

        sudo btrfs filesystem resize max /mnt

新增MBR分区

如果新增空间用于增加新的MBR分区,按照如下步骤在实例中完成扩容:

  1. 运行如下命令新建分区。

    sudo fdisk -u /dev/vdb

    1. 输入“p”,按“Enter”,打印分区表信息。
    2. 输入“n”,按“Enter”,新建分区。
    3. 输入“p”,按“Enter”,选择分区类型为主分区。
    4. 输入“2”,按“Enter”,选择主分区编号。此处以选择“2”为例。
    5. 此处以选择默认起始磁柱值为例,按“Enter”。
    6. 此处以选择默认截止磁柱值为例,按“Enter”。
    7. 输入“w”,按“Enter”,写入分区结果并退出。

    如下示例为使用fdisk工具把新增的20GiB分配新的MBR分区“/dev/vdb2”。

    [test@ecs-test-0001 ~]# sudo fdisk -u /dev/vdb
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write commad.
    
    Command (m for help): p
    
    Disk /dev/vdb: 42.9 GB, 42949672960 bytes, 83886080 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000bcb4e
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/vdb1            2048    41943039    20970496   83  Linux
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): p
    Partition number (2-4, default 2): 2
    First sector (41943040-83886079, default 41943040):
    Using default value 41943040
    Last sector, +sectors or +size{K,M,G} (41943040-83886079, default 83886079):
    Using default value 83886079
    Partition 2 of type Linux and of size 20 GiB is set
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    Syncing disks.

  2. 运行如下命令查看分区。

    lsblk /dev/vdb

  3. 运行如下命令创建文件系统。

    • 创建ext4文件系统:

      sudo mkfs.ext4 /dev/vdb2

    • 创建xfs文件系统:

      sudo mkfs.xfs -f /dev/vdb2

    • 创建btrfs文件系统:

      sudo mkfs.btrfs /dev/vdb2

  4. 运行如下命令查看文件系统信息。

    blkid /dev/vdb2

    [test@ecs-test-0001 ~]# blkid /dev/vdb2/dev/vdb2: UUID="0b3040e2-1367-4abb-841d-ddb0b92693df" TYPE="ext4"

  5. 运行如下命令挂载分区。

    sudo mount /dev/vdb2 /mnt

  6. 运行如下命令查看目前数据盘空间和使用情况。

    df -h

    显示新建文件系统的信息,表示挂载成功。

扩大已有GPT分区

如果新增空间用于扩容已有的GPT分区,按照如下步骤在实例中完成扩容:

  1. 查看数据盘的挂载路径,根据返回的文件路径卸载分区,直至完全卸载已挂载的分区。

    查看挂载(mount)信息。

    mount | grep "/dev/vdb"

    取消挂载(umount)数据盘。

    sudo umount /dev/vdb1

    查看操作结果。

    mount | grep "/dev/vdb"

    示例结果如下所示。

    [test@ecs-test-0001 ~]# mount | grep "/dev/vdb" /dev/vdb1 on /mnt type ext4 (rw,relatime,data=ordered) 
    [test@ecs-test-0001 ~]# sudo umount /dev/vdb1 
    [test@ecs-test-0001 ~]# mount | grep "/dev/vdb"

  2. 使用Parted工具为现有GPT分区分配容量。

    1. 运行如下命令进入Parted分区工具。

      sudo parted /dev/vdb

      如需查看Parted工具使用说明,运行help命令。

    2. 运行如下命令查看分区信息,并记录现有分区的分区号和起始扇区的值。

      print

      若界面提示Fix/Ignore/Cancel?和Fix/Ignore?,均输入“Fix”即可。

    3. 运行如下命令删除现有分区,以下以删除分区号为“1”为例。

      rm 1

    4. 运行如下命令重新创建主分区。以下以原分区的起始扇区为1049kB,且要将扩容后的总容量全部分配给该分区为例。

      mkpart primary 1049kB 100%

    5. 运行如下命令查看新分区是否创建成功。

      print

    6. 退出Parted分区工具。

      quit

      如下示例为使用Parted工具将现有GPT分区扩展至3299GB。
      [test@ecs-test-0001 ~]# sudo parted /dev/vdb
      GNU Parted 3.1
      Using /dev/vdb
      Welcome to GNU Parted! Type 'help' to view a list of commands.
      (parted) print
      Error: The backup GPT table is not at the end of the disk, as it should be.
      This might mean that another operating system believes the disk is smaller.
      Fix, by moving the backup to the end (and removing the old backup)?
      Fix/Ignore/Cancel? Fix
      Warning: Not all of the space available to /dev/vdb appears to be used, you can
      fix the GPT to use all of the space (an extra 4294967296 blocks) or continue
      with the current setting?
      Fix/Ignore? Fix
      Model: Virtio Block Device (virtblk)
      Disk /dev/vdb: 3299GB
      Sector size (logical/physical): 512B/512B
      Partition Table: gpt
      Disk Flags:
      
      Number  Start   End     Size    File system  Name     Flags
       1      1049kB  1100GB  1100GB  ext4         primary
      
      (parted) rm 1
      (parted) mkpart primary 1049kB 100%
      (parted) print
      Model: Virtio Block Device (virtblk)
      Disk /dev/vdb: 3299GB
      Sector size (logical/physical): 512B/512B
      Partition Table: gpt
      Disk Flags:
      
      Number  Start   End     Size    File system  Name     Flags
       1      1049kB  3299GB  3299GB  ext4         primary
      
      (parted) quit
      Information: You may need to update /etc/fstab.

  3. 运行如下命令确认文件系统一致性。

    sudo fsck -f /dev/vdb1

    示例结果如下所示。

    [test@ecs-test-0001 ~]# sudo fsck -f /dev/vdb1
    fsck from util-linux 2.23.2
    e2fsck 1.43.5 (04-Aug-2017)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    /dev/vdb1: 11/67108864 files (0.0% non-contiguous), 4265369/268434944 blocks

  4. 扩容文件系统。

    • ext*文件系统(例如ext3和ext4)。
      1. 调整ext*文件系统大小。

        sudo resize2fs /dev/vdb1

      2. 分区挂载到“/mnt”。

        sudo mount /dev/vdb1 /mnt

    • xfs文件系统。
      1. 分区挂载到“/mnt”。

        sudo mount /dev/vdb1 /mnt

      2. 调整xfs文件系统大小。
        sudo xfs_growfs /mnt

        新版xfs_growfs根据挂载点识别待扩容设备,例如xfs_growfs /mnt。您可以运行xfs_growfs --help查看不同版本xfs_growfs的使用方法。

    • btrfs文件系统。
      1. 分区挂载到“/mnt”。

        sudo mount /dev/vdb1 /mnt

      2. 调整btrfs文件系统大小。

        sudo btrfs filesystem resize max /mnt

新增GPT分区

如果新增空间用于增加新的分区并希望使用GPT分区格式,按照如下步骤在实例中完成扩容。示例中数据盘“/dev/vdb”原有容量4.8TiB,只有一个分区“/dev/vdb1”。将数据盘容量扩大至32TiB,使用parted工具为新增的容量分配新的GPT分区“/dev/vdb2”。

  1. 运行如下命令查看数据盘中已有分区的信息。

    sudo fdisk -l

    示例结果如下所示。

    [test@ecs-test-0001 ~]# sudo fdisk -l
    Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000b1b45
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *        2048    83875364    41936658+  83  Linux
    WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
    
    Disk /dev/vdb: 35184.4 GB, 35184372088832 bytes, 68719476736 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: gpt
    Disk identifier: BCE92401-F427-45CC-8B0D-B30EDF279C2F
    
    #         Start          End    Size  Type            Name
     1         2048  10307921919    4.8T  Microsoft basic mnt                    

  2. 使用Parted工具创建新分区并分配容量。

    1. 运行如下命令进入Parted工具。

      sudo parted /dev/vdb

    2. 运行如下命令查看数据盘待分配的容量,记录已有分区的扇区位置和容量。

      print free

      示例中“/dev/vdb1”的起始位置为1049KB,结束扇区为5278GB,容量为5278GiB。

      (parted) print free
      Model: Virtio Block Device (virtblk)
      Disk /dev/vdb: 35.2TB
      Sector size (logical/physical): 512B/512B
      Partition Table: gpt
      Disk Flags:
      
      Number  Start   End     Size    File system  Name  Flags
              17.4kB  1049kB  1031kB  Free Space
       1      1049kB  5278GB  5278GB  ext4         mnt
              5278GB  35.2TB  29.9TB  Free Space                    
    3. 运行如下命令设置起始扇区和分配容量。以下以新建了一个名为“test”的“/dev/vdb2”分区,原分区的起始扇区为5278GB,且要将扩容后的总容量全部分配给该分区为例。

      mkpart test 5278GB 100%

    4. 运行如下命令查看容量(Size)是否发生变化。

      print

      示例结果如下所示。

      (parted) print
      Model: Virtio Block Device (virtblk)
      Disk /dev/vdb: 35.2TB
      Sector size (logical/physical): 512B/512B
      Partition Table: gpt
      Disk Flags:
      
      Number  Start   End     Size    File system  Name  Flags
       1      1049kB  5278GB  5278GB  ext4         mnt
       2      5278GB  35.2TB  29.9TB               test                    
    5. 退出Parted分区工具。

      quit

  3. 为新分区创建文件系统。

    • 创建ext4文件系统:

      sudo mkfs.ext4 /dev/vdb2

    • 创建ext3文件系统:

      sudo mkfs.ext3 /dev/vdb2

    • 创建xfs文件系统:

      sudo mkfs.xfs -f /dev/vdb2

    • 创建btrfs文件系统:

      sudo mkfs.btrfs /dev/vdb2

  4. 运行如下命令查看分区容量变化。

    sudo fdisk -l

    示例结果如下所示。

  5. 运行如下命令查看存储设备的文件系统类型。

    blkid

    示例结果如下所示。

  6. 挂载新分区。

    sudo mount /dev/vdb2 /mnt

扩容裸设备文件系统

当数据盘没有创建分区,并且在裸设备上创建了文件系统时,您可以通过如下步骤直接扩容文件系统。

  1. 运行如下命令查看存储设备的文件系统类型。

    df -Th

    回显中“Type”的值为文件系统类型。

  2. 根据不同的文件系统类型,执行如下不同的操作来扩容文件系统。

    • xfs文件系统

      执行xfs_growfs命令扩容文件系统。

      sudo xfs_growfs /mnt

      其中,“/mnt”为文件系统的挂载点。

      新版xfs_growfs根据挂载点识别待扩容设备,例如xfs_growfs /mnt。您可以运行xfs_growfs --help查看不同版本xfs_growfs的使用方法。

    • ext*和btrfs文件系统
      1. 查看数据盘挂载信息。

        mount | grep "/dev/vdb"

      2. 取消挂载数据盘。

        sudo umount /dev/vdb

      3. 查看操作结果。

        mount | grep "/dev/vdb"

        示例结果如下所示。

        [test@ecs-test-0001 ~]# mount | grep "/dev/vdb" 
        [test@ecs-test-0001 ~]# sudo umount /dev/vdb
        [test@ecs-test-0001 ~]# mount | grep "/dev/vdb"
      4. 扩容文件系统。
        • ext*文件系统:执行如下命令扩容文件系统。

          sudo resize2fs /dev/vdb

        • btrfs文件系统:执行btrfs命令扩容文件系统。

          sudo btrfs filesystem resize max /mnt

          其中,“/mnt”为文件系统的挂载点。

      5. 将云硬盘挂载至挂载点。

        sudo mount /dev/vdb /mnt

  3. 运行如下命令查看数据盘扩容结果。

    df -Th

    回显显示文件系统容量完成扩充,表示扩容成功。

相关文档