lvm基本应用,扩展及缩减实现

时间:2021-04-11 17:23:06

1. 为什么要使用LVM?


    每个Linux使用者都经常会遇到这样的困境:在进行系统分区时,该如何对分区的大小进行精确地评估和分配?Linux使用者不仅要考虑到当前系统分区所需要的容量,还要充分考虑到未来需要的容量的最大值。如果评估不准确,当未来系统分区不够用时,常常需要对Linux系统分区上的数据进行备份,再删除分区、重新分区、格式化、挂载和拷贝数据,最后再重新上线。


    之所以需要这么麻烦,根本原因是传统的文件系统是基于分区的,一个文件系统对应一个分区,各个分区之间是互相独立的。


    为了解决这一问题,虽然可以使用支持跨文件系统的软链接,或者使用可调整分区大小的工具例如PartitionMagic等等,但却无法从根本上解决问题,因为一方面再次调整的分区仍然有可能会再次不够用,另一方面是调整分区大小需要重新引导系统,对于很多关键服务器是不能接受停机的,因此问题仍然存在。这时我们或许会觉得如果能在线对系统分区的大小进行调整而又对该分区上的数据无影响的话那该多好?不过,Linux的逻辑卷管理器 (LVM, Logical Volume Manager) 提供了这一解决方案。


2. LVM 工作原理


    LVM是逻辑卷管理(Logical Volume Manager)的简称,它是一种更为灵活的磁盘分区管理机制。LVM是在磁盘分区和文件系统之间添加的一层逻辑层,它为文件系统屏蔽下层的磁盘分区布局,向文件系统提供一个抽象的存储卷。通过LVM,Linux系统管理员可轻松地管理磁盘分区,如:既然LVM是建立在硬盘和分区之上的一层逻辑层,那么可以将多个硬盘、多个分区或RAID组织起来构建成存储卷组,作为一个存储池;然后在这个存储卷之上再将其划分出一个或多个逻辑卷,Linux系统管理员可以对这个划分出来的逻辑卷进行一系列操作(例如格式化、挂载等),可以将逻辑卷当做一个系统分区来对待,更重要的是,这个系统分区的大小还可以在线扩展或缩减。总的来说,LVM使得系统分区独立于底层硬件。

 

lvm基本应用,扩展及缩减实现


    那么LVM是如何做到支持系统分区在线扩容或缩容的?我们再梳理一下LVM的工作原理。要制作逻辑分区,首先需要将多个硬盘、多个分区或RAID制作成为便于识别的物理卷(PV, Physical Volume),将这些制作好的物理卷再构建成一个存储池,我们把这个存储池称为卷组(VG, VolumeGroup),这是LVM的第一个逻辑层。在卷组这一层上再逻辑出一层逻辑卷(LV, LogicalVolume),这个逻辑卷LV可供用户使用,例如格式化、挂载、存储数据,相当于一个逻辑意义上的系统分区。而这个逻辑分区的空间大小取决于卷组VG的分配,因此逻辑卷LV的存储空间不能超过其所属卷组VG的总存储空间。


lvm基本应用,扩展及缩减实现

lvm基本应用,扩展及缩减实现

    pv --> vg --> lv


    类比块设备将信息存储在固定大小的块(block)中,当一个物理卷PV加入一个卷组VG时会被划分成多个物理扩展块(PE, Physical Extent)。VG将PE划分给LV,在LV中的PE称为逻辑扩展块(LE, Logical Extent)。在同一个卷组中PE和LE大小是相同的,并且一一对应。PE和LE都是LVM识别、寻址的基本单位,其对应的唯一编号分别称为PEID和LEID。


    当这个逻辑分区不够用时,可以从卷组中取出一部分空闲的PE加入这个逻辑卷;当逻辑分区的空闲空间过多时,还可以将将逻辑卷中多余的LE取出供其所属卷组中的其他逻辑卷使用,从而实现对系统分区的灵活管理。



3. LVM 元数据


    你可能会好奇有关逻辑卷和卷组的元数据都存放在哪里?类似于非LVM的系统中,有关分区的信息是存放在分区表中,而分区表是存放于每一个物理卷的起始位置处。在LVM系统中,VGDA(卷组描述符区域)就好像LVM的分区表,其存放于每一个物理卷的起始位置处。


