CentOS 7 根分区免重启在线扩容

0

之前有写过一篇在 Ubuntu 环境扩容根分区的文章(见 Ubuntu 18.04 磁盘根目录在线扩容 & 修改分区 inode 数量 ),这次又来 CentOS 7 下扩容。CentOS 算是我接触最早的 Linux 系统了,那时候还是小打小闹地在搬瓦工的廉价 VPS 上搞些有的没的。再后来,在阿里云的学生机上,也是用的 CentOS,跑了不少业务,比如博客、加速器、MC 服务器、饥荒服务器……等等。这个系统一直用到现在,安装的 Nginx 也依然承载着我服务器上所有的 HTTP(S) 流量,只是它已经被整体迁移到了我托管的独服上。由于采用了整体镜像的方式,迁移也把阿里云抠门的 40G 云盘尺寸带了过来。现在空间吃紧,是时候进行扩容了。

数据无价!对磁盘进行任何操作前,请务必做好备份!


在开始之前先说点有点没的:其实 CentOS 的扩容思路和 Ubuntu 几乎完全一样,但可能是 MBR 分区表的原因,可用空间并不能被直接合并进已存在的分区中,需要用一点取巧的办法。

操作环境:Proxmox VE 虚拟化 / CentOS 7 / MBR 分区表 / ext4 分区

1. 增大物理磁盘容量

这部分没什么好说的,虚拟机就在设置里改,云平台就在对应的平台修改。修改好之后 CentOS 应该就可以直接识别到新的容量了。

先用  df -Th 命令查看当前分区信息,可见位于根分区 40G 空间即将用尽。再执行  lsblk 可见系统已识别到磁盘总大小为扩容后的 64G。

记住磁盘名称(这里为 sda,即 /dev/sda)和分区名称(这里为 sda1,即 /dev/sda1),后面用得到。


2. 重建分区以合并可用空间

其实 CentOS 7 的 cfdisk 具有扩容功能,但似乎由于 MBR 的限制,使用时会提醒无法扩容。这里直接用 fdisk 操作,个人感觉比 cfdisk 操作反而便捷一些。

执行  fdisk /dev/sda 打开目标磁盘,然后执行 p 查看分区,本例中仅有一个分区,所以不需要额外选择。记好这里显示的“Start”参数,非常重要,直接决定扩容后的分区能否正常读取。
取巧的部分来了:我们需要先删除分区,再建立容量更大的新分区。由于仅对分区表操作并不会影响数据,所以实际上可以实现“动态在线扩容”。删除分区的命令是 d 。

接下来就是新建分区,执行 n 命令。根分区一般都是主分区,直接回车保持默认即可。分区号默认为 1 也没问题。请注意 First sector 参数,填写与之前“Start” 项显示相同的数值,这里是 2048。Last sector 默认是磁盘最后一个扇区,也就是扩容到与磁盘相同大小,根据需要输入即可。
此时所有更改尚未保存,可以有充足的时间检查所有步骤是否正确。如果确认正确无误,执行 w 将更改写入到磁盘。
由于是在线扩容,而且尚有业务在运行,所以会产生一条警告,告知我们内核仍然在使用旧的分区表。


3. 在线刷新内核分区表

非常简单,只需要执行警告中建议的 partprobe 命令即可。
此时再执行  lsblk 可见分区也为扩容后的 64G,但执行  df -Th 命令查看文件系统记录的分区大小仍未改变。


4. 扩容文件系统

还是用老朋友 resize2fs。执行以下命令,在线扩容 /dev/sda1 分区:

resize2fs -p /dev/sda1

此时执行  df -Th 命令查看分区大小,已经扩容成功。


5. 磁盘查错

由于方法比较取巧,为了避免可能出现的问题,还需要对磁盘进行错误扫描,确保数据安全:

badblocks -s -v /dev/sda

检查完成,没有发现错误,扩容成功。