1、lvm概念
逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,它可以将几块磁盘(物理卷,PhysicalVolume)组合起来形成一个存储池或者卷组(VolumeGroup)。LVM可以每次从卷组中划分出不同大小的逻辑卷(LogicalVolume)创建新的逻辑设备。底层的原始的磁盘不再由内核直接控制,而由LVM层来控制。对于上层应用来说卷组替代了磁盘块成为数据存储的基本单元。LVM管理着所有物理卷的物理盘区,维持着逻辑盘区和物理盘区之间的映射。LVM逻辑设备向上层应用提供了和物理磁盘相同的功能,如文件系统的创建和数据的访问等。但LVM逻辑设备不受物理约束的限制,逻辑卷不必是连续的空间,它可以跨越许多物理卷,并且可以在任何时候任意的调整大小。相比物理磁盘来说,更易于磁盘空间的管理。
2、为什么要用LVM
每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。因为如果估 计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬盘、重新对硬盘分区,然后恢复数据到新分区。
虽然有很多动态调整磁盘的工具可以使用,例如PartitionMagic等等,但是它并不能完全解决问题,因为某个分区可能会再次被耗尽;另外一个方面这需要 重新引导系统才能实现,对于很多关键的服务器,停机是不可接受的,而且对于添加新硬盘,希望一个能跨越多个硬盘驱动器的文件系统时,分区调整程序就不能解 决问题。
因此完美的解决方法应该是在零停机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。幸运的是Linux提供的逻辑盘卷管理(LVM,LogicalVolumeManager)机制就是一个完美的解决方案。
3、传统分区带来的问题
传统的文件系统是基于分区的,一个文件系统对应一个分区。这种方式比较直观,但不易改变。当一个分区空间已满时,无法对其扩充,只能采用重新分区/建立文件系统,非常麻烦;或把分区中的数据移到另一个更大的分区中。
当采用LVM时:
1、将硬盘的多个分区由LVM统一为卷组管理,可以方便的加入或移走分区以扩大或减小卷组的可用容量,充分利用硬盘空间;
2、文件系统建立在LVM上,可以跨分区,方便使用;
3、当系统空间不足而加入新的硬盘时,不必把用户的数据从原硬盘迁移到新硬盘,而只须把新的分区加入卷组并扩充逻辑卷即可。
使用LVM主要是方便管理、增加了系统的扩展性。可以跨分区,多个硬盘组合。
4、LVM实现原理图解及构造
LVM若要成功建立,由以下几部分组成
物理磁盘(PhysicalStorageMedia)
物理磁盘是指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。
物理卷(Physical Volume,PV)
物理卷是指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
卷组(Volume Group,VG)
卷组是指非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。
逻辑卷(Logical Volume,LV)
类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。
5、lvm举例讲解
可能这样说对于小白来说可能不太容易理解,下面举个例子所有吃货都能理解的例子来讲解一下什么是LVM
比如现在有ABCD四个人,A现在有半斤面粉,B现在有半斤水,C现在有1两葱,D现在有1两油(此时这半斤面粉,半斤水,1两葱和1两油就好比上图的4块PV物理卷硬盘),进行不进行lvm操作的话,是操作者说了算,此时该操作者就属于厨师,如果这个厨师嫌麻烦的话,就安排A吃属于他自己的半斤面粉,B就喝属于他自己半斤水,C就吃属于自己的1两葱,D就吃属于自己的一两油,ABCD四个人井水不犯河水。
如果现在ABCD四个人找到了厨师,想把他们的食材进行一下融合,ABCD把属于自己的面,水,油,葱全部给到厨师,厨师根据4个人提供的食材的量给他们融合在一起,帮他们做成一张葱油饼(此时这张葱油饼就好比上图的VG),葱油饼(VG)的大小取决于ABCD提供的食材(PV)的多少,如果提供的量多,就可以做成一张大饼,如果提供的量少,就可以做成一张小饼。
ABCD四个人就等待分配属于自己的葱油饼即可,此时每个人分配到的葱油饼的大小(lv)就是根据每个人的饭量大小来取。
PV是不可改变大小的,VG和LV是可以分配大小的。
VG进行扩大容量操作是所有硬盘都划分了,盘容量不够用了,需要重新添加硬盘,类似于ABCD都是大胃王,不够他们吃的,这时候又打电话叫E来送食材来加原料
VG进行缩减容量是将部分空间变成未分配状态或者给到别的VG,操作类似于ABCD带的食材量太多了,有一块饼还没做,等待下次在做或者将食材再做个酱香饼啥的
LV进行扩大容量操作是一开始给了一个挂载点10个G的空间,但是不够用了,需要将空间扩大到20G,容量索取的话需要在别的挂载点上压缩出来或者直接使用VG未分配的空间,类似于这张饼就这么大,1个人分一张饼,A不够吃,要不去看看还有没有剩下的饼,没有剩下的饼,就得看看BCD谁的饼没吃完,给A一些吃。
LV进行缩减容量操作是一开始给了一个挂载点100个G的空间,但是不够用了,需要将空间缩小到50G,容量压缩出来的话直接变成未分配的空间或者给别的分区,厨师给B一张饼,但是B的饭量小,剩下的饼要不就剩下,谁饿了去盘子里拿,要不就问问ACD,谁不够吃,直接把B吃不下的饼给到ACD。
备注:一个LV的空间只能来自于一个VG,一个LV的空间不允许来自两个VG,功能上实现不了。
换句话说就是不管多少人吃饼,只能吃自己贡献原材料这个组的饼,不能吃别的组的饼,比如ABCD四个人提供的原材料做成了饼,另外一组是做包子,你肯定不能吃人家组里的包子。
6、lvm前准备工作
如果之前的硬盘有数据,需要提前将磁盘里面的数据进行数据备份,毕竟数据无价,备份完后将磁盘取消挂载并注释掉之前fstab关于磁盘自动挂载的条目信息,必要时在做完前面操作后进行系统重启,重启后,将磁盘进行强制格式化,如果是新加的硬盘,该步骤忽略,具体格式化命令为:(此处以sda做演示)
mkfs.ext4 -f /dev/sda
ext4可以更改为xfs
mkfs.xfs -f /dev/sda
具体根据现场情况进行确认
7、lvm创建
7.1、检查一下是否安装了xfs和lvm的组件
CentOS,Rocky,Redhat等参考
rpm -qa | grep xfsprogs
rpm -qa | grep lvm2
Ubuntu,Debian等参考
dpkg -l | grep xfsprogs
dpkg -l | grep lvm2
7.2、安装xfs和lvm的组件
若未安装,需要安装一下这两个组件,若已安装请忽略
CentOS,Rocky,Redhat等参考
yum install xfsprogs
yum install lvm2
Ubuntu,Debian等参考
apt install xfsprogs -y
apt install lvm2 -y
7.3、lvm的具体操作
此处以CentOS系统进行操作,Ubuntu等系统的操作操作一样
功能/命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
扫描 | pvscan | vgscan | lvscan |
查看 | pvs | vgs | lvs |
建立 | pvcreate | vgcreate | lvcreate |
显示 | pvdisplay | vgdisplay | lvdisplay |
删除 | pvremove | vgremove | lvremove |
扩展 | vgextend | lvextend | |
缩小 | vgreduce | lvreduce |
查看一下机器的磁盘状态,此处我添加了1块200G的硬盘,1块300G的硬盘,此硬盘是新加的2块硬盘,不需要进行格式化操作,新加磁盘为sdb和sdc。
(1).创建PV
pvcreate 硬盘1 硬盘2 …… 硬盘n
pvcreate /dev/sdb
pvcreate /dev/sdc
(2).删除PV
pvremove 硬盘1 硬盘2 …… 硬盘n
pvremove /dev/sdb
pvremove /dev/sdc
(3).查看PV
pvs 或者 pvdisplay
未创建pv时
创建完pv时
(4).创建VG
2块硬盘分别创建VG的情况(第一个vg取名为data1,第二个vg取名为data2)
vgcreate vg卷组名 硬盘1 硬盘2 …… 硬盘n
vgcreate data1 /dev/sdb
vgcreate data2 /dev/sdc
(5).扩容VG
vgextend vg卷组名 硬盘1 硬盘2 …… 硬盘n
如果2块硬盘要做到1个vg中,只需要创建1个vg,其余的硬盘扩容加入到该vg中(该vg取名为data)
vgextend data /dev/sdc
(6).缩减VG
vgreduce vg卷组名 硬盘1 硬盘2 …… 硬盘n
缩减vg时需要选择vg的名称和所需要移出的盘符
vgreduce data /dev/sdc
(7).删除VG
删除vg时只需要选择vg的名称即可,不需要带盘符
vgremove vg卷组名
vgremove data1
vgremove data2
vgremove data
(8).查看VG
vgs 或者 vgdisplay
未创建vg时
分别创建vg时
只创建了一个vg,将其余硬盘添加到相同的vg时
(9).创建LV
创建时使用vg的全部空间或者空闲容量的百分比的磁盘空间
lvcreate -l+X%free -n <vg_name>
lvcreate -l+空闲容量的百分比 -n vg卷组名
(该lv取名为lv,磁盘空间在名称为data的vg中获取)
lvcreate -l+100%free -n lv data
lvcreate -l+50%free -n lv data
创建时使用vg的40G指定大小的空间
lvcreate -L <lv_size> -n <lv_name> <vg_name>
lvcreate -L 指定要给的lv的大小 -n lv卷组名 vg卷组名
(该lv取名为lv1,磁盘空间在名称为data的vg中获取40G)
lvcreate -L 40G -n lv1 data
(10).扩容LV
lvextend -l+X%free -n /dev/<vg_name>/<lv_name>
lvcreate -l+空闲容量的百分比 -n 逻辑卷路径
lvextend -L +XG -n /dev/<vg_name>/<lv_name>
lvextend -L +指定要给的lv的大小 -n 逻辑卷路径
lvextend -L +40G -n /dev/data/lv
(11).缩减LV
不建议用前面扩容的那种百分比来缩小容量,按照指定大小来缩小容量
lvreduce -L -XG -n /dev/<vg_name>/<lv_name>
lvreduce -L -指定要给的lv的大小 -n 逻辑卷路径
lvreduce -L -40G -n /dev/data/lv
(12).查看LV
创建时使用vg的全部空间
创建时使用vg的40G部分空间
8、lvm分区格式化并挂载
(1)、查看一下逻辑卷路径
lvs 或者 lvdisplay
(2)、对逻辑卷进行格式化(xfs或者ext4)
mkfs.xfs /dev/data/lv
mkfs.ext4 /dev/data/lv
(3)、创建挂载点文件夹(根据需求创建)
mkdir /data
(4)、不要着急挂载,先去fstab中把移动挂载的路径添加上,并查看一下配置文件
vi /etc/fstab
在末尾加入
/dev/data/lv /data xfs defaults 0 0
若机器格式化成了ext4,将xfs改成ext4即可
/dev/data/lv /data ext4 defaults 0 0
(5)、自动挂载
执行只动挂载
mount -a
查看挂载情况
df-h
未执行自动挂载
已执行自动挂载
(6)、重启验证
9、扩展知识
9.1、逻辑卷扩展&分区大小查看
xfs格式
此时要把逻辑卷/dev/data/lv的空间变成400G,扩大15G空间
具体操作如下:
1、逻辑卷空间增加25G
lvextend -L +25G /dev/data/lv
3、查询扩展情况
lvs
4、查看挂载情况
df -hT
执行下面操作之前已经将/dev/data/lv的文件系统从xfs设置成了ext4文件格式,更改文件系统需要进行格式化操作,具体操作过程查看8(4),本处不再赘述
ext4格式
此时我们发现,不管是ext4还是xfs,都可以看到LV虽然扩展了,但是分区大小还是原来的,没有进行任何改变,如果分区大小要改变一下的话,需要同步一下分区容量到内核
9.2同步分区容量的方式
分区容量增加
ext4文件系统扩容使用命令语法:
resize2fs 逻辑卷名称
resize2fs /dev/<vg_name>/<lv_name>
xfs文件系统扩容使用命令语法:
xfs_growfs 挂载点
xfs_growfs /mount
注:resize2fs和xfs_growfs 两者的区别是传递的参数不一样的,xfs_growfs是采用的挂载点;resize2fs是逻辑卷名称,而且resize2fs命令不能对xfs类型文件系统使用
xfs格式
此处我们用的文件系统格式是xfs
ext4格式
此处我们用的文件系统格式是ext4
执行完成后,两种格式的分区容量都已经更改
分区都可以扩展,能不能进行缩减
分区容量缩减
缩减容量时要注意以下几点:
1、需要先取消挂载
2、实际使用过程中不推荐使用缩减,与其缩减容量,不如扩展时给小点空间,不够再继续扩,不推荐使用缩减,可能会丢失数据
3、缩减之前尽量备份一下数据
4、分区缩减只能用于ext4,xfs不支持缩减,只能扩容
ext4格式
此处我们用的文件系统格式是ext4
复查一下空间
此时会发现逻辑卷的空间和挂载时候的空间不一致,这是由于ext2/3/4 文件系统,当存储空间大于95%的时候,容易造成磁盘的碎片化,会造成文件系统的崩溃,所以一般系统在对 ext3 ext4磁盘格式化的时候,默认一般分配95%的空间,剩下的5%-10%不等的空间作为保留空间,一方面是为了防止磁盘的碎片化,另一方面是为了root进程的某些重要的进程救援节省空间。这部分的空间为 root用户可以管理,别的用户没有权限,空间占用满时root启动的程序还可以创建文件,使用的是剩余的5%-10%不等的空间。
1、取消挂载
umount /data
将分区进行缩小,使其总大小为300G,缩减100G的空间
2、检查分区完整性
e2fsck -f /dev/data/lv
3、缩小分区空间到300G
resize2fs /dev/data/lv 300G
4、缩小逻辑卷空间到100G,使得逻辑卷空间和分区空间的保持一致
lvreduce -L -100G -n /dev/data/lv
5、查看fstab自动挂载条目中的分区格式是否为ext4,执行自动挂载并检验挂载情况