VGDA由以下信息组成:◆ 一个PV描述符
◆ 一个VG描述符
◆ LV描述符
◆ 一些PE描述符


    当系统启动LV时,VG会被激活,并且VGDA会被加载至内存中,VGDA帮助识别LV的实际存储位置。当系统访问存储设备时,由VGDA建立起来的映射机制就用于访问实际的物理位置来执行I/O操作。


4. LVM 基本术语


以下总结一下有关LVM的几个基本术语。


* 物理存储介质(PhysicalStorageMedia):

指系统上最底层的物理存储设备:磁盘,例如:/dev/sda、/dev/sdb等。


* 物理卷(Physical Volume, PV):

指磁盘、磁盘分区或RAID设备,使用LVM前需要先将之制作成便于识别的物理卷PV(添加元数据)。


* 卷组(Volume Group, VG):

卷组由一个或多个物理卷PV组成,在卷组之上可创建一个或多个逻辑卷LV。卷组VG类似于非LVM系统的物理磁盘。


* 逻辑卷(Logical Volume, LV):

建立在卷组VG之上,相当于逻辑分区,可在逻辑卷LV上进行一系列操作(例如:格式化、挂载等)。逻辑卷LV类似于非LVM系统的磁盘分区。


* 物理扩展块(Physical Extent, PE):

当物理卷PV加入某一卷组VG后即被划分为基本单元PE,PE是LVM寻址的最小单元。PE的大小是可配置的,默认为4M。


* 逻辑扩展块(Logical Extent, LE):

卷组VG将PE划分给逻辑卷LV,在逻辑卷LV中的PE称为LE。在同一卷组VG中,PE和LE大小相同,且一一对应。LE也是LVM的最小寻址单位。


5. 快照卷


    前面提到了lvm支持lv边界动态扩展或收缩的功能,除此之外,lvm还有另一个重要的功能--为逻辑卷制作快照卷。快照卷主要作用是让用户能够访问与过去某一时刻的文件系统一致的数据,快照本身不是备份,只是备份的辅助手段。制作好快照后,我们就可以利用快照来进行备份。


    “快照”的重点在于“快”。与备份不同,备份常常需要花很多时间来复制数据流然后进行存储,尤其是对于单个或多个大文件而言,这有可能会发生数据在复制后一半时,前一半的原数据已经发生变化了,出现文件不一致的情况。所以,备份的问题在于备份速度慢、时间长。“快照”就可以帮助备份解决时间长的问题。一旦对某个文件系统(逻辑卷)创建了快照卷,相当于多了一个可监控该文件系统元数据变化的监视器,只要被监视的文件系统上的某一文件的数据发生变化,就会先拷贝一份原始文件存于快照卷中,再对文件进行修改。因此可以得出这样的结论:原卷(被监视的文件系统)上发生变化的数据的量不能超过快照卷的存储空间。我们可以通过快照卷访问某个文件系统在创建快照前的数据,它只是为该文件系统提供另一个访问路径而已。制作好快照后,我们就可以利用快照来进行备份,而这样的备份不会出现不一致的情况。


    另外,快照卷与原卷要在同一卷组中,而快照卷不一定要与原卷一样大,这取决于快照卷要存活多长时间。在快照卷的存活时间内只要在原卷上发生变化的数据的量不超过快照卷的可用空间即可。而一旦在存活时间内原卷上发生变化的数据的量超过快照卷的可用空间,那么该快照卷会失效。还有,在创建快照卷的那一刻不允许原卷文件系统上的数据发生变化的,必须先确保原卷为只读模式或无访问模式。


    当然,快照卷赢在速度上,但仍然存在缺陷。一方面之前要求原卷上发生变化的数据的量不能超过快照卷的可用空间,另一方面快照卷存放的只是原卷上发生变化的数据,当某一刻整个文件系统被损坏时,即便快照卷的可用空间充足,也同样来不及备份整个原卷,在快照卷上只有文件系统被损坏之前发生过变化的数据。因此仍然需要增量备份和差异备份。



6. 在CentOS 6上配置安装LVM


