一、 前言
LVM是逻辑卷管理(Logical Volume Manager)的简称,它是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,与直接使用物理存储在管理上相比,提供了更好灵活性。
LVM将存储虚拟化,使用逻辑卷,你不会受限于物理磁盘的大小,另外,与硬件相关的存储设置被其隐藏,你可以不用停止应用或卸载文件系统来调整卷大小或数据迁移.这样可以减少操作成本.
LVM与直接使用物理存储相比,有以下优点:
1. 灵活的容量.
当使用逻辑卷时,文件系统可以扩展到多个磁盘上,你可以聚合多个磁盘或磁盘分区成单一的逻辑卷.

2.可伸缩的存储池.
你可以使用简单的命令来扩大或缩小逻辑卷大小,不用重新格式化或分区磁盘设备.

3.在线的数据再分配.
你可以在线移动数据,数据可以在磁盘在线的情况下重新分配.比如,你可以在线更换可热插拔的磁盘.

4. 方便的设备命名
逻辑卷可以按你觉得方便的方式来起任何名称.

5.磁盘条块化.
你可以生成一个逻辑盘,它的数据可以被条块化存储在2个或更多的磁盘上.这样可以明显提升数据吞吐量.

6.镜像卷
逻辑卷提供方便的方法来镜像你的数据.

7.卷快照
使用逻辑卷,你可以获得设备快照用来一致性备份或者测试数据更新效果而不影响真实数据.

二、 LVM基本术语
前面谈到,LVM是在物理存储上添加的一个逻辑层,来为文件系统屏蔽下面的硬件存储设备,提供了一个抽象的盘卷,在盘卷上建立文件系统。首先我们讨论以下几个LVM术语:

* 物理存储介质(The Physical Media)
这里指系统的存储设备,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元。

* 物理卷(PV, Physical Volume)
物理卷就是指磁盘,磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。当前LVM允许你在每个物理卷上保存这个物理卷的0至2份元数据拷贝.默认为1,保存在设备的开始处.为2时,在设备结束处保存第二份备份.

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

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

*线性逻辑卷 (Linear Volumes)
一个线性逻辑卷聚合多个物理卷成为一个逻辑卷.比如,如果你有两个60GB硬盘,你可以生成120GB的逻辑卷.

*条块化的逻辑卷(Striped Logical Volumes)
当你写数据到此逻辑卷中时,文件系统可以将数据放置到多个物理卷中.对于大量连接读写操作,它能改善数据I/O效率.

*镜像的逻辑卷(Mirrored Logical Volumes)
镜像在不同的设备上保存一致的数据.数据同时被写入原设备及镜像设备.它提供设备之间的容错。

*快照卷(Snapshot Volumes)
快照卷提供在特定瞬间的一个设备虚拟映像,当快照开始时,它复制一份对当前数据区域的改变,由于它优先执行这些改变,所以它可以重构当前设备的状态。

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

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

和非LVM系统将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷起始处的VGDA(卷组描述符区域)中。VGDA包括以下内容: PV描述符、VG描述符、LV描述符、和一些PE描述符 。系统启动LVM时激活VG,并将VGDA加载至内存,来识别LV的实际物理存储位置。当系统进行I/O操作时,就会根据VGDA建立的映射机制来访问实际的物理位置。

三、 安装LVM
首先确定系统中是否安装了lvm工具:
[root@test2 root]# rpm ?qa|grep lvm
lvm-x-x-x
如果命令结果输入类似于上例,那么说明系统已经安装了LVM管理工具;如果命令没有输出则说明没有安装LVM管理工具,则需要从网络下载或者从光盘装LVM rpm工具包。

