LVM是Logical Volume Manager(逻辑卷管理)的简写,它是LINUX环境下对磁盘分区进行管理的一种机制,LVM利用Linux内核的device-mapper来实现存储系统的虚拟化(系统分区独立于底层硬件)。LVM重点在于可以弹性的调整文件系统的容量,而并非在于性能与数据安全上面(这些是RAID的功能).通过LVM,可以实现存储空间的抽象化并在上面建立虚拟分区(virtual partitions),可以更简便地扩大和缩小分区,在增删分区时无需担心某个硬盘上没有足够的连续空间,可以整合多个物理分区在一起,让这些分区看起来就像是一个磁盘一样,而且,还可以将其他物理分区加入或者从这个LVM管理的磁盘中删除,如此一来,在整个磁盘空间使用上,相当的有弹性。

LVM的基本组成块(building blocks)如下:

  • 物理卷Physical volume (PV):

    可以在上面建立卷组的块设备,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file ) 。实际的分区需要调整系统标识符(System ID)成为8e(LVM的标识符),然后再经过pvcreate的命令将它转换成LVM最底层的物理卷(PV),之后才能将这些PV加以利用,而调整SystemID的方法就是通过fdisk,物理卷包括一个特殊的header,其余部分被切割为一块块物理区域(physical extents)。

  • 物理扩展Physical extent (PE):硬盘可供指派给逻辑卷的最小单位(通常为4MB)

    LVM默认使用4MB大小的PE块,而LVM的VG最多仅能含有65534个PE,因此默认最大256G。PE是整个LVM最小的存储块,这个有点类似与文件系统的block,所有文件的写入都由PE来完成.

  • 卷组Volume group (VG):将一组物理卷组合成为一个管理单元

    所谓的LVM大磁盘就是将许多PV整合成这个VG,所以VG就是LVM组合PV形成的大磁盘。那么这个大磁盘最大可以达到多少容量呢?这与PE有关,因为每个VG最多仅能包含65534个PE。如果使用LVM默认的参数,则一个VG最大可以达到256GB的容量.

  • 逻辑卷Logical volume (LV):虚拟分区,由物理区域(physical extents)组成

    最终的VG还会被切成LV,这个LV就是最后可以被格式化使用,类似于分区。LV的设备文件提供了对lv的的访问,LV的设备文件名通常是:

    /dev/VG_NAME/LV_NAME

    /dev/mapper/VG_NAME-LV_NAME

  • 逻辑扩展—LE(Logical Extent)

    逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。在同一个卷组中,LE的大小和PE是相同的,并且--对应。

LVM可以弹性更改文件系统的容量,这个怎么办到的呢,其实就是通过交换PE来进行的,将原本LV内的PE转移到其他设备中以降低LV容量,或将其他设备的PE加到此LV中加大容量.通过PV,VG,LV的规划后,再利用mkfs就可以将你的LV格式化成可利用的文件系统。

优点

  • 比起正常的硬盘分区管理,LVM更富于弹性:

  • 使用卷组(VG),使众多硬盘空间看起来像一个大硬盘。

  • 使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区。

  • 可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小。

  • 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。

  • 可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作。LVM上的文件系统也需要重新调整大小,某些文件系统也支持这样的在线操作。

  • 无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上。

  • 允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小。

缺点

  • 在系统设置时需要更复杂的额外步骤。

-------------LVM实作流程-------------------

  1. 先分2个分区,每个分区容量均为10G,调整Sytem ID为8e

  2. 全部分区整合为一个VG,VG名称为testVG,且PE大小为16MB

  3. 全部的VG容量都丢给LV,LV的名称为testLV

  4. 将这个LV格式化为ext4的文件系统,且挂载在/mnt/lvm中

准备分区------------------:

查看系统中可用的硬盘:

