云计算场景经常遇到磁盘空间不足,当云平台分分钟对磁盘扩容完成,接下来就需要在操作系统层面对磁盘进行扩容,标准分区扩容大致分为两步:1、扩容分区表;2、扩容文件系统。
本文介绍两个常用的工具: growpart和 parted。
本文介绍两个常用的工具: growpart和 parted。
工具介绍
sgdisk
MBR分区格式不支持2 TiB以上的云盘。如果该云盘目前使用的是MBR分区类型,且希望将其扩容至2 TiB以上,需要先将分区类型从MBR转换为GPT。
sgdisk -g /dev/vdb *运行此命令,将MBR分区转换为GPT分区,/dev/vdb为设备名称
Linux转换分区过程中,正常情况下不会丢失原分区的数据。避免误操作导致数据丢失或异常,建议您提前备份云盘上的所有数据
resize2fs
调整ext2/ext3/ext4文件系统的大小
样例:resize2fs /dev/vdb1 5G 不指定大小默认使用整个分区大小进行扩容,/dev/vdb1为设备不是挂载点。
growpart
命令 | 选项 | 含义 |
---|---|---|
growpart | --dry-run | 仅测试不对分区进行操作 |
语法:growpart [OPTIONS] DISK PARTITION-NUMBER 例:growpart /dev/vdb 2 说明:占用剩余所有的空间重写分区表,可以对挂载中的设备进行扩容。 growpart:包名称***cloud-utils-growpart***,该包不在yum源里面,centos7下载地址 http://mirror.centos.org/centos/7/os/x86_64/Packages/cloud-utils-growpart-0.29-5.el7.noarch.rpm |
parted
命令 | 选项 | 含义 |
---|---|---|
parted | -l | 查看分区信息 |
-s | 不需要用户进行干预 | |
-m | 显示机器可解析输出 | |
语法:parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...] 例:growpart /dev/vdb 2 说明:不使用子命令直接运行交互式模式。 |
子命令
子命令 | 参数 | 含义 |
---|---|---|
help | [COMMAND] | 给出常规帮助或对应命令的帮助 |
mklabel | LABEL-TYPE | 创建分区表类型,常用参数为msdos(MBR分区)和gp(GPT分区) |
mkpart | PART-TYPE [FS-TYPE] START END | part-type:MBR为分区类型,GPT时为分区名字;fs-type:指定分区文件系统,但是不对分区格式化;start:分区开始位置;end:分区结束位置 |
name | NUMBER NAME | 修改分区名称,只对GPT分区起作用 |
[devices|free|list,all|NUMBER] | 查看分区信息 | |
rescue | START END | 修复丢失的分区 |
resizepart | START END | 修改分区大小,扩容缩容都可以 |
rm | NUMBER | 删除指定分区 |
select | DEVICE | 选择操作设备 |
unit | UNIT | 设置操作单位,可以是s,B,GB,%等 |
quit | / | 退出交互界面,parted操作是立即生效,不需要进行保存操作,请谨慎操作。 |
扩容最佳实践
扩容需谨慎,对数据要有畏惧之心!!!
growpart扩容
磁盘初始状态
[root@test-volume ~]# df -hT /dev/vdb1
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 xfs 5.6G 33M 5.6G 1% /mnt
[root@test-volume ~]# lsblk /dev/vdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb 253:16 0 10G 0 disk
└─vdb1 253:17 0 5.6G 0 part /mnt
[root@test-volume ~]#
使用growpart进行扩容分区
[root@test-volume ~]# growpart /dev/vdb 1
CHANGED: partition=1 start=2048 old: size=11716608 end=11718656 new: size=20969438 end=20971486
[root@test-volume ~]# lsblk /dev/vdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb 253:16 0 10G 0 disk
└─vdb1 253:17 0 10G 0 part /mnt
[root@test-volume ~]# df -hT /dev/vdb1
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 xfs 5.6G 33M 5.6G 1% /mnt
[root@test-volume ~]#
扩容文件系统,本例以xfs进行扩容
[root@test-volume ~]# xfs_growfs /mnt
meta-data=/dev/vdb1 isize=512 agcount=4, agsize=366144 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1464576, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 1464576 to 2621179
[root@test-volume ~]# df -hT /dev/vdb1
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 xfs 10G 33M 10G 1% /mnt
[root@test-volume ~]#
说明:growpart扩容分区会使用该分区后所有的磁盘空间,假如该分区后没有可用空间即不能扩容。一般会对对应磁盘的最后一个分区进行扩容。
growpart故障案例一
[root@centos7 ~]# growpart /dev/vdb 1
unexpected output in sfdisk --version [sfdisk??4? util-linux 2.23.2]
[root@centos7 ~]# echo $LANG #字符集异常导致
zh_CN.gb18030
[root@centos7 ~]# export LANG=en_US.UTF-8 #修改为中文字符集
[root@centos7 ~]# echo $LANG
en_US.UTF-8
[root@centos7 ~]# growpart /dev/vdb 1 #分区扩容成功
CHANGED: partition=1 start=2048 old: size=6127874048 end=6127876096 new: size=10422843358 end=10422845406
[root@centos7 ~]#
MBR分区转换为GPT分区
[root@disk-test sbin]# fdisk -l /dev/vdb
Disk /dev/vdb: 2147.5 GB, 2147483648000 bytes, 4194304000 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 dos表示为MBR分区,该分区为2T,需要修改为GPT分区才能进行扩容
Disk identifier: 0xc31b4065
Device Boot Start End Blocks Id System
/dev/vdb1 2048 4194303999 2097150976 83 Linux
[root@disk-test sbin]#
[root@disk-test sbin]# sgdisk -g /dev/vdb
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory.
***************************************************************
Warning! Secondary partition table overlaps the last partition by
33 blocks!
You will need to delete this partition or resize it in another utility.
Warning! Secondary partition table overlaps the last partition by
33 blocks! 此报错表示云盘尾部剩余空间不足33个扇区,没有足够的空间用于MBR转换GPT,先需要进行扩容。
You will need to delete this partition or resize it in another utility.
Aborting write of new partition table.
[root@disk-test sbin]#
对硬盘进行扩容后再执行分区转换命令
[root@disk-test sbin]# sgdisk -g /dev/vdb
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory.
***************************************************************
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully. MBR分区成功转换为GPT分区,新的分区表需要重启后生效
[root@disk-test sbin]# fdisk -l /dev/vdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
Disk /dev/vdb: 2148.6 GB, 2148557389824 bytes, 4196401152 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 表示现在分区表为gpt分区,后续扩容就可以超过2T了
Disk identifier: 7E8705EE-6836-45CC-9F43-8BB1FE088FD3
# Start End Size Type Name
1 2048 4194303999 2T Linux filesyste Linux filesystem
[root@disk-test sbin]#
parted扩容
分区初始状态
[root@test-volume ~]# df -hT /dev/vdb1
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 xfs 4.7G 33M 4.7G 1% /mnt
[root@test-volume ~]# lsblk /dev/vdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb 253:16 0 10G 0 disk
└─vdb1 253:17 0 4.7G 0 part /mnt
[root@test-volume ~]#
分区扩容
[root@test-volume ~]# umount /mnt 卸载分区
[root@test-volume ~]# parted /dev/vdb
GNU Parted 3.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 5000MB 4999MB xfs data
(parted) resizepart 1 100% 使用磁盘余下所有空间
(parted) quit
Information: You may need to update /etc/fstab.
[root@test-volume ~]# lsblk /dev/vdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb 253:16 0 10G 0 disk
└─vdb1 253:17 0 10G 0 part
[root@test-volume ~]# mount /dev/vdb1 /mnt 重新挂载分区
[root@test-volume ~]# df -hT /dev/vdb1
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 xfs 4.7G 33M 4.7G 1% /mnt
[root@test-volume ~]#
扩容文件系统,本例以xfs进行扩容
[root@test-volume ~]# xfs_growfs /mnt
meta-data=/dev/vdb1 isize=512 agcount=4, agsize=305088 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1220352, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 1220352 to 2621179
[root@test-volume ~]# df -hT /dev/vdb1
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 xfs 10G 33M 10G 1% /mnt
[root@test-volume ~]#