首页 > 代码库 > LINUX 逻辑卷管理: LVM

LINUX 逻辑卷管理: LVM

1.什么是LVM

lvm是一个逻辑卷管理工具,它有两个版本,lvm1 和lvm2. 分别在2.4 kernal和2.6kernal里原生支持。

LVM提供对磁盘分区更高逻辑层级的管理功能。通过lvm可以重新划分和移动存储卷。

LVM可以对逻辑卷自定义命名成development , sales等指定名称,而不是"sda""sdb"

2.一个案例说明LVM的好处:Joe的PC

As an example: Joe buys a PC with an 8.4 Gigabyte disk on it and installs Linux using the following partitioning system:

/boot    /dev/hda1     10 Megabytes
swap     /dev/hda2    256 Megabytes
/        /dev/hda3      2 Gigabytes
/home    /dev/hda4      6 Gigabytes

 当Joe需要安装office suit时候,root分区的2G空间不够了。Joe此时只能做如下几件事情

 1.格式化硬盘,重新分区

2.买个新硬盘,建立新分区,挪动数据以完成安装
3.把根分区做个链接,指向到/home,在/home里完成安装

如果使用LVM会有什么不同呢?

/boot     /dev/hda1        10 Megabytes
swap      /dev/vg00/swap   256 Megabytes
/         /dev/vg00/root     2 Gigabytes
/home     /dev/vg00/home     6 Gigabytes

此时当需要安装office suit,之需要缩小/dev/vg00/home的空间,把空间分配给/root就可以了。

i_f42.gifboot is not included on the LV because bootloaders don‘t understand LVM volumes yet. It‘s possible boot on LVM will work, but you run the risk of having an unbootable system.

Joe的/home目录满了,于是他新买了20G的硬盘,需要格式这块硬盘得到/dev/sdb1 然后把/home里数据全拷贝过去,接着把新的磁盘挂载成/home,然后把过去的/home中数据做个链接例如/home/joe/old-mp3s

但如果他使用了lvm,就可以直接把磁盘加入存在的卷组,然后直接扩容/home 逻辑卷空间了,不需要做这么麻烦的事情。

2.LVM的结构(PV  VG  LV )


    hda1   hdc1      (PV:s on partitions or whole disks)                        
       \   /                                                                    
        \ /                                                                     
       diskvg        (VG)                                                       
       /  |  \                                                                  
      /   |   \                                                                 
  usrlv rootlv varlv (LV:s)
    |      |     |                                                              
 ext3     ext4  xfs (filesystems)

VG volume group:

VG 是LVM的最高层级的抽象层面,它把logical volumes和phsical volumes放到一个存储单元中

PV  physical volume:

物理卷,通常是硬盘,或者是看起来像硬盘的raid组

LV logical volume (LV):

类似于磁盘分区,对于系统可视的标准块设备,可包含文件系统例如/home

PE  physical extent

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

logical extent (LE)

LE和PE是对应的寻址单位,和同VG里的PE大小一致。

i_f42.gif一块硬盘对应LV文件系统的过程:硬盘→分区→(PV→VG→LV)→格式化(LV为ext文件系统)挂载

我们有一个volume group VG1,它的physical extent 大小为 4MB. 在这个 volume group我们引入2个硬盘分区, /dev/hda1 and /dev/hdb1. 这2个分区会变成 physical volumes PV1 and PV2 .PV对应着PE被分割成4MB chunks, 假设PV1分到99个,PV2分到248个。这时我们可以建立逻辑卷。它可以是1-347(248+99)中的任意大小。例如建立了一个逻辑卷LV,实际上做的是LE和PE的映射,例如可以把LE的1映射到PE的51,则意味着对LV的第一个4MB chunk的写入,实际上是从PV1的第51 chunk开始写入的。

i_f42.gif映射方式: 两种

线性映射: 把一组 PE对应到一个区域里  LE 1 - 99 map to PV1LE 100 - 347 map onto PV2

