您的位置:首页 > 运维架构 > Linux

linux中逻辑卷管理--lvm

2017-11-08 19:43 543 查看

linux中逻辑卷管理–lvm

一、理论原理篇

LVM(Logic Volume Manager)逻辑卷管理,是linux环境下对磁盘分区进行管理的一种机制。

LVM是建立在磁盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

1.lvm术语介绍

物理存储介质(the physical media):硬盘,是存储系统最低层的存储单元。

物理卷(physical Volume, PV):物理卷是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备,是LVM的基本存储逻辑块,但和物理存储介质比较的话,却包含有与LVM相关的管理参数。

卷组(Volume Group, VG):LVM的卷组类似于非LVM系统的物理硬盘,由物理卷组成。可以在卷组上创建一个或者多个lvm分区(逻辑卷)。

逻辑卷(Logical Volume, LV):类似于非LVM系统中的硬盘分区,在逻辑卷上可以建立文件系统。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 磁盘 存储系统