【前言】
干运维一年以来,已经遇到好几次需要扩展目录空间的情景,每次都是同事帮忙解决,这次花一点时间了解下。在某搜索引擎上查阅大量资料以及咨询大佬们的帮助下,有了点自己的小小的理解,如有不对,还请各位指出~
【相关名词】
在进行步骤之前,先来了解几个名词,在Linux存储系统中,有以下概念名词:
物理存储介质:
系统的物理存储设备,也就是常说的磁盘/硬盘,在linux系统中查看标识如:/dev/sda、/dev/hda等。
物理卷(Physical Volume,PV):
是具体的硬盘分区,在linux系统中查看标识如:/dev/sda1、/dev/sda2等,是lvm的基本存储单元,可以理解为加了lvm相关管理参数的物理存储介质。
物理块(PE):
物理卷pv中可以分配的最小存储单元,PE的大小可以指定,默认为4MB
卷组(Volume Group,VG):
顾名思义,物理卷的组合,由一个或多个物理卷组成,类似与windows中的物理硬盘。卷组(VG)就好比一个柜子,物理卷(PV)就是这个柜子的抽屉。
逻辑卷(Logical Volume,LV):
可以类比为windows中的c盘、d盘这样子,具体在linux中的标识就是各个目录,比如:/、/home、/data。我们现在用的CentOS的文件系统就基本是建立在这个之上的。
逻辑块(LE):
逻辑卷LV中可以分配的最小存储单元,在同一个卷组中LE和PE是相同的,并且一一对应
逻辑卷管理(Logical Volume Manager,LVM):
Linux环境中介于底层硬盘和文件系统中间的一种管理机制。它的原理就是通过对物理硬盘进行封装为物理卷(pv),添加到一个资源池--卷组(vg),然后再划分各个逻辑卷(lv)提供给上层应用。如此一来,上层应用是通过逻辑卷对底层物理硬盘进行操作,这样做的好处在于,可以灵活的增加/缩减空间。
为什么说能灵活的增加/缩减空间呢?如果上层应用是直接对接物理硬盘的,你一个盘满了,那么要怎么达到扩展空间的目的呢?最先想到的是不是换个大点的物理硬盘,然后把文件拷贝到新盘去?如果说文件不大还好说,如果文件是几个TB,那怎么办?好,就算几个TB,你可以等,那如果是几个PB呢?怎么解决?还是用拷贝的方式?很显然不是很现实,这个时候lvm的优势就展现出来了,我只需要将新增的物理硬盘添加进卷组(VG),然后再给需要扩展的盘添加空间就可以了,是不是省去了拷贝这么个步骤呢?
在别人博客借个图,如下图描述了整个lvm的大致架构流程,更好理解点。
那么你会好奇了,我要如何进行这个空间的扩展/缩减呢?接下来就是具体的扩展内容了。
简洁步骤见文末,以下为详细讲解步骤
【lvm扩展已有磁盘】
首先给虚拟机添加一块新的硬盘,这里我加了个10G的硬盘
1、查看新增硬盘是否成功,如下图可以看到新增了个/dev/sdb盘
fdisk -l
2、创建硬盘分区
fdisk /dev/sdb
3、改变分区格式
4、查看是否分区成功
fdisk -l
可以看到已经出现了/dev/sdb1,但是此时还并未真正成为一个pv,需要进行下一步。
5、创建pv
pvcreat /dev/sdc1
6、查看确认pv创建成功
pvdisplay
7、查看现有的vg
vgdisplay
这里我需要扩展根目录所在的vg,即图中vg名为centos
8、扩展vg
vgextend centos /dev/sdb1
9、查看vg是否扩展成功
vgdisplay
可以看到Free PE 已经变为10G了。
10、查看你想要扩展的目录的lv路径
lvdisplay
这里我准备扩展根目录,如图路径为/dev/centos/root
11、扩展lv
lvextend -l +100%free /dev/centos/root
通过vgdisplay查看vg的free pe已经变为0了,alloc pe也由原来的50G变为60G了,但是这时候还需要最后一步
12、刷新格式xfx格式文件系统大小
xfs_growfs /dev/centos/root
这里需要根据你的格式来用不同的命令,如果不是xfs系统就不能用这个命令,可以看到已经更新了,至此,扩展就完成了
简洁版本:
1、分区
[root@VM171-test-ng_proxy ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xb5ab0716.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-20971519, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519):
Using default value 20971519
Partition 1 of type Linux and of size 10 GiB is set
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
2、创建pv
[root@VM171-test-ng_proxy ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
3、扩展vg
[root@VM171-test-ng_proxy ~]# vgextend centos /dev/sdb1
Volume group "centos" successfully extended
4、扩展lv
[root@VM171-test-ng_proxy ~]# lvextend -l +100%free /dev/centos/root
Size of logical volume centos/root changed from 46.99 GiB (12030 extents) to 56.99 GiB (14590 extents).
Logical volume centos/root successfully resized.
5、刷新xfs文件系统
[root@VM171-test-ng_proxy ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=3079680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=12318720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=6015, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 12318720 to 14940160
在文末要再次感谢各位大佬耐心给我讲解相关的知识点~