当我们的服务器运行过程中,如果数据盘容量不能满足我们的数据存储;我们需要增加数据盘的数量或者对数据盘进行扩容。增加数据盘的数量进行扩容操作很简单,不涉及到硬盘分区的操作。我们在这里仅讨论困难的数据盘扩容文件系统。

磁盘分区扩容场景说明

正常情况我们对服务器上的数据盘创建唯一的主分区,用于数据存储。
在物理服务器上我们不会碰到单块数据盘扩容的情况;因为我们没有办法对一块容量固定的硬盘扩容。所以我们讨论的场景是虚拟化的云服务器上。

场景假设

数据盘只有一个主分区(/dev/vdb1,ext4文件系统),挂载在/www目录下。计划扩展为1099GB。

操作说明-简单版(如果执行不顺利请看复杂版)

1、运行 umount 命令卸载主分区。
umount /dev/vdb1

2、使用 fdisk 命令删除原来的分区并创建新分区:
a、运行命令 fdisk -l 罗列分区信息并记录扩容前数据盘的最终容量、起始扇区(First sector)位置
b、运行命令 fdisk [数据盘设备名] 进入 fdisk 界面。本示例中,命令为 fdisk /dev/vdb
c、输入 d 并按回车键,删除原来的分区。
d、输入 n 并按回车键,开始创建新的分区。
e、输入 p 并按回车键,选择创建主分区。因为创建的是一个单分区数据盘,所以只需要创建主分区。
f、输入分区编号并按回车键。因为这里仅创建一个分区,所以输入 1。
g、输入第一个可用的扇区编号:为了保证数据的一致性,First sector需要与原来的分区保持一致。
h、输入最后一个扇区编号:因为这里仅创建一个分区,所以按回车键采用默认值。
i、输入 wq 并按回车键,开始分区。

3、检查文件系统,并变更文件系统大小。
e2fsck -f /dev/vdb1 # 检查文件系统
resize2fs /dev/vdb1 # 变更文件系统大小

4、挂载
mount /dev/vdb1 /www

操作说明-复杂版

简单版操作过程中,可能报错无法继续执行。情况如下
文件检查过程中报错:Bad magic number in super-block while trying to open /dev/vdb1
[root@aliyunsrv ~]# e2fsck -f /dev/vdb1
e2fsck 1.41.12 (17-May-2010)
e2fsck: Superblock invalid, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/vdb1
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193

错误信息提示没有找到super-block,即分区起始位置有问题。
我们使用fdisk -l 查看分区信息,其中分区的起始位置为103;说明硬盘扩容存在一些问题。
因为我们最初对硬盘分区时,分区的起始位置一般都是1;而现在发现不是1,则是扩容操作导致了分区的起始位置变动。完善的硬盘扩容服务,应该从硬盘后面的进行扩展,不应该变动硬盘起始位置的数据。
重点:需要记好分区的起始位置

详细操作

1、使用parted编辑磁盘表
parted /dev/vdb

2、删除错误的分区
(parted) rm 1

3、恢复正常的分区
(parted) unit s #选择磁盘大小的表示单位,(s:扇区;KB\MB\GB\TB;%百分比;cyl:柱面...)
(parted) rescue 103 1099GB             # 恢复分区表
Information: A ext4 primary partition was found at 2048s -> 1048575999s. Do you want to add it
to the partition table?            # 找到了ext4格式的分区,起始扇区定位到2048,结束扇区是1048575999
Yes/No/Cancel? y                # 是否要创建该分区表,也就是恢复旧的分区表    
(parted) p                       
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 2147483648s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 2048s 1048575999s 1048573952s primary ext4    # 可以看到这个是正确的磁盘分区表
(parted) q
Information: You may need to update /etc/fstab.

4、重新创建新的分区表
注意的是parted工具里END的值,由于磁盘的扇区数量不容易确定,可以使用容量来替代

重新打开后发现分区表的显示格式有变化,但并不影响,同时也可以看出来是以前的分区表(未扩容前)
root@aliyunsrv ~]# parted /dev/vdb
GNU Parted 2.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1100GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 537GB 537GB primary ext4

删除旧的分区表
(parted) rm 1
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1100GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags

创建新的分区表,注意要使用前文获取的扇区起始位置2048
(parted) unit s
(parted) mkpart primary ext4 2048 1099GB
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 2147483648s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 2048s 2146484223s 2146482176s primary ext4

完成退出
(parted) q
Information: You may need to update /etc/fstab.

3、检查文件系统,并变更文件系统大小。
e2fsck -f /dev/vdb1 # 检查文件系统
resize2fs /dev/vdb1 # 变更文件系统大小

4、挂载
mount /dev/vdb1 /www