[root@localhost ~]# ls -l /dev/sd*
brw-rw----. 1 root disk 8,  0 Mar  5 03:30 /dev/sda
brw-rw----. 1 root disk 8,  1 Mar  5 03:30 /dev/sda1
brw-rw----. 1 root disk 8,  2 Mar  5 03:30 /dev/sda2
brw-rw----. 1 root disk 8, 16 Mar  5 03:30 /dev/sdb
brw-rw----. 1 root disk 8, 32 Mar  5 03:30 /dev/sdc

准备分区并调整分区System ID 为 8e,分区结果:

[root@localhost ~]# fdisk /dev/sdb
  Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  8e  Linux LVM
[root@localhost ~]# fdisk /dev/sdc
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1        1306    10490413+  8e  Linux LVM

PV价段相关的命令-----------:

  • pvcreate:将物理分区新建成为PV

  • pvscan:查询当前系统里面任何具有pv的磁盘

  • pvdisplay:显示系统上的PV状态

  • pvs : 简略查看所有物理卷的状况

  • pvremove:将PV属性删除,让该分区不具有PV属性

  • lvmdiskscan: 扫描用可作物理卷的块设备

  • pvresize :重新设置物理卷的大小可以在LVM正在使用物理卷的时候使用这个命令

  • pvremove: 删除物理卷,当物理卷里的扩展没有被使用时可以删除

  • pvchange :改变LV的属性

             防止一个或者多个物理卷的剩余空间进行物理扩展分配pvchange -x {n|y}   pv分区

             -x, --allocatable {y|n} : 允许或不允许分配物理扩展

             -x y 允许在之前禁止进行分配的地方分配扩展

查看当前系统中具有pv的设备:

[root@localhost ~]# pvscan
  No matching physical volumes found

使用刚创建的两个分区创建pv:

[root@localhost ~]# pvcreate /dev/sd{b,c}1
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdc1" successfully created

再次查看当前系统中具有pv的设备:

[root@localhost ~]# pvscan
  PV /dev/sdb1                      lvm2 [10.00 GiB]
  PV /dev/sdc1                      lvm2 [10.00 GiB]
  Total: 2 [20.01 GiB] / in use: 0 [0   ] / in no VG: 2 [20.01 GiB]

上面分别显示的是每个PV的信息与系统所有PV的信息,尤其最后一行,显示的是:

整体PV的量 / 已经被使用到VG的PV量 / 剩余的PV量

其实就是一个物理分区,将它变成了LVM的物理逻辑卷,供以后去用的。

显示PV的简略信息:

[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize  PFree
  /dev/sdb1       lvm2 a--  10.00g 10.00g
  /dev/sdc1       lvm2 a--  10.00g 10.00g

           PV    :实际的分区设备名

           VG    :因为尚未分配出去,所以还是空白

           Fmt   :物理卷的元数据格式(lvm2或者lvm1)和lvm的版本有关

           Attr  :物理卷的状态:可分配(a)或者导出的(x)

           PSize :物理卷的容量说明

           PFree :物理卷空闲容量

更加详细的列出系统上面每个PV的信息:

[root@localhost ~]# pvdisplay
  "/dev/sdb1" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1     <--实际的分区设备名
  VG Name                             <--因为尚未分配出去,所以还是空白
  PV Size               10.00 GiB     <--容量说明
  Allocatable           NO            <--是否已经被分配给VG
  PE Size               0             <--在此PV内的PE大小,因为尚未创建VG,所以是0
  Total PE              0             <--共分出几个PE
  Free PE               0             <--剩余还有多少个PE,也就是没有被LV用掉的PE数量
  Allocated PE          0             <--可被分配出去的PE数量(实际能不能被分配看这个参数)
  PV UUID               x4Wak9-RB8t-9gbQ-f2M6-uSgA-I3A1-9Uw1Lb
                                                                                                                                                                                                                                                                                                                                              
  "/dev/sdc1" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc1
  VG Name    
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               zIs9mx-crfV-3ECe-HWMm-3w4j-sWwe-ZF6N4O

VG价段相关的命令-----------:

  • vgcreate:新建VG的命令,它的参数比较多

  • vgs: 查看vg的摘要信息  

  • vgscan:查看系统上是否有VG存在

  • vgdisplay:显示目前系统上面的VG状态

  • vgextend:在VG内增加额外的PV  vgextend VGNAME PV的设备文件名

  • vgreduce:在VG内删除PV        vgreduce VGNAME PV的设备文件名

  • vgchange:vgchange –a {y|n} VGNAME 使卷组激活或使卷组失效

  • vgremove:删除一个VG(删除不包含逻辑卷的卷组)

  • vgmerge:合并卷组

  • vgsplit:分割卷组

  • vgrename重命名卷组vgrename vgrename /dev/vg0 /dev/my_vloume_group

  • vgexport 和vgimport :将卷组移动到其它系统中

  • vgmknodes :重新创建卷组目录和逻辑卷专用文件

  • vfcrestore:备份卷组元数据,还可为卷组中的所有物理卷从归档中恢复卷组的元数据

                  每次修改卷组和逻辑卷配置时都会自动进行元数据备份和归档

                  元数据备份保存在/etc/lvm/backup文件中

                  元数据归档保存在/etc/lvm/archives中

PV的名字就是设备文件名,而VG是可自己设置名字的。

vgcreate [-s N[mgt]] VG名称 PV名称

               -s:后接PE大小,单位可以是m,g,t(大小写均可)

创建名为testVG的VG:

[root@localhost ~]# vgcreate -s 8M  testVG  /dev/sd{b,c}1
  Volume group "testVG" successfully created

查看当前系统上是否有VG:

[root@localhost ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "testVG" using metadata type lvm2

可以看到Fmt元数据类型为lvm2

查看VG的摘要信息:

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  testVG   2   0   0 wz--n- 20.00g 20.00g

Attr卷组的状态:

       w:可写入

       r:只读

       z:可重新定义大小

       x:导出的

       p:不完整的

       c:群集的

更加详细的列出系统上面每个VG的信息:

[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               testVG        <--卷组名称
  System ID                           <--lvm的系统ID
  Format                lvm2          <--卷组的元数据格式
  Metadata Areas        2             <--元数据所在位置
  Metadata Sequence No  1  
  VG Access             read/write
  VG Status             resizable     <--VG的状态 可以使用vgchange改变
  MAX LV                0
  Cur LV                0             <--当前卷中的LV数
  Open LV               0
  Max PV                0
  Cur PV                2             <--当前VG中包含多少个PV
  Act PV                2             <--活动的pv
  VG Size               20.00 GiB     <--vg的大小 等于所在pv相加
  PE Size               8.00 MiB      <--pe的尺寸
  Total PE              2560          <--当前卷中所包含的PE
  Alloc PE / Size       0 / 0         <--pv的使用比例
  Free  PE / Size       2560 / 20.00 GiB   <--卷组中可用物理扩展数目
  VG UUID               RgaF3G-LTrg-gXQZ-NMdq-MnhX-Wgho-ra0Mil

最后三行指的就是能够使用的PE情况,由于尚未切分出LV,所以是所有的PE均可自由使用

创建了VG以后再次使用pvdsiplay查看pv:

[root@localhost ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               testVG
  PV Size               10.00 GiB / not usable 4.54 MiB
  Allocatable           yes
  PE Size               8.00 MiB
  Total PE              1280
  Free PE               1280
  Allocated PE          0
  PV UUID               x4Wak9-RB8t-9gbQ-f2M6-uSgA-I3A1-9Uw1Lb
                                                                                                                                                                                                                                                                                                    
  --- Physical volume ---
  PV Name               /dev/sdc1
  VG Name               testVG
  PV Size               10.00 GiB / not usable 4.54 MiB
  Allocatable           yes
  PE Size               8.00 MiB
  Total PE              1280
  Free PE               1280
  Allocated PE          0
  PV UUID               zIs9mx-crfV-3ECe-HWMm-3w4j-sWwe-ZF6N4O

再创建了VG以后,就可以查看pe的大小了

LV阶段相关命令————–:

创造出VG这个大磁盘后,接下来为这个创建lv并对其进行分区,通过LV功能来处理。

  • lvcreate:新建LV

  • lvscan:查询系统上面的LV

  • lvremane:重新命名逻辑卷   lvrename vg0 lvold lvnew

  • lvs: 查看lv的摘要信息  

  • lvdisplay:显示系统上面的LV状态

  • lvextend:在LV里面增加容量

  • lvreduce:在LV里面减少容量

  • lvremove:删除一个LV

  • lvchange :修改逻辑卷组的参数 lvchange -a {y|n}使lv生效或失效

  • lvresize:对LV进行容量大小的调整

lvcreate [-L N[mgt]] [-n LV名称] VG名称

lvcreate [-l N] [-n LV名称] VG名称

               -L:后面接容量,单位是m,g,t(大小写均可),要注意的是这个数必须是PE大小

                       的整 数倍。

               -l:后面接PE的个数,而不是容量

              -n:后面接LV的名称

查看PV的大小:

[root@localhost ~]# vgdisplay  |  grep 'Total PE'
  Total PE              2560

创建一个大小为10G的LV:

[root@localhost ~]# lvcreate -L 10G  -n testLV testVG
  Logical volume "testLV" created

查看LV的摘要信息:

[root@localhost ~]# lvs
  LV     VG     Attr      LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
  testLV testVG -wi-a---- 10.00g

Attr逻辑卷的状态:

           字节1:卷类型 :镜像m ,不带初始同步的镜像M,源o ,pvmove p, 快照s ,不可用快照s,虚拟v

           字节2:权限 可写入w 只读r

           字节3:分配策略 持续c,正常n,任意a ,继承i,

           字节4:固定的副号码m

           字节5:激活a ,暂停s,不可用快照l,不可用暂停快照S,不带表格的映射d,还有i

           字节6:设备开放o

更加详细的列出系统上面每个LV的信息

[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/testVG/testLV  <--LV的设备路径
  LV Name                testLV              <--LV的名字
  VG Name                testVG              <--卷组名
  LV UUID                raOisN-DzwI-bKRV-bu1a-fAJm-M53L-5y26Dh
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2014-03-05 04:20:45 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             1280                <--LE的大小和PE一一对应
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

VG的名称为testVG,但是LV要用全名,而不是lv的名称testLV:

/dev/testVG/yidaolv或/dev/mapper/testVG-testLV

[root@localhost ~]# ls -l /dev/{mapper/testVG-testLV,testVG/testLV}
lrwxrwxrwx. 1 root root 7 Mar  5 04:20 /dev/mapper/testVG-testLV -> ../dm-0
lrwxrwxrwx. 1 root root 7 Mar  5 04:20 /dev/testVG/testLV -> ../dm-0

可以看到她们都是链接文件,它们都指向/dev/下以dm开头的文件

查看系统识别的lvm设备其实是以dm开头的设备:

[root@localhost ~]# cat /proc/partitions
major minor  #blocks  name
   8       16  125829120 sdb
   8       17   10490413 sdb1
   8        0  125829120 sda
   8        1     204800 sda1
   8        2   51200000 sda2
   8       32  125829120 sdc
   8       33   10490413 sdc1
 253        0   10485760 dm-0

接下来,我对LV进行分区格式化并挂载:

[root@localhost ~]# mke2fs  -t ext4 /dev/testVG/testLV
[root@localhost ~]# mount -t ext4 /dev/testVG/testLV /backup/
[root@localhost ~]# df -lh /backup/
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/testVG-testLV
                      9.9G  151M  9.2G   2% /backup