Linux 动态扩容

警告
本文最后更新于 2023-10-22,文中内容可能已过时。

Linux 动态扩容

在使用 Linux 系统的时候,经常会面临根分区磁盘写满的情况,此时,我们就需要对根分区进行扩容,常规的做法是,额外加一块硬盘,然后创建分区,格式化之后挂载到指定的目录下面,然后我们就可以将比较占空间的文件,比如数据库应用的数据文件移动到此目录下,但是这样的话,服务器上的应用可能就需要停机,然后复制文件或者修改配置(比如数据文件的位置),对于不能接收服务暂停的场景,这样做法就很不方便,此时,我们可以考虑磁盘的动态扩容。

分区类型为 LVM 的动态扩容

LVM 技术 - Logical volume Manager

基本原理,网上已经有很多文章讲解,其中我觉得这一篇Linux 系统 LVM 逻辑卷工作原理,必看讲得很透彻,直接去看这个即可。

LVM 的原理本质上就是在文件系统和物理磁盘上增加了一层逻辑层,通过这个逻辑层,我们可以实现动态地增加磁盘,也就是扩容。

基本概念如下:

  • PV 就是建立在物理磁盘和磁盘分区之上一个层,它可以把磁盘的分区或 Raid 阵列创建为 PV 层,只有创建为 PV 后才可以作为 LVM 的基础使用。

  • VG 是将单个或多个 PV 组成的一个卷组,卷组共享这些 PV 的总空间,一个 VG 对于 LVM 来说就相当于一块虚拟的磁盘,只是这个磁盘我们可以通过调整参与的 PV 灵活的调整整个 VG 的可用空间,这是 LVM 的核心特点。

  • LV 相当于在 VG 之上真正创建出来的分区,这个分区最终挂载到文件系统中来直接使用。

实践

参考文档:

Linux 扩容 / 根分区 (LVM+ 非 LVM)

VMware 虚拟机 Linux 动态扩容磁盘空间

开始实践:

我们先保证分区的类型已经是 LVM,具体做法,请看《VMware 在安装 Centos7 时的注意点.md》的是一开始就选择安装程序光盘映射文件(iso),还是选择稍后安装操作系统小节

首先我们看一下扩容之前,dev/sda1占了 1G,dev/sda2总共只有 19G,根分区只有 17G

关闭 Linux(这里是 Centos)并在 VMware WorkStation 中为此虚拟机进行磁盘扩展,扩展到 30G

此时 VMware WorkStation 也会提示你,需要在在 Linux 操作系统内部对磁盘进行分区并拓展文件系统才能使用,不是说你直接扩展了磁盘就一步到位了

启动 Linux 系统,观察到dev/sda的磁盘容量已经到了 30G

dev/sda中增加的空间创建磁盘分区:

1
fdisk /dev/sda

然后输入 m、n、p、回车、回车、回车、w

这个时候,最好注意一下通过 df -HT 查看一下新建的分区的类型,如果不是 xfs,则需要格式化为 XFS

可以看到已经增加了dev/sda3这个分区,不过目前通过lsblk命令还是看不到这个分区的:

我们需要刷新一下这个磁盘的信息,然后就可以看的到dev/sda3

1
partprobe /dev/sda

分区创建完毕,我们开始 LVM 相关的操作

首先是将这个磁盘分区添加到物理卷中,我们先看下当前有哪些物理卷:

1
pvdisplay

然后创建一个以dev/sda3为基础的物理卷,然后再看有多少物理卷

1
pvcreate /dev/sda3

可以看新添加了一个物理卷,就叫dev/sda3,空间大小为 10G,Allocatable 是 No,那是因为这个 pv 还没添加到卷组中,我们接下来就将其添加到卷组中,不过我们先看下当前有哪些卷组

1
vgdisplay

可以看到当前系统中只有一个卷组,叫centos,这个卷组是我们在安装 Linux 系统的时候,系统自动创建的

具体细节,请看《VMware 在安装 Centos7 时的注意点.md》的手动配置分区小节

现在,我们将名字为dev/sda3的卷组添加到名字为centos的卷组中:

1
vgextend centos /dev/sda3

然后,我们就可以为逻辑卷扩容了,比如根分区。我们先看下系统中有哪些逻辑卷,以及他们的内存使用情况

1
lvdisplay

可以看到系统中有两个逻辑卷,一个叫swap,一个叫root,这两个逻辑卷是我们在安装 Linux 系统的时候创建的

具体细节,请看《VMware 在安装 Centos7 时的注意点.md》的手动配置分区小节

现在,我们开始拓展 root 这个逻辑卷,将 centos 这个 vg 中剩余的空间,全部都加给 root 逻辑卷

1
lvextend -l +100%FREE /dev/centos/root

然后刷新一下 root 这个逻辑卷

其实刷新根分区之前,根分区就已经成功扩容了,不过保险起见,还是执行以下此命令,主要是为了df命令的结果的准确

1
xfs_growfs /dev/centos/root

