EXT4根文件系统resize

警告

本案例能够直接不卸载根文件系统,直接通过fdisk命令修改/dev/vda3分区大小,然后resize2fs修改EXT4文件系统大小,原因是因为该磁盘恰好只分配了/dev/sda3,磁盘后续都是连续空白。

通常情况下,对于EXT4文件系统的底层分区,最好是建立在LVM上,这样才能灵活调整磁盘分区大小。请参考 扩展LVM

如果没有使用LVM,直接通过 fdisk 修改磁盘分区大小,务必要确保分区起始扇区和原先一致,且扩展后的扇区范围没有覆盖其他分区,否则会导致数据丢失。

#fdisk -l /dev/vda

Disk /dev/vda: 128.8 GB, 128849018880 bytes, 251658240 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: 0x000cb9dd

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     6293503     2097152   82  Linux swap / Solaris
/dev/vda3         6293504   125829119    59767808   83  Linux  <= 注意:这里vda3没有完全分配完磁盘空间,并且没有后续的vda4,所以才能通过fdisk修改分区大小

操作

  • 先删除分许vda3然后重新添加vda3分区,注意分区起始扇区和原先相同,结束扇区则增大,以便能够使用更多磁盘空间:

  • 刷新内核对磁盘分区的识别

注意,由于是修改正挂载的磁盘分区,所以需要通过 partprobe 或者 kpartx 来通知重新识别。

不过,partprobe方式并不能使得内核识别正在使用的根磁盘分区:

检查磁盘分区在内核中信息

显示如下

可以看到并没有更新成最新的vda3磁盘分区扇区信息。

kpartx是针对Multipath设备,不能使用:

partx设备是针对local设备,注意,不要使用-v -a参数,因为不是添加磁盘分区:

而是应该参考 Does RHEL 7 support online resize of disk partitions? 使用 partx-u 参数表示更新:

此时没有任何输出信息,实际已经更新完成。

再次检查分区大小信息,可以看到已经更新:

  • 原因解释

    • RHEL7内核包含了从block: add partition resize function to blkpg ioctl的BLKPG ioctl的修改来支持BLKPG_RESIZE_PARTITION操作。

    • 当前RHEL7的util-linux工具包包含的partxresizepart程序是唯一支持BLKPG_RESIZE_PARTITION的BLKPG ioctl操作的用户端命令。

  • 检查磁盘

  • 扩展EXT4文件系统

resize2fs命令支持ext2/ext3/ext4文件系统重定义大小。如果文件系统是umount状态,则可以通过resize2fs工具扩展或收缩文件系统。如果文件系统是mount状态,则只支持扩展文件系统。注意:要在线扩展文件系统,需要内核和文件系统都支持on-line resize。(现代Linux发行版使用的内核 2.6 可以支持在线resize挂载状态的ext3和ext4;其中,ext3文件系统需要使用resize_inode特性)

现在我们检查一下当前挂载的/dev/vda3磁盘文件系统,挂载为/分区,当前大小是56G:

执行以下命令扩展文件系统(默认扩展成分区大小,也可以指定文件系统大小)

显示输出

再次检查挂载的/分区,可以看到空间已经扩展到116G

此时就可以毫无障碍地使用扩展过的根文件系统。

  • 强制系统重启进行fsck

RHEL 6等早期使用SysVinit和Debian使用Upstart早期版本,都支持在根分区的文件系统上/forcefsck文件来激活强制对根文件系统进行fsck,这是通过/etc/rc.sysinit脚本来实现的

这样系统重启会强制进行fack

不过,在systemd系统中,需要通过systemd-fsck 服务来设置 systemd-fsck@.service

参考 archliux - fsck 使用以下命令检查分区设置的fsck检查频率(默认是每30次启动会做一次fsck,不过,当前文件系统设置了 -1 强制不检查,或者设置0也是不检查)

修改检查/dev/vda3频率,设置成1,则每次重启都会检查:

显示

此时验证文件系统可以看到

现在我们重启操作系统,从VNC终端检查虚拟机可以看到虚拟机启动时进行了文件系统fsck。

既然已经做过fsck了,我们现在恢复原先默认关闭fsck的设置

参考

Last updated

Was this helpful?