安装了LVM的RPM软件包以后,要使用LVM还需要配置内核支持LVM。RedHat默认内核是支持LVM的,如果需要重新编译内核,则需要在配置内核时,进入Multi-device Support (RAID and LVM)子菜单,选中以选项:
 

    • Multiple devices driver support (RAID and LVM)
         Device mapper support 
           Snapshot target (EXPERIMENTAL) 
           Mirror target (EXPERIMENTAL)                                                           
      然后重新编译内核,即可将LVM的支持添加到新内核中。

      为了使用LVM,要确保在系统启动时激活LVM,在RedHa的版本中,系统启动脚本已经具有对激活LVM的支持,在/etc/rc.d/rc.sysinit中有以下内容:
       
      if [ -x /sbin/lvm.static ]; then
                action $"Setting up Logical Volume Management:" /sbin/lvm.static vgchange -a y --ignorelockingfailure
      fi
      vgchange -a y命令激活系统所有卷组。

      四、 创建和管理LVM
      要创建一个LVM系统,一般需要经过以下步骤:
      1、 创建分区
      使用分区工具(如:fdisk等)创建LVM分区,方法和创建其他一般分区的方式是一样的,区别仅仅是LVM的分区类型为8e。
      # fdisk -l /dev/sdb /dev/sdc
      Disk /dev/sdb: 18.2 GB, 1820073Array840 bytes
      255 heads, 63 sectors/track, 2212 cylinders
      Units = cylinders of 16065 * 512 = 8225280 bytes
      Disk /dev/sdb doesn’t contain a valid partition table
      Disk /dev/sdc: 18.2 GB, 1820073Array840 bytes
      255 heads, 63 sectors/track, 2212 cylinders
      Units = cylinders of 16065 * 512 = 8225280 bytes
      Device Boot      Start         End      Blocks   Id  System
      /dev/sdc1               1         200     1606468+  8e  Linux LVM
      如果要将使用整块盘,可以通过下面的命令来覆盖磁盘上的原有分区信息:
      #dd if=/dev/zero of=/dev/sdc bs=512 count=1
        
      2、 创建物理卷
      创建物理卷的命令为pvcreate,利用该命令将希望添加到卷组的所有分区或者磁盘创建为物理卷。将整个磁盘创建为物理卷的命令为:
      # pvcreate /dev/sdb
      Physical volume "/dev/sdb" successfully created
        
      将单个分区创建为物理卷的命令为:
      # pvcreate /dev/sdc1
      Physical volume "/dev/sdc1" successfully created
      也可以同时生成多个卷:
      #pvcreate /dev/sdb /dev/sdc1

      3、扫描块设备
      通过lvmdiskscan可以看到那些设备成为了物理卷.
      #lvmdiskscan
        /dev/ramdisk             [       16.00 MB] 
        /dev/sda                 [        4.00 GB] 
        /dev/root                [        2.88 GB] 
        /dev/ram                 [       16.00 MB] 
        /dev/sda1                [      101.Array4 MB] 
        /dev/VolGroup00/LogVol01 [        1.00 GB] 
        /dev/ram2                [       16.00 MB] 
        /dev/sda2                [        3.Array0 GB] LVM physical volume
        /dev/lvm_test/test       [      508.00 MB] 
        /dev/ram3                [       16.00 MB] 
        /dev/ram4                [       16.00 MB] 
        /dev/ram5                [       16.00 MB] 
        /dev/ram6                [       16.00 MB] 
        /dev/ram7                [       16.00 MB] 
        /dev/ram8                [       16.00 MB] 
        /dev/ramArray                [       16.00 MB] 
        /dev/ram10               [       16.00 MB] 
        /dev/ram11               [       16.00 MB] 
        /dev/ram12               [       16.00 MB] 
        /dev/ram13               [       16.00 MB] 
        /dev/ram14               [       16.00 MB] 
        /dev/ram15               [       16.00 MB] 
        /dev/sdb                 [      512.00 MB] LVM physical volume
        /dev/sdc                 [      512.00 MB] LVM physical volume
        5 disks
        16 partitions
        2 LVM physical volume whole disks
        1 LVM physical volume

      4、显示物理卷
      可以使用pvs,pvscan,pvdisplay来显示当前系统中的物理卷.
      #pvs
        PV         VG         Fmt  Attr PSize   PFree  
        /dev/sda2  VolGroup00 lvm2 a-     3.88G      0 
        /dev/sdb   lvm_test   lvm2 a-   508.00M      0 
        /dev/sdc              lvm2 --   512.00M 512.00M
      #pvscan 
        PV /dev/sdb    VG lvm_test     lvm2 [508.00 MB / 0    free]
        PV /dev/sda2   VG VolGroup00   lvm2 [3.88 GB / 0    free]
        PV /dev/sdc                    lvm2 [512.00 MB]
        Total: 3 [4.87 GB] / in use: 2 [4.37 GB] / in no VG: 1 [512.00 MB]
      #pvdisplay
        --- Physical volume ---
        PV Name               /dev/sdb
        VG Name               lvm_test
        PV Size               512.00 MB / not usable 4.00 MB
        Allocatable           yes (but full)
        PE Size (KByte)       40Array6
        Total PE              127
        Free PE               0
        Allocated PE          127
        PV UUID               Pkp5Cq-SD1w-ANw2-cDDe-BGtw-nmFS-jTxXFD
         
        --- NEW Physical volume ---
        PV Name               /dev/sdc
        VG Name               
        PV Size               512.00 MB
        Allocatable           NO
        PE Size (KByte)       0
        Total PE              0
        Free PE               0
        Allocated PE          0
        PV UUID               BNCVEE-YWlK-0mrV-LOcf-0tCY-WWNw-DeySk0

      5、移除物理卷
      #pvremove /dev/sdc
      Labels on physical volume "/dev/sdc" successfully wiped

      6、 创建卷组
      创建卷组的命令为vgcreate,将使用pvcreate建立的物理卷创建为一个完整的卷组:
      # vgcreate lvm_test /dev/sdc1 /dev/sdb
      Volume group "lvm_test" successfully created
      vgcreate命令第一个参数是指定该卷组的逻辑名:lvm_test。后面参数是指定希望添加到该卷组的所有分区和磁盘。vgcreate在创建卷组 lvm_test 以外,还设置使用大小为4 MB的PE(默认为4MB),这表示卷组上创建的所有逻辑卷都以 4 MB 为增量单位来进行扩充或缩减。PE最小为1KB  ,并且必须总是1KB的 2^n 的倍数(使用-s指定,具体请参考man vgcreate)。

      7、 激活卷组
      卷组在创建时默认激活,也可以使用vgchange来激活卷组:
      # vgchange -a y lvm_test

      8、 添加新的物理卷到卷组中
      当系统安装了新的磁盘或新建分区并创建了新的物理卷,而要将其添加到已有卷组时,就需要使用vgextend命令:
      #fdisk -l /dev/sdc
      Disk /dev/sdc: 18.2 GB, 1820073Array840 bytes
      255 heads, 63 sectors/track, 2212 cylinders
      Units = cylinders of 16065 * 512 = 8225280 bytes
      Device Boot      Start         End      Blocks   Id  System
      /dev/sdc1               1         200     1606468+  8e  Linux LVM
      /dev/sdc2             201         400     1606500   8e  Linux LVM
               
      #pvcreate /dev/sdc2
      Physical volume "/dev/sdc2" successfully created
              
      # vgextend lvm_test /dev/sdc2
      Volume group "lvm_test" successfully extended
      这里/dev/sdc2是新的物理卷。

      Array、显示卷组
      显示卷组可以使用vgs和vgdisplay.
      # vgs
        VG         #PV #LV #SN Attr   VSize   VFree
        VolGroup00   1   2   0 wz--n-   3.88G    0 
        lvm_test     1   1   0 wz--n- 508.00M    0 

      # vgdisplay 
        --- Volume group ---
        VG Name               lvm_test
        System ID             
        Format                lvm2
        Metadata Areas        1
        Metadata Sequence No  10
        VG Access             read/write
        VG Status             resizable
        MAX LV                0
        Cur LV                1
        Open LV               1
        Max PV                0
        Cur PV                1
        Act PV                1
        VG Size               508.00 MB
        PE Size               4.00 MB
        Total PE              127
        Alloc PE / Size       127 / 508.00 MB
        Free  PE / Size       0 / 0   
        VG UUID               uJx24t-WWdY-vffu-Array7Of-mgFB-FEov-eRwzAf

      10、扫描磁盘生成缓存文件
      #vgscan
        Reading all physical volumes.  This may take a while...
        Found volume group "lvm_test" using metadata type lvm2
        Found volume group "VolGroup00" using metadata type lvm2
         
      11、 从卷组中删除一个物理卷
      要从一个卷组中删除一个物理卷,首先要确认要删除的物理卷没有被任何逻辑卷正在使用,就要使用pvdisplay命令察看一个该物理卷信息:
      #pvdisplay /dev/sdc2
      --- Physical volume ---
      PV Name               /dev/sdc2
      VG Name               lvm_test
      PV Size               1.53 GB / not usable 868.00 KB
      Allocatable           yes 
      PE Size (KByte)       40Array6
      Total PE              3Array2
      Free PE               3Array2
      Allocated PE          0 (表示未被使用)
      PV UUID               jAiils-1vRz-TdArrayk-1AiD-kIJs-1Array1z-YMz0ArrayH
        
      如果某个物理卷正在被逻辑卷所使用,就需要将该物理卷的数据备份到其他地方,然后再删除。删除物理卷的命令为vgreduce:
      # vgreduce lvm_test /dev/sdc2
      Removed "/dev/sdc2" from volume group "lvm_test"

      12、 创建逻辑卷
      创建逻辑卷的命令为lvcreate:
      # lvcreate -L 1500 ?n test lvm_test
      Logical volume "test" created
      该命令就在卷组lvm_test上创建名字为test,大小为1500M的逻辑卷,并且设备入口为/dev/lvm_test/test (lvm_test为卷组名,test为逻辑卷名)。如果希望创建一个使用全部卷组的逻辑卷,则需要首先察看该卷组的PE数,然后在创建逻辑卷时指定:
      # vgdisplay lvm_test| grep "Total PE"
      Total PE 4731
      # lvcreate -l 4731 lvm_test -n test
      Logical volume "test" created

      13、创建条块化的逻辑卷
      # lvcreate -L 500M -i2  -n test lvm_test
        Using default stripesize 64.00 KB
        Rounding size (125 extents) up to stripe boundary size (126 extents)
        Logical volume "test" created
      -i2指此逻辑卷在两个物理卷中条块化存放数据,默认一块大小为64KB.

      14、创建镜像的逻辑卷。
      #lvcreate -L 52M  -m1  -n test lvm_test /dev/sdb1 /dev/sdc1 /dev/sdb2 
        Logical volume "test" created
      -m1表示只生成一个单一镜像,镜像分别放在/dev/sdb1和/dev/sdc1上,镜像日志放在/dev/sdb2上.

      15、创建快照卷。
      #lvcreate --size 10 --snapshot --name snaptest /dev/lvm_test/test 
      16、 创建文件系统
      如使用ext3文件系统:
      #mkfs.ext3 /dev/lvm_test/test
      mke2fs 1.35 (28-Feb-2004)
      max_blocks 42Array4Array672Array5, rsv_groups = 0, rsv_gdb = 1024
      Filesystem label=
      OS type: Linux
      Block size=40Array6 (log=2)
      Fragment size=40Array6 (log=2)
      2424832 inodes, 4844544 blocks
      242227 blocks (5.00%) reserved for the super user
      First data block=0
      Maximum filesystem blocks=8388608
      148 block groups
      32768 blocks per group, 32768 fragments per group
      16384 inodes per group
      Superblock backups stored on blocks: 
      32768, Array8304, 163840, 22Array376, 2Array4Array12, 81Array200, 884736, 1605632, 2654208, 
      40Array6000
      Writing inode tables: done                            
      inode.i_blocks = Array0120, i_size = 4243456
      Creating journal (81Array2 blocks): done
      Writing superblocks and filesystem accounting information: done
      This filesystem will be automatically checked every 25 mounts or
      180 days, whichever comes first.  Use tune2fs -c or -i to override.
      创建了文件系统以后,就可以加载并使用它:
      # mkdir /mnt/test
      # mount /dev/lvm_test/test /mnt/test
      如果希望系统启动时自动加载文件系统,则还需要在/etc/fstab中添加内容:
      /dev/lvm_test/test /mnt/test ext3 defaults 1 2

      17、 删除一个逻辑卷
      删除逻辑卷以前首先需要将其卸载,然后删除:
      # umount /dev/lvm_test/test
      # lvremove /dev/lvm_test/test
      Do you really want to remove active logical volume "test"? [y/n]: y
      Logical volume "test" successfully removed
       
      18、 扩展逻辑卷大小
      LVM提供了方便调整逻辑卷大小的能力,扩展逻辑卷大小的命令是lvextend:
      # lvextend -L12G /dev/lvm_test/test
      Extending logical volume test to 12.00 GB
      Logical volume test successfully resized
        上面的命令就实现将逻辑卷test的大小扩大为12G。
      # lvextend -L+1G /dev/lvm_test/test
      Extending logical volume test to 13.00 GB
      Logical volume test successfully resized
      上面的命令就实现将逻辑卷test的大小增加1G。
      增加了逻辑卷的容量以后,就需要修改文件系统大小以实现利用扩充的空间。
      对于希望调整被加载的文件系统大小,使用ext2online(ext2resize) 或 resize2fs.
      #df -h
      # ext2online /dev/lvm_test/test
      ext2online /dev/lvm_test/test
      ext2online v1.1.18 - 2001/03/18 for EXT2FS 0.5b

      #df -h
      Filesystem            容量  已用 可用 已用% 挂载点
      /dev/mapper/VolGroup00-LogVol01
               16G   11G  3.6G  76% /
      /dev/sda1             4Array4M   18M  451M   4% /boot
      none                      506M     0  506M   0% /dev/shm
      /dev/mapper/lvm_test-test
               13G   63M   13G   1% /mnt/test
        
      一般建议最好将文件系统卸载,调整大小,然后再加载:
      # umount /dev/lvm_test/test
      #resize2fs /dev/lvm_test/test
      # mount  /dev/lvm_test/test /mnt/test

      1Array、 减少逻辑卷大小
      使用lvreduce即可实现对逻辑卷的容量,同样需要首先将文件系统卸载:
      # umount /mnt/test
      #e2fsck -f /dev/lvm_test/test
      # resize2fs /dev/lvm_test/test  11G
      # lvreduce -L -1.ArrayArray2G /dev/lvm_test/test (少2个PE的大小)
      # resize2fs /dev/lvm_test/test  (通过此命令确认是否文件系统大小与收缩后的逻辑卷大小匹配)
      # mount /dev/lvm_test/test /mnt/test

      20、显示逻辑卷
      通过lvscan,lvs及lvdisplay可以察看当前系统中存在的逻辑卷。
      # lvdisplay 
        --- Logical volume ---
        LV Name                /dev/VolGroup00/LogVol00
        VG Name                VolGroup00
        LV UUID                sPmLMD-6xq4-wStB-uSAP-jlQc-YKTm-3bt8Pc
        LV Write Access        read/write
        LV Status              available
        # open                 1
        LV Size                2.88 GB
        Current LE             Array2
        Segments               1
        Allocation             inherit
        Read ahead sectors     0
        Block device           253:0
        
      #lvscan 
      lvscan
        ACTIVE            ’/dev/VolGroup00/LogVol00’ [2.88 GB] inherit
        ACTIVE            ’/dev/VolGroup00/LogVol01’ [1.00 GB] inherit

      #lvs -o +devices
        LV       VG         Attr   LSize Origin Snap%  Move Log Copy%  Devices      
        LogVol00 VolGroup00 -wi-ao 2.88G                               /dev/sda2(0) 
        LogVol01 VolGroup00 -wi-ao 1.00G                               /dev/sda2(Array2)  

      21、使用过滤控制LVM的设备扫描
      通过编辑/etc/lvm/lvm.conf 中的filter段,来定义过滤那些设备要扫描。
      filter =[ "a|/dev/sd.*|", "a|/dev/hd.*|", "r|.*|" ] 
      上面对scsi及ide设备扫描,对其它设备均不扫描。

      22、在线数据迁移
      通过pvmove可以将一个PV上的数据迁移到新的PV上,也可以将PV上的某个LV迁移到另一个PV上。
      #lvs -o +devices
        LV       VG         Attr   LSize  Origin Snap%  Move Log Copy%  Devices      
        LogVol00 VolGroup00 -wi-ao  2.88G                               /dev/sda2(0) 
        LogVol01 VolGroup00 -wi-ao  1.00G                               /dev/sda2(Array2)
        test     lvm_test   -wi-ao 52.00M                               /dev/sdb1(0) 

      #pvmove -n test /dev/sdb1 /dev/sdc1

      #lvs -o +devices
        LV       VG         Attr   LSize  Origin Snap%  Move Log Copy%  Devices      
        LogVol00 VolGroup00 -wi-ao  2.88G                               /dev/sda2(0) 
        LogVol01 VolGroup00 -wi-ao  1.00G                               /dev/sda2(Array2)
        test     lvm_test   -wi-ao 52.00M                               /dev/sdc1(0) 

      23、删除卷组
      按照顺序卸载文件系统,删除逻辑卷,然后删除卷组。
      #umount /mnt/test
      # lvremove /dev/lvm_test/test
      Do you really want to remove active logical volume "test"? [y/n]: y
        Logical volume "test" successfully removed
      #vgremove lvm_test
        Volume group "lvm_test" successfully removed
      24、故障排查
      通过在命令后加 -v,-vv,-vvv或-vvvv来获得更详细的命令输出。
      通过在lvs,vgs后加-P可以更好的查看失败设备.
      #vgs -a -o +devices -P
        Partial mode. Incomplete volume groups will be activated read-only.
        VG         #PV #LV #SN Attr   VSize    VFree   Devices                
        VolGroup00   1   2   0 wz--n-    3.88G      0  /dev/sda2(0)           
        VolGroup00   1   2   0 wz--n-    3.88G      0  /dev/sda2(Array2)          
        lvm_test     2   2   0 wz--n- 1016.00M 8Array6.00M pvmove0(0)             
        lvm_test     2   2   0 wz--n- 1016.00M 8Array6.00M /dev/sdb(0),/dev/sdc(0)
      #lvs -a -o +devices -P
        Partial mode. Incomplete volume groups will be activated read-only.
        Failure parsing mirror status fraction: 1 core
        Failure parsing mirror status fraction: 1 core
        LV        VG         Attr   LSize  Origin Snap%  Move     Log Copy%  Devices                
        LogVol00  VolGroup00 -wi-ao  2.88G                                   /dev/sda2(0)           
        LogVol01  VolGroup00 -wi-ao  1.00G                                   /dev/sda2(Array2)          
        [pvmove0] lvm_test   p-C-ao 60.00M               /dev/sdb            /dev/sdb(0),/dev/sdc(0)
        test      lvm_test   -wI-a- 60.00M                                   pvmove0(0)             

      五、 总结
      根据上面的讨论可以看到,LVM具有很好的可伸缩性,使用起来非常方便。可以方便地对卷组、逻辑卷的大小进行调整,更进一步调整文件系统的大小,还能方便的进行数据迁移,数据完整性保护。如果希望了解更多信息,请参考LVM-HOWTO。