前言
安装操作系统时,通常会根据使用情况对系统进行分区并设置容量,但在使用过程中,经常会出现容量不够用的情况。本文旨在解决分区容量不够用的问题。通常的解决办法有:
- 1.重装系统
- 2.使用现有的逻辑分区,缩减其他分区容量,对目标分区进行扩容
- 3.添加新硬盘,对目标分区进行扩容
由于重装系统会导致数据丢失,即使进行数据迁移,其过程也很复杂且耗时,因此,不到迫不得已,应尽量避免通过重装系统的方法实现分区扩容。本文主要记录另外两种解决办法。
前置知识
逻辑卷管理(LVM,Logical Volume Manager) 是在Linux环境下用于对磁盘分区进行高级管理的技术。通过LVM,可以更灵活地调整文件系统的大小以及动态分配磁盘空间。
物理卷(PV,Physical Volume) 是 LVM 的最基础单元,代表了底层的物理存储设备,比如硬盘、RAID 或分区。
卷组(VG,Volume Group) 是由一个或多个物理卷组成的逻辑存储池,在卷组中可以动态地添加或移除物理卷,逻辑卷从卷组中分配空间。
逻辑卷(LV,Logical Volume) 是从卷组中分配的存储单元,对于逻辑卷来说,每一个卷组就是一个整体,从这个整体中划分出一小块空间,作为用户创建文件系统基础,这一小块空间就称为逻辑卷。
用大白话来讲,一方面,由于我们日常使用的硬盘等存储设备大小不一定都是完全一致的,另一方面,我们想要划分的分区大小不一定规则(比如,我们可能需要600G大小的空间作为root分区,但我们购买的硬盘规格只有256G、512G和1T的,此时,如果只用一块硬盘便不能满足我们的需要,必须组合起来使用才能满足需要)。因此,大牛们想了个办法,把多个物理存储设备(即物理卷,PV)组合起来,虚拟成一个大的存储设备,并给这个虚拟存储设备起了个名字——卷组(VG)。通过这种方法,我们可以获得任意大小的存储设备,然后,当需要分区时,就可以忽略硬盘规格带来的限制,从而实现任意划分所需大小的空间。因为通过这种方法得到的存储空间是一块虚拟的磁盘,因此不一定能保证每个分区都位于同一块物理存储设备上(比如,可能root分区大小为500G,但这500G的空间可能有256G属于1号物理硬盘,剩下的244G空间属于2号物理硬盘),所以,对于从卷组VG中分配的空间,又称为逻辑卷LV。
前置操作(重要!重要!重要!!!)
如果系统中存在重要数据,请
提前备份!!!
提前备份!!!
提前备份!!!
最好备份到其他设备,不要备份到当前操作系统的其他目录,因为分区的扩缩容属于重要操作,如果不清楚每条命令的作用,很容易将数据擦除,甚至系统崩溃,因此,务必备份重要数据。
一、使用现有逻辑分区,扩容目标分区
查看当前分区使用情况
df -Th
从图中可以看出/
分区容量为36G,/home
分区容量为19G,现在通过缩减/home
分区容量,然后分配给/
分区来演示扩容。
查看挂载的设备
lsblk
1.缩减/home
分区容量
查看现有逻辑分区
lvdisplay
# 要缩减分区,首先要卸载home分区
umount /home
# 缩减5G
lvreduce -L -5G /dev/centos/home
缩减分区之后,执行lvdisplay
命令查看现在的分区大小
从上图可以看到home
分区大小已经减少了5G,但是root
分区大小还没有增加,此时,执行vgdisplay
查看空闲空间
从上图中Free PE
可以看到当前空闲空间大小为5G,即刚才从home
分区缩减出来的大小。
接下来,需要将空闲的5G空间增加到root
分区。
2.扩容root
分区
# 将空闲分区全部分配给root分区
lvextend -l +100%FREE /dev/centos/root
从上图可以看到,两个分区的容量也已经发生变化。然后使用vgdisplay
查看卷组的空闲空间。
从Free PE
可以看到空闲空间为0。你以为这就结束了?完全没有,因为此时在终端执行df -Th
命令后结果如下:
从红框里不难看出,根目录的大小仍然是36G,并未增加。这是因为在Linux系统中,当你使用lvextend
命令来扩展一个逻辑卷的大小时,实际上只是扩展了逻辑卷的容量,并没有扩展文件系统的大小。所以,虽然逻辑卷的空间已经扩展了,但文件系统并没有相应地扩展到新的空间上。
因此,需要使用xfs_growfs
命令来将文件系统扩展到新的空间上,这样操作系统才能正确地识别和使用新的空间。如果不执行xfs_growfs
命令,新的空间将无法使用,因为文件系统没有扩展到这些空间。
3.扩展文件系统
# 使用xfs_growfs读取新增的逻辑卷空间
xfs_growfs /dev/centos/root
至此,root
分区才算扩容完成。
但是,差一步工作,重新挂载home
分区。
4.格式化并挂载home
分区
由于home
分区大小已经发生修改,如果不执行格式化,直接挂载分区,则会报错mount: /dev/mapper/centos-home: can't read superblock
# 格式化分区
mkfs.xfs /dev/centos/home
# 或者加参数-f执行强制格式化
mkfs.xfs -f /dev/centos/home
二、添加新硬盘,扩容目标分区
1.查看存储设备,建立新分区
fdisk -l
从图中可以看到两个存储设备,即两块硬盘,分别为dev/sda
和/dev/sdb
,其中,dev/sda
为原有的硬盘,dev/sdb
是我后加的硬盘。接下来,需要格式化新硬盘并建立分区。
# 对新硬盘进行分区
fdisk /dev/sdb
执行fdisk /dev/sdb
后,依次输入:
- (1)m:输出帮助信息,我们首先输入p打印一下
/dev/sdb
的分区表,从下图可以看到/dev/sdb
并不存在分区表。 - (2)n:开始创建新分区
- (3)p:表示新建的分区表为主分区
- (4)回车:表示分区号,可以输入1-4,按回车键默认是分区号为1
- (5)回车:表示开始的扇区,直接回车即可
- (6)回车:表示结束的扇区,直接回车表示,使用全部的扇区,即分配所有的硬盘空间,这里也可以输入指定大小,比如:输入
+5G
表示建立一个5G大小的新分区,分区号对应第(4)步输入的数字 - (7)p:再次打印分区表,就可以看到新建的分区
- (8)w:写入硬盘并退出
再次查看分区:
可以看到两个分区。
2.创建物理卷(PV)
# 创建物理卷pv
pvcreate /dev/sdb1
# 查看物理卷
pvdisplay
此时,可以看到新创建的物理卷(/dev/sdb1
)的卷组名字(VG Name)为空,这是因为新创建的物理卷还没有加入(或者说分配给)任何卷组。
3.扩容卷组(VG)
# 将新创建的物理卷分配给当前的卷组(centos)
vgextend centos /dev/sdb1
# 查看当前的卷组vg
vgdisplay
4.扩容逻辑卷(LV)
# 查看当前逻辑卷
lvdisplay
# 两种扩容方法,-L参数可以指定扩容的大小,-l表示让系统分配所有空闲空间
# 扩容逻辑卷,扩容5G
lvextend -L +5G /dev/centos/root
# 分配所有空闲空间
lvextend -l +100%FREE /dev/centos/root
5.扩容文件系统
# 扩容文件系统
xfs_growfs /dev/centos/root
# 查看磁盘使用情况
df -Th
至此,扩容完成。