离线扩容分区和文件系统(Linux数据盘)
部分老旧版本的Linux操作系统,无法使用一些在线工具(如 growpart, resize2fs)对处于挂载(mount)状态的云硬盘进行扩容。为了解决上述问题,可采用离线扩容方式,即先将云硬盘从原实例卸载(umount),再扩容。本文主要介绍如何离线扩容Linux数据盘。
前提条件
- 已通过管理控制台扩容云硬盘容量,并已挂载至云服务器,请参见步骤一:扩容云硬盘容量。
- 已通过CBR或快照功能备份数据,防止误操作造成数据丢失,使用CBR备份请参见备份云硬盘,使用快照备份请参见创建云硬盘快照。
- 已登录云服务器。
确认分区表格式和文件系统
- 确认分区表格式和文件系统。
- 运行如下命令确认数据盘的分区表格式。
本示例以数据盘“/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分区表格式。
- 运行如下命令确认当前分区的文件系统类型。
[test@ecs-test-0001 ~]# blkid /dev/vdb1 /dev/vdb1: UUID="b9a07b7b-9322-4e05-ab9b-14b8050cd8cc" TYPE="ext4"
“TYPE”的值表示当前分区的文件系统类型。
- 运行如下命令确认数据盘的分区表格式。
- 确认文件系统的状态是否正常。
如果文件系统状态不正常,请排查修复后再进行之后的操作。
表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”时,表示文件系统状态正常。
- 选择扩容分区或文件系统的方式
根据您查询到的分区格式和文件系统情况确定操作选项。
扩容场景
相关操作
数据盘已分区并创建文件系统
全新数据盘,未分区,未创建文件系统
在控制台扩容数据盘空间后,请参见初始化数据盘。
数据盘是裸设备,已创建文件系统,未分区
在控制台扩容数据盘空间后,请参见扩容裸设备文件系统。
数据盘未挂载到实例上
挂载数据盘到实例后,请参见本文档的操作步骤完成扩容。
- MBR分区支持的磁盘最大容量为2TiB,超过2TiB的部分无法使用。为避免造成数据丢失,建议您创建一块大于2TiB的云硬盘,格式化一个GPT分区,再将MBR分区中的数据拷贝到GPT分区中。
- 当出现因扩容格式化工具问题导致的扩容失败时,您可以提前升级工具版本,或者卸载工具后重新安装。
扩大已有MBR分区
为了防止数据丢失,不建议对已挂载的分区和文件系统直接进行扩容操作。请先将分区取消挂载(umount),完成扩容操作并确认无误后,再重新挂载(mount)。针对不同的Linux内核版本,推荐如下操作方式:
- 实例内核版本小于3.6:先取消挂载该分区,再修改分区表,最后扩容文件系统。
- 实例内核版本大于等于3.6:先修改对应分区表,再通知内核更新分区表,最后扩容文件系统。
- 修改分区表。
- 运行如下命令查看分区信息,并记录旧分区的起始(Start)和结束(End)的扇区位置。
[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。
- 查看数据盘的挂载路径,根据返回的文件路径卸载分区,直至完全卸载已挂载的分区。
- 查看数据盘挂载信息。
- 取消挂载数据盘。
- 查看操作结果。
示例结果如下所示。
[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"
- 使用fdisk工具删除旧分区。
此操作可能造成数据丢失,建议提前进行备份操作。
sudo fdisk -u /dev/vdb
- 输入“p”,按“Enter”,打印分区表信息。
- 输入“d”,按“Enter”,删除当前分区表。
- 输入“p”,按“Enter”,确认已删除当前分区。
- 输入“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.
- 使用fdisk命令新建分区。
- 输入“p”,按“Enter”,打印分区表信息。
- 输入“n”,按“Enter”,新建分区。
- 输入“p”,按“Enter”,选择分区类型为主分区。
- 输入“1”,按“Enter”,选择主分区编号。此处以选择“1”为例。
- 此处以选择默认起始磁柱值为例,按“Enter”。
- 此处以选择默认截止磁柱值为例,按“Enter”。
- 输入“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.
- 执行如下任一命令通知内核读取数据盘的分区表。
- sudo partprobe /dev/vdb
- sudo partprobe /dev/vdb1
- 运行如下命令查看数据盘信息,确保分区表添加成功。
- 运行如下命令再次检查文件系统,确认扩容分区后的文件系统状态为“clean”。
如果运行命令后文件系统状态不显示为“clean”,请尝试使用sudo e2fsck -n /dev/vdb1检查。
- 运行如下命令查看分区信息,并记录旧分区的起始(Start)和结束(End)的扇区位置。
- 扩容文件系统。
新增MBR分区
如果新增空间用于增加新的MBR分区,按照如下步骤在实例中完成扩容:
- 运行如下命令新建分区。
sudo fdisk -u /dev/vdb
- 输入“p”,按“Enter”,打印分区表信息。
- 输入“n”,按“Enter”,新建分区。
- 输入“p”,按“Enter”,选择分区类型为主分区。
- 输入“2”,按“Enter”,选择主分区编号。此处以选择“2”为例。
- 此处以选择默认起始磁柱值为例,按“Enter”。
- 此处以选择默认截止磁柱值为例,按“Enter”。
- 输入“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.
- 运行如下命令查看分区。
lsblk /dev/vdb
- 运行如下命令创建文件系统。
- 运行如下命令查看文件系统信息。
blkid /dev/vdb2
[test@ecs-test-0001 ~]# blkid /dev/vdb2/dev/vdb2: UUID="0b3040e2-1367-4abb-841d-ddb0b92693df" TYPE="ext4"
- 运行如下命令挂载分区。
sudo mount /dev/vdb2 /mnt
- 运行如下命令查看目前数据盘空间和使用情况。
df -h
显示新建文件系统的信息,表示挂载成功。
扩大已有GPT分区
如果新增空间用于扩容已有的GPT分区,按照如下步骤在实例中完成扩容:
- 查看数据盘的挂载路径,根据返回的文件路径卸载分区,直至完全卸载已挂载的分区。
查看挂载(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"
- 使用Parted工具为现有GPT分区分配容量。
- 运行如下命令进入Parted分区工具。
如需查看Parted工具使用说明,运行help命令。
- 运行如下命令查看分区信息,并记录现有分区的分区号和起始扇区的值。
若界面提示Fix/Ignore/Cancel?和Fix/Ignore?,均输入“Fix”即可。
- 运行如下命令删除现有分区,以下以删除分区号为“1”为例。
- 运行如下命令重新创建主分区。以下以原分区的起始扇区为1049kB,且要将扩容后的总容量全部分配给该分区为例。
- 运行如下命令查看新分区是否创建成功。
- 退出Parted分区工具。
如下示例为使用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.
- 运行如下命令进入Parted分区工具。
- 运行如下命令确认文件系统一致性。
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
- 扩容文件系统。
新增GPT分区
如果新增空间用于增加新的分区并希望使用GPT分区格式,按照如下步骤在实例中完成扩容。示例中数据盘“/dev/vdb”原有容量4.8TiB,只有一个分区“/dev/vdb1”。将数据盘容量扩大至32TiB,使用parted工具为新增的容量分配新的GPT分区“/dev/vdb2”。
- 运行如下命令查看数据盘中已有分区的信息。
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
- 使用Parted工具创建新分区并分配容量。
- 运行如下命令进入Parted工具。
- 运行如下命令查看数据盘待分配的容量,记录已有分区的扇区位置和容量。
示例中“/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
- 运行如下命令设置起始扇区和分配容量。以下以新建了一个名为“test”的“/dev/vdb2”分区,原分区的起始扇区为5278GB,且要将扩容后的总容量全部分配给该分区为例。
- 运行如下命令查看容量(Size)是否发生变化。
示例结果如下所示。
(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
- 退出Parted分区工具。
- 为新分区创建文件系统。
- 运行如下命令查看分区容量变化。
sudo fdisk -l
示例结果如下所示。
- 运行如下命令查看存储设备的文件系统类型。
blkid
示例结果如下所示。
- 挂载新分区。
sudo mount /dev/vdb2 /mnt
扩容裸设备文件系统
当数据盘没有创建分区,并且在裸设备上创建了文件系统时,您可以通过如下步骤直接扩容文件系统。
- 运行如下命令查看存储设备的文件系统类型。
df -Th
回显中“Type”的值为文件系统类型。
- 根据不同的文件系统类型,执行如下不同的操作来扩容文件系统。
- xfs文件系统
sudo xfs_growfs /mnt
其中,“/mnt”为文件系统的挂载点。
新版xfs_growfs根据挂载点识别待扩容设备,例如xfs_growfs /mnt。您可以运行xfs_growfs --help查看不同版本xfs_growfs的使用方法。
- ext*和btrfs文件系统
- 查看数据盘挂载信息。
- 取消挂载数据盘。
- 查看操作结果。
示例结果如下所示。
[test@ecs-test-0001 ~]# mount | grep "/dev/vdb" [test@ecs-test-0001 ~]# sudo umount /dev/vdb [test@ecs-test-0001 ~]# mount | grep "/dev/vdb"
- 扩容文件系统。
- 将云硬盘挂载至挂载点。
- xfs文件系统
- 运行如下命令查看数据盘扩容结果。
df -Th
回显显示文件系统容量完成扩充,表示扩容成功。