LVM是什么?

  LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组(volume group),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:“development”和“sales”,而不是使用物理磁盘名“sda”和“sdb”。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。

  LVM有什么用?

  每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。因为如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬盘、重新对硬盘分区,然后恢复数据到新分区。

  虽然现在有很多动态调整磁盘的工具可以使用,例如Partation Magic等等,但是它并不能完全解决问题,因为某个分区可能会再次被耗尽;另外一个方面这需要重新引导系统才能实现,对于很多关键的服务器,停机是不可接受的,而且对于添加新硬盘,希望一个能跨越多个硬盘驱动器的文件系统时,分区调整程序就不能解决问题。

  因此完美的解决方法应该是在零停机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。幸运的是Linux提供的逻辑盘卷管理(LVM,Logical Volume Manager)机制就是一个完美的解决方案。

  LVM基本术语

  LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。首先我们讨论以下几个LVM术语:

  物理存储介质(The physical media)

  这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元。

  物理卷(physical volume)

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

  卷组(Volume Group)

  LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。

  逻辑卷(logical volume)

  LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。

  PE(physical extent)

  每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。

  LE(logical extent)

  逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

  【以上资料为收集整理】

  阿权的实例对比说明:

  你有一个硬盘A,对其分了三个分区,a1 a2 a3,在不使用LVM的情况下,a1的盘满了,你可以有两个解决方法:

  1 调整分区大小,比如使用PQ

  2 加硬盘B,挪动a1的文件到B

  但这两个解决方案都需要停机,或者修改程序等处理

  如果是用LVM,则有以下便利,都不用重启:

  1 随时调整a1 a2 a3的大小关系

  2 增加硬盘B,让其和a1是一起,把a1的空间直接扩展到B,也就是你加了一个硬盘就直接可以增加到一个旧的分区里

  那LVM是怎么做的呢?

  先看看类似的关系:

  普通情况:硬盘 -> 分区

  LVM情况:硬盘 -> 分区(pv) -> 组合成卷组(vg) -> 分割成逻辑卷(lv)

 通俗点,LVM其实就是把不同的几个硬盘或者分区合成一个硬盘模样,然后再分区 :-)

  第一步,创建pv

  LVM的分区和普通分区有如下区别:

  引用

   Device Boot   Start     End   Blocks  Id System

  /dev/hdb1        1     200   100768+ 8e Linux LVM

  /dev/hdb2       201     400   100800  8e Linux LVM

  /dev/hdb3       401     600   100800  83 Linux

  /dev/hdb4       601    4063   1745352  8e Linux LVM

  Id是不一样的,8e(LVM)和83(普通)的区别

  下面我们把hdb3改成LVM的:

  编辑hdb:fdisk /dev/hdb

  输入t来修改Id:t

  修改的是第三个分区:3

  输入:8e

  输入:w 就可以更新了,就这么简单

  然后创建pv,命令很好记的:

  pvcreate /dev/hdb3 这样就创建pv了

  这几个角色都很简单:

  [pv/vg/lv][create/display/...]

  他们几个的组合,创建和显示信息用的

  比如你可以打出 pvdisplay,就可以显示当前所有的pv

  引用

  [root@localhost ~]# pvdisplay

  --- Physical volume ---

  PV Name        /dev/hda2

  VG Name        VolGroup00

  PV Size        2.81 GB / not usable 0 

  Allocatable      yes

  PE Size (KByte)    32768

  Total PE       90

  Free PE        1

  Allocated PE     89

  PV UUID        YPd52M-lkoY-JlL1-V72Y-Dm2Y-forw-k4ENxr

  --- NEW Physical volume ---

  PV Name        /dev/hdb1

  VG Name       

  PV Size        96.00 MB

  Allocatable      NO

  PE Size (KByte)    0

  Total PE       0

  Free PE        0

  Allocated PE     0

  PV UUID        rnqIYW-O9Ds-veSk-bDL6-mscX-PLTR-seT51x

  省略...

  NEW Physical volume其实就是还没有使用的pv,可以组合成vg

  第二步:创建vg

  看我们的步骤:硬盘 -> 分区(pv) -> 组合成卷组(vg)

  [root@localhost ~]# vgcreate aslibra /dev/hdb1 /dev/hdb2

  Volume group "aslibra" successfully created

  创建了一个aslibra的vg,由/dev/hdb1 /dev/hdb2两个来组合的

  我们看看vgdisplay:

  引用

  [root@localhost ~]# vgdisplay

  --- Volume group ---

  VG Name        aslibra

  System ID      

  Format        lvm2

  Metadata Areas    2

  Metadata Sequence No 1

  VG Access       read/write

  VG Status       resizable

  MAX LV        0

  Cur LV        0

  Open LV        0

  Max PV        0

  Cur PV        2

  Act PV        2

  VG Size        184.00 MB

  PE Size        4.00 MB

  Total PE       46

  Alloc PE / Size    0 / 0 

  Free PE / Size    46 / 184.00 MB

  VG UUID        abDf0D-NCPP-pUYs-JtT3-2H6X-oAuz-KxL6dD

  --- Volume group ---

  VG Name        VolGroup00

  System ID      

  Format        lvm2

  Metadata Areas    1

  Metadata Sequence No 3

  VG Access       read/write

  VG Status       resizable

  MAX LV        0

  Cur LV        2

  Open LV        2

  Max PV        0

  Cur PV        1

  Act PV        1

  VG Size        2.81 GB

  PE Size        32.00 MB

  Total PE       90

  Alloc PE / Size    89 / 2.78 GB

  Free PE / Size    1 / 32.00 MB

  VG UUID        vOYgX6-VYFz-FjWE-SueG-bqiZ-0kLU-5w73Hd

  VolGroup00是系统安装的时候使用LVM而创建的,aslibra就是我创建的了

  为了立即使用卷组而不是重新启动系统,可以使用vgchange来激活卷组:

  #vgchange -a y aslibra

  第三步:有了vg,创建你想要的分区:

  引用

  [root@localhost ~]# lvcreate -L 100M -n web aslibra

  Logical volume "web" created

  具体可以看看帮助 lvcreate -h

  上面已经创建了一个lv了,也就是有了一个逻辑分区了,100M的大小,已经完成了,LVM的创建过程到此已经完毕。

  引用

  [root@localhost ~]# lvdisplay

  --- Logical volume ---

  LV Name        /dev/aslibra/web

  VG Name        aslibra

  LV UUID        2p9cLF-44jl-jEnm-31xf-fNob-tBFU-nHtd8R

  LV Write Access    read/write

  LV Status       available

  # open         0

  LV Size        100.00 MB

  Current LE       25

  Segments        2

  Allocation       inherit

  Read ahead sectors   0

  Block device      253:2

  --- Logical volume ---

  LV Name        /dev/VolGroup00/LogVol00

  VG Name        VolGroup00

  LV UUID        Fb2hoE-IVGi-4UVM-Jcv1-95N1-4tQK-I8ieGr

  省略...

  看一下路径:

  /dev/aslibra/web = /设备/VG/LV

  你创建的VG和LV都是这样访问的

  LVM的使用

  上面已经创建LVM了,使用还是很简单的:

  先是得格式化一个分区 mke2fs /dev/aslibra/web

  然后挂载使用:

  引用

  [root@localhost ~]# mkdir /tmp/web

  [root@localhost ~]# mount /dev/aslibra/web /tmp/web/

  [root@localhost ~]# df -h

  Filesystem      Size Used Avail Use% Mounted on

  /dev/mapper/VolGroup00-LogVol00

  2.3G 1.2G 980M 56% /

  /dev/hda1       99M 8.9M  85M 10% /boot

  none         125M   0 125M  0% /dev/shm

  /dev/mapper/aslibra-web

   97M 1.6M  91M  2% /tmp/web

  (貌似 /dev/mapper/aslibra-web 等同 /dev/aslibra/web,具体可以查阅更多)

  我们看看pv/vg/lv都有哪些目录,按pv然后按tab:

  引用

  [root@localhost ~]# pv

  pvchange  pvcreate  pvdisplay pvmove   pvremove  pvresize  pvs    pvscan  

  [root@localhost ~]# vg

  vgcfgbackup  vgchange   vgconvert   vgdisplay   vgextend   vgmerge    vgreduce   vgrename   vgscan    

  vgcfgrestore vgck     vgcreate   vgexport   vgimport   vgmknodes   vgremove   vgs      vgsplit   

  [root@localhost ~]# lv

  lvchange   lvdisplay  lvm     lvmdiskscan lvmsar    lvreduce   lvrename   lvs     

  lvcreate   lvextend   lvmchange  lvmsadc   lvm.static  lvremove   lvresize   lvscan

  假设web目录满了,需要加空间,那就可以这样:

  引用

  [root@localhost ~]# lvextend -L +10M /dev/aslibra/web

  Rounding up size to full physical extent 12.00 MB

  Extending logical volume web to 112.00 MB

  Logical volume web successfully resized

  [root@localhost ~]# lvdisplay

  --- Logical volume ---

  LV Name        /dev/aslibra/web

  VG Name        aslibra

  LV UUID        2p9cLF-44jl-jEnm-31xf-fNob-tBFU-nHtd8R

  LV Write Access    read/write

  LV Status       available

  # open         1

  LV Size        112.00 MB

  省略....

  已经调整过来了,但是

  引用

  [root@localhost ~]# df -h

  Filesystem      Size Used Avail Use% Mounted on

  /dev/mapper/VolGroup00-LogVol00

  2.3G 1.2G 980M 56% /

  /dev/hda1       99M 8.9M  85M 10% /boot

  none         125M   0 125M  0% /dev/shm

  /dev/mapper/aslibra-web

   97M 1.6M  91M  2% /tmp/web

  再加10M也是一样的:

  lvextend -L +10M /dev/aslibra/web

  这里还没有调整过来,还需要工具来调整更新一下分区: