Linux 动态扩容
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 之上真正创建出来的分区,这个分区最终挂载到文件系统中来直接使用。
实践
参考文档:
开始实践:
我们先保证分区的类型已经是 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
中增加的空间创建磁盘分区:
|
|
然后输入 m、n、p、回车、回车、回车、w
这个时候,最好注意一下通过 df -HT 查看一下新建的分区的类型,如果不是 xfs,则需要格式化为 XFS
可以看到已经增加了dev/sda3
这个分区,不过目前通过lsblk
命令还是看不到这个分区的:
我们需要刷新一下这个磁盘的信息,然后就可以看的到dev/sda3
了
|
|
分区创建完毕,我们开始 LVM 相关的操作
首先是将这个磁盘分区添加到物理卷中,我们先看下当前有哪些物理卷:
|
|
然后创建一个以dev/sda3
为基础的物理卷,然后再看有多少物理卷
|
|
可以看新添加了一个物理卷,就叫dev/sda3
,空间大小为 10G,Allocatable 是 No,那是因为这个 pv 还没添加到卷组中,我们接下来就将其添加到卷组中,不过我们先看下当前有哪些卷组
|
|
可以看到当前系统中只有一个卷组,叫centos
,这个卷组是我们在安装 Linux 系统的时候,系统自动创建的
具体细节,请看《VMware 在安装 Centos7 时的注意点.md》的
手动配置分区
小节
现在,我们将名字为dev/sda3
的卷组添加到名字为centos
的卷组中:
|
|
然后,我们就可以为逻辑卷扩容了,比如根分区。我们先看下系统中有哪些逻辑卷,以及他们的内存使用情况
|
|
可以看到系统中有两个逻辑卷,一个叫swap
,一个叫root
,这两个逻辑卷是我们在安装 Linux 系统的时候创建的
具体细节,请看《VMware 在安装 Centos7 时的注意点.md》的
手动配置分区
小节
现在,我们开始拓展 root 这个逻辑卷,将 centos 这个 vg 中剩余的空间,全部都加给 root 逻辑卷
|
|
然后刷新一下 root 这个逻辑卷
其实刷新根分区之前,根分区就已经成功扩容了,不过保险起见,还是执行以下此命令,主要是为了
df
命令的结果的准确
|
|
再次查看分区信息,可以看到根分区的大小,已经从 17G 增加到了现在的 27G,根分区的动态扩容完成
|
|
有时候也会为/home
专门配置一个逻辑卷,就叫 home
分区类型为标准分区的动态扩容
标准分区,就是指,一个分区对应着一个物理上的磁盘分区,与之对比的是 LVM 类型的分区,LVM 类型的分区实际上是一个逻辑卷
一般情况下,一个磁盘被分为分为多个物理分区,然后格式化后挂载到指定目录,比如磁盘dev/sda
被分为两个分区dev/sda1
、dev/sda1
,dev/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 分区),所以我们可以对根分区进行动态扩容,即便如此,对物理分区进行动态扩容也是非常危险的操作,一定要做好备份,出现问题,随时回滚。
实践
参考文档:
我们先保证分区的类型已经是标准分区,具体做法,请看《VMware 在安装 Centos7 时的注意点.md》的是一开始就选择安装程序光盘映射文件(iso),还是选择稍后安装操作系统
小节
让我们开始实践:
开始之间,简单查看一下系统的分区情况,可以看到磁盘dev/sda
的总大小是 30G
现在我们对其进行扩展,首先关闭虚拟机,在 VMware Workstation 中进行对其硬盘空间进行扩展,扩展到 35G
启动虚拟机,查看分区信息,可以看到磁盘dev/sda
的总大小变成了 35G
接下来,我们开始操作分区信息,首先先查看一下当前的分区情况:
然后我们开始操作根分区,命令有点多,我们简单梳理以下步骤:
-
删除根分区,但是不要写入磁盘(即输入 w)
-
创建新的分区,新的分区的起点必须是删除的根分区的起点(默认就会是一样的,但是要非常注意)
-
写入磁盘(即输入 w)
分区操作完成,刷新一下分区信息并再次查看分区信息
|
|
可以看到根分区已经从 26.7G 扩展到了 31.5G。但是,通过df
命令查看磁盘大小,依然是不对的
我们再刷新根分区并查看状态,这里先看自己的文件系统是 xfs,还是 ext4,再判断使用 resize2fs 或 xfs_growfs 对挂载目录在线扩容:
- resize2fs 针对文件系统 ext2 ext3 ext4
- xfs_growfs 针对文件系统 xfs
我本地是 xfs
|
|
再看df
结果就是正确的了
总结
做法是直接在 fdisk 中删除根分区,然后不同步到磁盘,再创建分区,此时会将新增加的空间包含进去,重点就是这个,很简单,简而言之就是直接拓展磁盘中某个分区的空间。
重点是,要记住此分区起始位置,我们再创建一个新的分区的时候,需要保证其实位置相同,否则就 GG 了,这也是此操作的风险所在,我们在进行此操作的时候,需要将系统上所有正在使用根分区的服务或者操作全部停掉,最好是关掉服务开机自启之后,重启 Linux 系统之后再操作。
进行此操作之前一定要对系统进行备份。
一般情况下,我们删除一个分区之后立即创建一个新的分区时,分区的起始位置应该跟刚刚删除的分区的其实位置是一样的,这里注意一下即可。
注意点
如果在安装 Linux(主要是 Centos)系统的时候在进行分区的时候没有指定分区的设备类型是 LVM,那么后续的将无法已经使用的磁盘分区改成 LVM 类型,用户只能再挂一块没有使用的硬盘并选择用 LVM 来管理(将其创建为 pv)。而我们经常会遇到根分区大小不够的情况,因此建议在安装 Linux 系统的时候,将根分区的设备类型设置为 LVM,方便后续的动态扩容。
Linux 安装过程中默认的分区,就是采用的 LVM 的设备类型。在实际工作中也尽量使用 LVM 逻辑卷的方式进行分区。
关于如何在安装 Linux 的时候指定根分区的设备类型为 LVM,请看《VMware 在安装 Centos7 时的注意点.md》