linux中逻辑卷管理–lvm

Linux就该这么学

一、理论原理篇

  • LVM(Logic Volume Manager)逻辑卷管理,是linux环境下对磁盘分区进行管理的一种机制。
  • LVM是建立在磁盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

1.lvm术语介绍

  1. 物理存储介质(the physical media):硬盘,是存储系统最低层的存储单元。
  2. 物理卷(physical Volume, PV):物理卷是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备,是LVM的基本存储逻辑块,但和物理存储介质比较的话,却包含有与LVM相关的管理参数。
  3. 卷组(Volume Group, VG):LVM的卷组类似于非LVM系统的物理硬盘,由物理卷组成。可以在卷组上创建一个或者多个lvm分区(逻辑卷)。
  4. 逻辑卷(Logical Volume, LV):类似于非LVM系统中的硬盘分区,在逻辑卷上可以建立文件系统。
  5. PE(physical extent, PE):每一个物理卷被划分为称为PE的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元,PE的大小是可以配置的,默认为4MB。

2.lvm原理图示

3.各命令含义汇总

1)物理卷:  
pvcreate            #创建物理卷
pvremove            #数据擦除
pvmove              #把含有数据的pv上的数据挪到其他pv上面
resize2fs           #扩展物理卷

2)卷组:  
vgcreate            #创建卷组
vgextend            #扩展卷组数据
vgreduce            #缩减卷组数据

3)逻辑卷:  
lvcreate            #创建逻辑卷
lvextend            #扩展逻辑卷数据
lvreduce            #缩减逻辑卷数据,但应注意逻辑卷不能在线缩减  

二、实践篇

为了即时看到改变,所以应该使用监控方方便查看,监控的命令如下:

[root@localhost ~]# watch -n 1 "pvs;echo ====================;\
> vgs;echo ====================;\
> lvs;echo ====================;\
> df -h /westos "

1、lvm建立

建立lvm之前,应该先用fdisk划分物理分区,并且修改标签为lvm,划分物理分区的具体方法在上一篇文章里面详细介绍。下面直接从创建物理卷开始

[root@localhost ~]# pvcreate /dev/vdb1        #对创建的物理分区创建物理卷
WARNING: xfs signature detected on /dev/vdb1 at offset 0. Wipe it? [y/n] y
  Wiping xfs signature on /dev/vdb1.
  Physical volume "/dev/vdb1" successfully created
[root@localhost ~]# vgcreate vg0 /dev/vdb1    #创建物理卷组vg0
  Volume group "vg0" successfully created
[root@localhost ~]# lvcreate -L 100M -n lv0 vg0   #从vg0里面创建一个大小为100M名字为lv0的逻辑卷
WARNING: xfs signature detected on /dev/vg0/lv0 at offset 0. Wipe it? [y/n] y
  Wiping xfs signature on /dev/vg0/lv0.
  Logical volume "lv0" created
[root@localhost ~]# mkfs.xfs /dev/vg0/lv0       #对创建的逻辑卷进行格式化
meta-data=/dev/vg0/lv0           isize=256    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]# mount /dev/vg0/lv0 /westos    #挂载逻辑卷

因为之前运行了监控命令,可以得到完成逻辑卷建立的结果如截图:

2.lvm的扩展

从原理图中可以看出来,lv从物理卷组vg中取出,所以如果对lv进行扩展的话,会出现两种情况:  1. vg中有充足的容量进行扩展,此时可以直接用命令来进行扩展  2. vg中容量不足以支持扩展的大小,那么此时就必须通过新建物理分区,先对vg进行扩展,再扩展lv  具体做法如下:

1)vg中有充足的容量

[root@localhost ~]# lvextend -L 160M /dev/vg0/lv0     #将lv0的容量扩展到160M
Extending logical volume lv0 to 160.00 MiB
Logical volume lv0 successfully resized
[root@localhost ~]# xfs_growfs /dev/vg0/lv0           #更新
meta-data=/dev/mapper/vg0-lv0    isize=256    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 25600 to 40960

2)vg中容量不足

由上一步的截图可以看出,若想将lv0的容量扩展到240M的话,vg0的容量不足

[root@localhost ~]# lvextend -L 240M /dev/vg0/lv0
  Extending logical volume lv0 to 240.00 MiB
  Insufficient free space: 20 extents needed, but only 9 available

所以此时应该先新建一个物理分区,把新建的物理分区加入到vg0里面,才能继续进行扩展

[root@localhost ~]# fdisk /dev/vdb  ...8e...    #新建物理分区
#此时需要注意的是当新建分区保存退出的时候,会提示vdb设备更忙,所以需要运行partprobe命令手动更新分区表,使系统识别到新建的分区。
[root@localhost ~]# vgextend vg0 /dev/vdb2
  Physical volume "/dev/vdb2" successfully created
  Volume group "vg0" successfully extended
[root@localhost ~]# lvextend -L 250M /dev/vg0/lv0
  Rounding size to boundary between physical extents: 252.00 MiB
  Extending logical volume lv0 to 252.00 MiB
  Logical volume lv0 successfully resized