等量对应: 交错分配

1st chunk of LE[1] -> PV1[1],

2nd chunk of LE[1] -> PV2[1],

3rd chunk of LE[1] -> PV3[1],

4th chunk of LE[1] -> PV1[2],

i_f42.gifSnapshot

快照(snapshot)是LVM所提供的极为美妙的特性。它的原理是“写时复制(COW - Copy-On-Write)”的技术,复制原始卷的元数据(metadata)来创建一个逻辑卷,并没有复制物理卷上的任何数据, 因此它的创建过程是实时瞬间完成的。快照是特殊类型的逻辑卷,它含有创建时刻所指定的原始逻辑卷的完整数据,您可以操作快照而无需担心数据的变更令备份失效。

LVM 快照利用一种称为“写时复制(COW - Copy-On-Write)”的技术来跟踪和维持其数据
的一致性。它的原理比较简单,就是跟踪原始卷上块的改变, 在这些数据被改变之前将
其复制到快照自己的预留空间里(顾名思义称为写时复制)。 当对快照进行读取的时候,
被修改的数据从快照的预留空间中读取,未修改的数据则重定向到原始卷上去读取,因此
在快照的文件系统与设备之间多了一层COW设备。

关于这个快照,虽然看起来还不错啦,但实际上还有很大的局限性。首要的就是性能

“So a write to a normal LV is just a write, but a write to a snapshotted LV (or an LV snapshot) involves reading the original data, writing it elsewhere and then writing some metadata about it all.
This quite obviously impacts performance, and due to device mapper having a very basic implementation, it is particularly bad.  My tests show synchronous sequential writes to a snapshotted LV are around 90% slower than writes to a normal LV.”

多么痛的领悟!写入性能下降90%

看个Centos Kernel 2.6.18的测试结果:

#without snapshot:

sync; time sh -c "dd if=/dev/zero of=/scratch/moo bs=1M count=1000; sync"
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 10.3395 seconds, 101 MB/s

real    0m20.285s
user    0m0.000s
sys     0m1.084s

#with snapshot:

sync; time sh -c "dd if=/dev/zero of=/scratch/moo bs=1M count=1000; sync"
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 796.627 seconds, 1.3 MB/s

real    16m44.222s
user    0m0.000s
sys     0m1.132s

改变chunk size会有一定的性能提升,很多专家建议用8K 16K这些的小单元,减少copy-on-wirte对性能的影响。

出于备份用途,建议不使用活动的快照,而是把快照当成一个冻结点。(对空间比较费)

例如我的数据库即使在快照时刻也是跑着业务的,那么我在每天00:01执行一次脚本,创建一个快照卷,记录下这个状态。把快照卷的数据通dd命令或tar进行块的备份或文件备份。

可以使用脚本来实现备份

# vi snapshot_backup.sh; #备份脚本;
------------------------------------------------------------------------------
#!/bin/bash

today=`date "+%Y%m%d"`;
lvcreate -L1G -s -n LogVol02s /dev/VolGroup00/LogVol02;
mount /dev/VolGroup00/LogVol02s /disk/VolGroup00/LogVol02s;
tar -zcvf /tmp/snapshot_backup_$today.tar.gz /disk/VolGroup00/LogVol02s/*;
umount /dev/VolGroup00/LogVol02s;
lvremove -f /dev/VolGroup00/LogVol02s;
------------------------------------------------------------------------------
chmod 755 snapshot_backup.sh; #运行权限设置;

i_f27.gif

参考文献:

http://tldp.org/HOWTO/LVM-HOWTO/index.html

https://www.redhat.com/archives/linux-lvm/2013-July/msg00044.html  

http://chengkinhung.blogspot.com/2012/09/linuxlvmsnapshot.html 


本文出自 “The old artisan” 博客,转载请与作者联系!

LINUX 逻辑卷管理: LVM