再次查看分区信息,可以看到根分区的大小,已经从 17G 增加到了现在的 27G,根分区的动态扩容完成

1
lsblk

有时候也会为/home专门配置一个逻辑卷,就叫 home

分区类型为标准分区的动态扩容

标准分区,就是指,一个分区对应着一个物理上的磁盘分区,与之对比的是 LVM 类型的分区,LVM 类型的分区实际上是一个逻辑卷

一般情况下,一个磁盘被分为分为多个物理分区,然后格式化后挂载到指定目录,比如磁盘dev/sda被分为两个分区dev/sda1dev/sda1dev/sda的大小是固定的,dev/sda1占用 0-1023,dev/sda2占用 1024-2047,那么用完了就用完了,无法变出空间来,如果要增加空间,只能额外增加磁盘比如dev/sdb。但是在 VMware WorkStation 中安装的虚拟机是个例外,在虚拟机中,我们可以扩展分配给虚拟机磁盘的空间,也就是说,我们可以扩展dev/sda的空间,比如从 2048 扩展到 3072,即便如此,也只有dev/sda2可以动态扩容,因为 1024-2047 的空间已经被使用写入了数据,dev/sda1要扩展的话就会覆盖这些数据造成数据丢失,但是 2048-3071 的空间是刚加的,空白的,因此,dev/sda2可以扩展并占用这些控件,达到动态扩容的目的。

实际上不是如此,磁盘的前 0-2047 个字节是保留空间,保存数据的空间从 2048 开始

默认请看下,根分区符合上述条件,因为一般情况下,我们会将第三个分区分配给根分区(前两个是 boot 分区和 swap 分区),所以我们可以对根分区进行动态扩容,即便如此,对物理分区进行动态扩容也是非常危险的操作,一定要做好备份,出现问题,随时回滚

实践

参考文档:

Linux 扩容 / 根分区 (LVM+ 非 LVM)

我们先保证分区的类型已经是标准分区,具体做法,请看《VMware 在安装 Centos7 时的注意点.md》的是一开始就选择安装程序光盘映射文件(iso),还是选择稍后安装操作系统小节

让我们开始实践:

开始之间,简单查看一下系统的分区情况,可以看到磁盘dev/sda的总大小是 30G

现在我们对其进行扩展,首先关闭虚拟机,在 VMware Workstation 中进行对其硬盘空间进行扩展,扩展到 35G

启动虚拟机,查看分区信息,可以看到磁盘dev/sda的总大小变成了 35G

接下来,我们开始操作分区信息,首先先查看一下当前的分区情况:

然后我们开始操作根分区,命令有点多,我们简单梳理以下步骤:

  1. 删除根分区,但是不要写入磁盘(即输入 w)

  2. 创建新的分区,新的分区的起点必须是删除的根分区的起点(默认就会是一样的,但是要非常注意)

  3. 写入磁盘(即输入 w)

分区操作完成,刷新一下分区信息并再次查看分区信息

1
partprobe /dev/sda

可以看到根分区已经从 26.7G 扩展到了 31.5G。但是,通过df命令查看磁盘大小,依然是不对的

我们再刷新根分区并查看状态,这里先看自己的文件系统是 xfs,还是 ext4,再判断使用 resize2fs 或 xfs_growfs 对挂载目录在线扩容:

  • resize2fs 针对文件系统 ext2 ext3 ext4
  • xfs_growfs 针对文件系统 xfs

我本地是 xfs

1
xfs_growfs /dev/sda3

再看df结果就是正确的了

总结

做法是直接在 fdisk 中删除根分区,然后不同步到磁盘,再创建分区,此时会将新增加的空间包含进去,重点就是这个,很简单,简而言之就是直接拓展磁盘中某个分区的空间。

重点是,要记住此分区起始位置,我们再创建一个新的分区的时候,需要保证其实位置相同,否则就 GG 了,这也是此操作的风险所在,我们在进行此操作的时候,需要将系统上所有正在使用根分区的服务或者操作全部停掉,最好是关掉服务开机自启之后,重启 Linux 系统之后再操作。

进行此操作之前一定要对系统进行备份

一般情况下,我们删除一个分区之后立即创建一个新的分区时,分区的起始位置应该跟刚刚删除的分区的其实位置是一样的,这里注意一下即可。

注意点

如果在安装 Linux(主要是 Centos)系统的时候在进行分区的时候没有指定分区的设备类型是 LVM,那么后续的将无法已经使用的磁盘分区改成 LVM 类型,用户只能再挂一块没有使用的硬盘并选择用 LVM 来管理(将其创建为 pv)。而我们经常会遇到根分区大小不够的情况,因此建议在安装 Linux 系统的时候,将根分区的设备类型设置为 LVM,方便后续的动态扩容。

Linux 安装过程中默认的分区,就是采用的 LVM 的设备类型。在实际工作中也尽量使用 LVM 逻辑卷的方式进行分区

关于如何在安装 Linux 的时候指定根分区的设备类型为 LVM,请看《VMware 在安装 Centos7 时的注意点.md》

0%