[root@localhost ~]# xfs_growfs /dev/vg0/lv0
meta-data=/dev/mapper/vg0-lv0    isize=256    agcount=7, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=40960, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 40960 to 64512

#而在ext4文件系统中,若想新型扩展,应注意:
mkfs.ext4 /dev/vg0/lv0
扩展:
lvextend -L 400M /dev/vg0/lv0
resize2fs /dev/vg0/lv0

运行之后监控的结果如下图:

3.lvm的缩减

注意:lvm不能进行在线缩减,必须先卸载才能缩减

(1)对设备的缩减

[root@localhost ~]# umount /westos/
[root@localhost ~]# e2fsck -f [root@localhost ~]# resize2fs /dev/vg0/lv0 100M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg0/lv0 to 102400 (1k) blocks.
The filesystem on /dev/vg0/lv0 is now 102400 blocks long.
/dev/vg0/lv0    #进行强制文件检查
[root@localhost ~]# lvreduce -L 100M /dev/vg0/lv0
  WARNING: Reducing active logical volume to 100.00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv0? [y/n]: Y
  Reducing logical volume lv0 to 100.00 MiB
  Logical volume lv0 successfully resized
[root@localhost ~]# lvs
  LV   VG   Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
  lv0  vg0  -wi-a----- 100.00m                                             
[root@localhost ~]# mount /dev/vg0/lv0 /westos/

监控结果可以看出,此时lv0已经缩减到100M

(2)对卷组的缩减

若要对没有数据的卷组进行移除,缩减,可以直接进行移除,但是若要对有数据的卷组进行移除,就必须先把数据迁移到其他卷组上,这里只示范对有数据的卷组进行移除的过程:

#由上面的截图可以看出来/dev/vdb2不足以放下vdb1上面的容量,所以添加了一个vdb3
[root@localhost ~]# pvmove /dev/vdb1 /dev/vdb3
  /dev/vdb1: Moved: 7.9%
  /dev/vdb1: Moved: 65.8%
  /dev/vdb1: Moved: 100.0%
[root@localhost ~]# vgreduce vg0 /dev/vdb1    #应该先把vdb1从vg0上面取下来
  Removed "/dev/vdb1" from volume group "vg0"
[root@localhost ~]# pvremove /dev/vdb1        #再执行pvremove
  Labels on physical volume "/dev/vdb1" successfully wiped

监控结果如下图,可以看出vdb1已经成功移除,同样的步骤,也可以移除vdb2

这里写图片描述

4、lvm快照使用

lvcreate -L 100M -n lv0backup -s /dev/vg0/lv0  通过已经存在的/dev/vg0/lv0建立一个大小为100M,名字为lv0backup的lvm快照  快照可以直接挂载。不需要进行格式化等动作,使用快照的时候读取的是lv0,和虚拟机快照相同,当快照里面的东西被误删除之后,可以先取消挂载,lvremove损坏的快照,重新进行快照

[root@localhost ~]# cd /westos/     #此时lv0挂载在/westos目录上面
[root@localhost westos]# ls
[root@localhost westos]# touch file{1..5}
[root@localhost ~]# lvcreate -L 100M -n lv0backup -s /dev/vg0/lv0
  Logical volume "lv0backup" created
[root@localhost ~]# umount /westos/
[root@localhost ~]# mount /dev/vg0/lv0backup /westos
[root@localhost ~]# cd /westos/
[root@localhost westos]# ls
file1  file2  file3  file4  file5

监控结果如图:可以看出此时挂载的是快照lv0backup

这里写图片描述

5、lvm的删除

lvm的删除应注意和lvm建立的顺序刚好相反一步步删除

[root@localhost ~]# umount /westos/
[root@localhost ~]# lvremove /dev/vg0/lv0
Do you really want to remove active logical volume lv0backup? [y/n]: y
  Logical volume "lv0backup" successfully removed
Do you really want to remove active logical volume lv0? [y/n]: y
  Logical volume "lv0" successfully removed
[root@localhost ~]# lvremove /dev/vg0/lv1
Do you really want to remove active logical volume lv1? [y/n]: y
  Logical volume "lv1" successfully removed
[root@localhost ~]# vgremove vg0
  Volume group "vg0" successfully removed
[root@localhost ~]# pvremove /dev/vdb3
  Labels on physical volume "/dev/vdb3" successfully wiped

这里写图片描述

由监控结果可以看出都已经删除,删除完后开始删除硬盘分区即可:

最终结果为:

[root@localhost ~]# cat /proc/partitions
major minor  #blocks  name

 253        0   10485760 vda
 253        1   10484142 vda1
 253       16   10485760 vdb

当设备处于闲置状态的时候,容易出现没有按照顺序一步步删除,而是直接删除硬盘分区,但是手动同步分区表的话会出现报错  解决方法:  vgreduce vg0 --removemissing

本文由 CentOS中文站 - 专注Linux技术 作者:centos 发表,其版权均为 CentOS中文站 - 专注Linux技术 所有,文章内容系作者个人观点,不代表 CentOS中文站 - 专注Linux技术 对观点赞同或支持。如需转载,请注明文章来源。

菜鸟一号-广州

相关文章

发表评论

邮箱地址不会被公开。 必填项已用*标注