背景

生产系统的KVM虚拟机跑的CetnOS6.10因为当初部署的时候硬盘只分配了50G,系统也没有使用LVM进行分区管理,系统内指有一个EXT4的根分区,直接挂在所有的磁盘空间;现在空间不足需要对这台CentOS的磁盘进行扩容,业务限制只能在现有的/分区上进行扩容;

KVM磁盘状态:虚拟机磁盘容量50GB
LVM-disk.png

CentOS系统分区状态:sda共50G,/分区48G
CetnOS-disk.png

因此我的目标是:希望能实现直接在现有的非LVM管理的常规分区上实现数据无损的空间扩容;

找了一圈的资料后发现所有讲Linux分区扩容的方案都要么是通过LVM动态卷进行扩展,要么是将新增的磁盘容量作为第二个磁盘或分区额外mount到系统进行使用,这两种方式都不能满足我的需求;

差点就要放弃了,毕竟想要直接在现有分区上实现数据无损的空间扩容,涉及分区表的修改以及分区格式的问题,认为技术上可能还是非常有难度的,差点就要放弃了;不过追求完美的我最后还是找到了完美的解决方案,开始动手

KVM raw 磁盘空间扩容

KVM磁盘扩容相对比较容易,qemu-img命令可以通过resize选项对raw格式的虚拟磁盘镜像文件增或减小虚拟磁盘的容量,但对qcow2的格式时只能增加容量,不支持缩减容量;如果需要缩减必须先将磁盘格式从qcow2转换为raw之后才可以缩减;

使用如下指令对虚拟机的磁盘镜像文件,扩充100G空间(+为增加空间,-为缩减空间,单位支持KB,GB,MB)

#qemu-img resize NeoKylin417.qcow2 +100G

切记一定要将虚拟机关机后在对磁盘进行进行扩容操作,否则会有磁盘数据损坏风险

扩充后查看磁盘镜像信息,在KVM中显示此磁盘镜像的虚拟磁盘容量已经变成了150G
kvm-img-resize.png

CentOS 根分区无损扩展

KVM的磁盘镜像完成扩展后重开机该虚拟机,进入CentOS系统中用fdisklsblk命令就可以看到系统已经识别到扩容后的磁盘总容量了
rsize-Centos-disk.png

但此时扩充多出来的磁盘空间是属于未分配的剩余空间,并没有增加到任何的磁盘分区中;要把这些多出来的可用空间无损扩展到当前的/根分区中,就需要用到growpart这个工具;

安装growpart工具

#yum install -y epel-release
#yum install -y growpart

执行growpart指令对需要扩容的分区进行容量扩展操作,如下:

#growpart /dev/sda 2    //参数是要操作的磁盘代号,需要扩容的分区id
#reboot                 //要重启系统才能识别到新的分区大小

CentOS-growpart.png

重启系统后,直接执行lsblk可以看到/分区已经扩大了,但是df -lh看分区空间还是没有变
Centos-lsblk.png

此时只要使用resize2fs指令对之前growpart过的分区进行一次重新扫描识别就可以看到正确的分区容量了,如下:
CentOS-resize-root.png

友情提示

注意:本次在CentOS中扩容的/分区是这块磁盘上的最后一个分区,也就是磁盘扩展后增加的空间是加在附加在磁盘的最后的,所以可以通过growpart工具修改硬盘的分区表,将这部分空间直接append到最后一个分区(也就是我这里原本/分区的后面了)所以如果你要扩容的分区在你的系统上,并非是磁盘上的最后一个分区的话,可能无法直接无损扩充分区;请谨慎使用此方法进行操作,发生数据损坏或丢失概不负责!!

Last modification:March 10, 2019
如果觉得我的文章对你有用,请随意赞赏