示例:(1)创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB,而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录;(2)新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录;(3)扩展testlv至7G,要求archlinux用户的文件不能丢失;(4)收缩testlv至3G,要求archlinux用户的文件不能丢失;(5)对testlv创建快照,并尝试基于快照备份数据,验证快照的功能;(6)对testlv创建快照,并尝试基于快照备份数据,验证快照的功能;(7)从卷组中添加一个物理卷,要求不影响在逻辑卷上创建的文件系统的数据。(8)从卷组中删除一个物理卷,要求不影响在逻辑卷上创建的文件系统的数据。


6.1. 分区


对指定磁盘进行分区:

[root@osyunwei ~]# fdisk /dev/sdc


创建新分区/dev/sdc5、/dev/sdc6之后,大小均为10G,将分区的类型修改为8e,完成后在fdisk进程中显示分区表,如下所示:

   Device Boot      Start         End      Blocks   Id  System/dev/sdc1               1        2610    20964793+   5  Extended/dev/sdc5               1        1306    10490382   8e  Linux LVM/dev/sdc6            1307        2610    10490382   8e  Linux LVM保存后退出:Command (m for help): w[root@osyunwei ~]# partx -a /dev/sdc    #强制内核重新读取分区表;


6.2. 制作物理卷


将磁盘分区/dev/sdc5、/dev/sdc6制作为便于LVM识别的物理卷:

[root@osyunwei ~]# pvcreate /dev/sdc{5,6}  Physical volume "/dev/sdc5" successfully created  Physical volume "/dev/sdc6" successfully created


6.3. 创建卷组


创建一个至少有两个PV组成的大小为20G的名为testvg的VG:

[root@osyunwei ~]# vgcreate -s 16M testvg /dev/sdc{5,6}  Volume group "testvg" successfully created


6.4. 创建逻辑卷


在卷组testvg中创建大小为5G的逻辑卷testlv:

[root@osyunwei ~]# lvcreate -L 5G -n testlv testvg  Logical volume "testlv" created.


6.5. 格式化逻辑卷


[root@osyunwei ~]# mkfs.ext4 /dev/mapper/testvg-testlv


6.6. 挂载逻辑卷


将格式化后的逻辑卷挂载至/users目录:

[root@osyunwei ~]# mkdir /users[root@osyunwei ~]# mount /dev/mapper/testvg-testlv /users


6.7. 扩展逻辑卷



LVM支持在线扩容,示例如下:

扩展逻辑卷之前,先新建用户archlinux,其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录:

[root@osyunwei ~]# useradd -d /users/archlinux archlinux[root@osyunwei ~]# su - archlinux[archlinux@osyunwei ~]$ cp -r /etc/pam.d /users/archlinux[archlinux@osyunwei ~]$ exit


扩展testlv至7G,要求archlinux用户的文件不能丢失:

[root@osyunwei ~]# lvextent -L 7G /dev/testvg/testlv或者:[root@osyunwei ~]# lvextent -L +2G /dev/testvg/testlv


重新调整在逻辑卷上创建的文件系统的大小:

[root@osyunwei ~]# resize2fs /dev/mapper/testvg-testlv

这就完成了对LV的扩展!


6.8. 缩减逻辑卷



    在CentOS 6上还不能在线缩容,需要先卸载、检测修复文件系统、缩减文件系统的大小、缩减逻辑卷LV的空间,最后再重新挂载。


要收缩testlv至3G,且要求archlinux用户的文件不能丢失,首先要卸载正在挂载的逻辑卷:

[root@osyunwei ~]# umount /dev/mapper/testvg-testlv


检测文件系统是否有发生错误:

[root@osyunwei ~]# e2fsck -f /dev/mapper/testvg-testlv


要缩减逻辑卷LV的空间,必须先把在逻辑卷上创建的文件系统的空间缩减(类比:减少桌子的面积之前要先把桌子上承载的东西减少,总之要要保证桌子有足够的空间盛放东西。):

[root@osyunwei ~]# resize2fs /dev/mapper/testvg-testlv 3G


承上,缩减逻辑卷的空间:

[root@osyunwei ~]# lvreduce -L 3G /dev/mapper/testvg-testlv


重新挂载:

[root@osyunwei ~]# mount /dev/mapper/testvg-testlv /users

这就完成了对LV的缩减。


6.9. 制作快照卷


对testlv创建快照,设置快照卷权限为只读,并尝试基于快照备份数据,验证快照的功能:

[root@osyunwei ~]# lvcreate -L 2G -p r -s -n testsnap /dev/mapper/testvg-testlv


挂载快照卷至/snapshot:

[root@osyunwei ~]# mkdir /snapshot[root@osyunwei ~]# mount /dev/mapper/testvg-testsnap /snapshot

这就完成了快照卷的制作。


6.10. 添加新的物理卷到卷组中


示例:添加/dev/sdb6

[root@osyunwei ~]# vgextend testvg /dev/sdb6  Physical volume "/dev/sdb6" successfully created  Volume group "testvg" successfully extended


6.11. 从卷组中删除一个物理卷


示例:删除/dev/sdc5


要从卷组中删除一个物理卷,就需要确认要删除的物理卷(/dev/sdc5)没有被任何逻辑卷正在使用,就要使用pvdisplay命令察看一个该物理卷(/dev/sdc5)信息:

[root@osyunwei ~]# pvdisplay /dev/sdc5  --- Physical volume ---  PV Name               /dev/sdc5  VG Name               testvg  PV Size               10.00 GiB / not usable 4.51 MiB  Allocatable           yes   PE Size               16.00 MiB  Total PE              640  Free PE               320  Allocated PE          320  PV UUID               PF77Xl-Xj8V-rD2L-c9Px-c60I-s6ey-tg42FA

   

很不凑巧!/dev/sdc5正被某个逻辑卷所使用,于是需要使用pvmove把要移除的PV(/dev/sdc5)上已占用的PE上的数据移至其他PV未占用的PE上:

[root@osyunwei ~]# pvmove /dev/sdc5  /dev/sdc5: Moved: 0.0%  /dev/sdc5: Moved: 14.4%  /dev/sdc5: Moved: 29.1%  /dev/sdc5: Moved: 43.4%  /dev/sdc5: Moved: 58.1%  /dev/sdc5: Moved: 60.0%  /dev/sdc5: Moved: 74.7%  /dev/sdc5: Moved: 89.4%  /dev/sdc5: Moved: 100.0%


再查看一下/dev/sdc5的详细信息:

[root@osyunwei ~]# pvdisplay /dev/sdc5  --- Physical volume ---  PV Name               /dev/sdc5  VG Name               testvg  PV Size               10.00 GiB / not usable 4.51 MiB  Allocatable           yes   PE Size               16.00 MiB  Total PE              640  Free PE               640  Allocated PE          0  PV UUID               PF77Xl-Xj8V-rD2L-c9Px-c60I-s6ey-tg42FA

   

不错~要删除的物理卷/dev/sdc5已经没被任何逻辑卷所使用了,所以大胆删除吧:

[root@osyunwei ~]# vgreduce testvg /dev/sdc5  Removed "/dev/sdc5" from volume group "testvg"


7. LVM总结


7.1. LVM优点


(1) 支持逻辑卷LV、卷组VG边界动态扩展或缩减

(2) 支持快照功能;

(3) 文件系统建立在逻辑卷LV之上,因此文件系统可跨分区,尤其是对于大系统需要使用很多块硬盘来说更能方便管理,并且可随时根据使用情况对逻辑卷进行在线扩展,而不需要在存储空间不够用时重新分区、格式化、挂载和拷贝数据等。对大系统来说,使用LVM主要是方便管理、增加了系统的可拓展性。

(4) 管理员可对卷组VG、逻辑卷LV按照组的方式进行命名、管理和分配,例如根据用途可将VG或LV命名为:"development"和"sales"等,而不是使用物理磁盘名"sda"和"sdb"等。


7.2. LVM缺点


(1) 相比于传统的磁盘分区来说,LVM安装配置略复杂,但影响不大;

(2) 如果误删数据的话,做数据恢复难度较大,因为LVM系统使用的是逻辑分区(逻辑卷),所以Linux使用者并不知道数据在底层硬盘上如何存储。但从根本上来说,这是用户自身问题,不是LVM技术本身的问题。


改进思路(纯属个人想法):

构建一个追踪机制,因为VGDA通过PEID、LEID寻址这一过程,因此可以设法利用VGDA中的元数据去追踪某一卷组在底层存储硬盘的物理位置,再做数据恢复。



本文出自 “Tab” 博客,请务必保留此出处http://xuweitao.blog.51cto.com/11761672/1899072