Fork me on GitHub
Suzf  Blog

LVM 基本原理与实践

目录:
一: LVM原理详解
二: LVM创建
三: LVM的增大和放缩
四: LVM快照
五: 相关扩展阅读
六: LVM 优缺点

 

一:LVM原理详解
1.LVM是什么?
LVM是linux系统上的一个逻辑卷管理器有两个版本lvm1和lvm2现在默认是lvmm2,lvm2兼容lvm1但是对于lvm1的快照是不兼容的,所以如果你使用lvm1创建了快照,请在升级为lvm2的时候将快照卷卸载
Lvm2使用的是设备映射器(device mapper)2.6版本的内核有其驱动,2.4的内核是没有的需要打补丁

2.什么是逻辑卷管理器?
逻辑卷管理器提供了一个比传统的磁盘和分区视图更高层次的磁盘存储视图,它使管理员可以更加灵活的给应用程序和
用户分配存储空间,可以在逻辑卷管理器下对磁盘容量进行任意调整和移动,同时逻辑卷管理器也可以允许用户自定义组的方式来管理磁盘容量.
允许管理员使用容易识别的逻辑卷组名称例如"development"或"sales"而不是像物理磁盘那样使用sda或sdb

3.LVM的组成

1.从LVM的视角看LVM的组成

+---------------- Volume Group -------------------+

|                                                 |

|    +----------------------------------------+   |

| PV | PE |  PE | PE | PE | PE | PE | PE | PE |   |

|    +----------------------------------------+   |

|      .             .             .              |

|      .          .             .        .        |

|    +----------------------------------------+   |

| LV | LE |  LE | LE | LE | LE | LE | LE | LE |   |

|    +----------------------------------------+   |

|            .          .        .            .   |

|            .             .        .             |

|    +----------------------------------------+   |

| PV | PE |  PE | PE | PE | PE | PE | PE | PE |   |

|    +----------------------------------------+   |

|                                                 |

+-------------------------------------------------+

 

2.从磁盘和分区的角度看LVM

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

VG: 卷组是LVM中的最高的抽象层次,它将LV和PV结合起来到一个管理单元
PV: PV尽管只是一个device 但是看起来像是一个hard disk
LV: 相当于没有LVM系统的磁盘分区是一个可见的块设备可以包含一个文件系统
PE: 每一个PV都被分成了许多数据块,这些数据块就被称作PE,这些PE都是相同的大小对于VG来说就是LE
LE: VG被切割成一个个数据块这些数据块就是LE,这些LE对于整个VG中的LV来说都是相同的

一个具体的例子将会帮助我们很好理解这些概念:
假设我们有一个逻辑卷叫做VG1这个逻辑卷有一个4MB大小的PE.在这个逻辑卷中我们引入2个磁盘分区/dev/sda1 和/dev/sda2
这些分区将会变成PV1和PV2,PV1和PV2这两个PV会被切割成4MB大小的数据块(PE).这两个PV有自己的大小PV1由99个数据块组成
PV2由248个数据块组成,我们现在可以创建自己的逻辑卷了,逻辑卷的大小可以在1到347(249+99)个数据块之间.当我们创建
逻辑卷的时候就会形成一个在LE和PE之间的映射关系.example:第一个LE可以映射到PV1的第51个PE,当写入4MB数据到LE的时候
事实上就写入到PV1的第51个PE上

4.LE到PE的映射模式
1.Linear mapping
这种模式将会指定对一个范围的PE区域进行映射,例如LE的1-99映射到PV1(PV1一共只有99个PE),LE的100-347映射到PV2(PV2一共只有249个PE)
这种模式的优点在于数据写入的时候是一个一个PV的写入,当一个PV写满了再写入到第二个PV

2.Striped mapping
这种模式会将写入的数据分成一个个数据块交错写入到各个PV中 例如:

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]

在某些情况下确定好映射模式可以有效提高逻辑卷的性能

5.LVM快照
如果在备份过程期间数据没有发生变化,那么就能够获得一致的备份。如果不在备份期间停止系统,就很难保证数据没有变化。
Linux LVM 实现了一种称为快照(Snapshot)的特性,它的作用就像是 “拍摄” 逻辑卷在某一时刻的照片。通过使用快照, 
可以获得同一 LV 的两个拷贝 ——一个可以用于备份,另一个继续用于日常操作。
快照有两大优点:
快照的创建非常快,不需要停止生产环境。
建立两个拷贝,但是它们的大小并不一样。快照使用的空间仅仅是存储两个 LV 之间的差异所需的空间。 
快照由一个例外列表(exception list)来实现,每当 LV 之间出现差异时就会更新这个列表(正式的说法是 CoW,Copy-on-Write)。 

二:LVM创建
1.PV的创建
相关命令:

1. pvcreate :将实体 partition 建立成为 PV ;

2. pvscan :搜寻目前系统里面仸何具有 PV 的磁盘;

3. pvdisplay :显示出目前系统上面的 PV 状态;

4. pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。

 

先准备四个分区(将分区的类型改成8e):

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1          13      104391   8e  Linux LVM

/dev/sdb2              14          26      104422+  8e  Linux LVM

/dev/sdb3              27          39      104422+  8e  Linux LVM

/dev/sdb5              40          52      104422+  8e  Linux LVM

 

#创建PV的过程其实质就是写入了一些LVM相关的元数据写入到了指定的磁盘或分区

[[email protected] ~]# pvcreate /dev/sdb{1,2,3,5}

  Writing physical volume data to disk "/dev/sdb1"

  Physical volume "/dev/sdb1" successfully created

  Writing physical volume data to disk "/dev/sdb2"

  Physical volume "/dev/sdb2" successfully created

  Writing physical volume data to disk "/dev/sdb3"

  Physical volume "/dev/sdb3" successfully created

  Writing physical volume data to disk "/dev/sdb5"

  Physical volume "/dev/sdb4" successfully created

 

 

#查看系统上所有PV的信息

[[email protected] ~]# pvscan

  PV /dev/sdb1                      lvm2 [101.94 MB]

  PV /dev/sdb2                      lvm2 [101.98 MB]

  PV /dev/sdb3                      lvm2 [101.98 MB]

  PV /dev/sdb5                      lvm2 [101.98 MB]

  Total: 4 [407.87 MB] / in use: 0 [0   ] / in no VG: 4 [407.87 MB]

 

#更详细的列出每一个PV的具体信息(这里我只截取部分贴上

[[email protected] ~]# pvdisplay

  "/dev/sdb1" is a new physical volume of "101.94 MB"

  --- NEW Physical volume ---

  PV Name               /dev/sdb1    #PV的名称

  VG Name                #PV还为分配到VG中所以没有VG Name

  PV Size               101.94 MB       #PV的大小

  Allocatable           NO    #PV的分配状态 这里是没有分配的

  PE Size (KByte)       0     #PE的大小, 只有等PV被分配到VG的时候才会被分成一个个PE

  Total PE              0    #PE的个数

  Free PE               0    #空闲的PE个数

  Allocated PE          0    #已分配的PE个数

  PV UUID               3Ryu05-Rmrr-foX0-NJw6-550b-OysU-WZAn3L  #每一个PV都有其UUID唯一标示这个PV

 

2.VG的创建
相关命令:

1.vgcreate :就是主要建立 VG 的名令啦

2.vgscan :搜寻系统上面是否有 VG 存在

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

4.vgextend :在 VG 内增加额外的 PV

5.vgreduce :在 VG 内移除 PV

6.vgchange :设定VG是否启动

7.vgremove :去除一个 VG

 

 

#VG的创建
vgcreate [-s N[mgt]] VG名称 PV名称
-s 指定PE的大小单位可以是m,g,t

[[email protected] ~]# vgcreate -s 4m vgtest /dev/sdb{1,2,3,5}

  Volume group "vgtest" successfully created

 

#查看系统上VG的信息

[[email protected] ~]# vgscan

  Reading all physical volumes.  This may take a while...

  Found volume group "vgtest" using metadata type lvm2

 

 

#再查看下PV的状态信息
#四个PV都已经被vgtest使用

[[email protected] ~]# pvscan

  PV /dev/sdb1   VG vgtest   lvm2 [100.00 MB / 100.00 MB free]

  PV /dev/sdb2   VG vgtest   lvm2 [100.00 MB / 100.00 MB free]

  PV /dev/sdb3   VG vgtest   lvm2 [100.00 MB / 100.00 MB free]

  PV /dev/sdb5   VG vgtest   lvm2 [100.00 MB / 100.00 MB free]

  Total: 4 [400.00 MB] / in use: 4 [400.00 MB] / in no VG: 0 [0   ]

 

 

#PV被分出去了就有信息了

[[email protected] ~]# pvdisplay

  --- Physical volume ---

  PV Name               /dev/sdb1

  VG Name               vgtest

  PV Size               101.94 MB / not usable 1.94 MB

  Allocatable           yes

  PE Size (KByte)       4096

  Total PE              25

  Free PE               25

  Allocated PE          0

  PV UUID               3Ryu05-Rmrr-foX0-NJw6-550b-OysU-WZAn3L

 

 

#显示VG详细信息

[[email protected] ~]# vgdisplay

  --- Volume group ---

  VG Name               vgtest  #VG名称

  System ID         

  Format                lvm2

  Metadata Areas        4            

  Metadata Sequence No  1

  VG Access             read/write

  VG Status             resizable    #VG状态 处于可调整大小的状态

  MAX LV                0

  Cur LV                0

  Open LV               0

  Max PV                0

  Cur PV                4

  Act PV                4

    VG Size               400.00 MB    #VG的大小

    PE Size               4.00 MB        #PE的大小

  Total PE              100

  Alloc PE / Size       0 / 0

  Free  PE / Size       100 / 400.00 MB

  VG UUID               hweBrU-o8LD-ggfo-dmJV-1Jyl-7L3j-p0BOMa

 

3.LV的创建
相关命令:

1.lvcreate :建立 LV 啦

2.lvscan :查询系统上面的 LV

3.lvdisplay :显示系统上面的 LV 状态啊

4.lvextend :在 LV 里面增加容量

5.lvreduce :在 LV 里面减少容量

6.lvremove :去除一个 LV

7.lvresize :对 LV 迚行容量大小的调整

 

 

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

-L 后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,

因此这个数量必项要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。

-l 后面接PE的数量,而不是大小 如果使用这种方式指定LV大小 需要自己计算所需的PE数量

-n 后面接的就是 LV 的名称

-s 快照卷

-p 属性

 

#LV的创建

[[email protected] ~]# lvcreate -L 200m -n lvtest vgtest

  Logical volume "lvtest" created

 

#也可以使用

lvcreate -l 50 -n lvtest vgtest #一个PE4m 50个PE就是200m了
#lv创建后就会在/dev目录下创建了一个设备映射文件

[[email protected] ~]# ll /dev/vgtest/lvtest

lrwxrwxrwx 1 root root 25 Jan 20 13:50 /dev/vgtest/lvtest -> /dev/mapper/vgtest-lvtest

 

 

#查看lv详细信息

[[email protected] ~]# lvdisplay

  --- Logical volume ---

  LV Name                /dev/vgtest/lvtest

  VG Name                vgtest

  LV UUID                LBWeO1-i6Ky-MqC1-OgHa-Iw5J-54o3-aHzNoR

  LV Write Access        read/write

  LV Status              available

  # open                 0

  LV Size                200.00 MB

  Current LE             50

  Segments               2

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     256

  Block device           253:0

 

 

到此创建完成接着就可以使用了
4.格式化并挂载使用
#格式化lvtest

[[email protected] ~]# mke2fs -j /dev/vgtest/lvtest

mke2fs 1.39 (29-May-2006)

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

51200 inodes, 204800 blocks

10240 blocks (5.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=67371008

25 block groups

8192 blocks per group, 8192 fragments per group

2048 inodes per group

Superblock backups stored on blocks:

    8193, 24577, 40961, 57345, 73729

Writing inode tables: done

Creating journal (4096 blocks): done

Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 33 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

 

 

#挂载lvtest

[[email protected] ~]# mkdir /lvdata

[[email protected] ~]# mount /dev/vgtest/lvtest /lvdata/

[[email protected] ~]# cd /lvdata/

[[email protected] lvdata]# ls

lost+found

 

到此结束

三:LVM的增大和放缩
1.LVM的增大(lv的增大)
vgtest是400M的大小,已经分配出去200M的一个lvtest,现在需要将lvtest增大到400M
先解释下文件系统边界和物理边界的概念:

[[email protected] ~]# umount /dev/vgtest/lvtest

[[email protected] ~]# lvextend -L 400m /dev/vgtest/lvtest

Extending logical volume lvtest to 400.00 MB

Logical volume lvtest successfully resized

[[email protected] ~]# e2fsck -f /dev/vgtest/lvtest

e2fsck 1.39 (29-May-2006)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/vgtest/lvtest: 11/51200 files (9.1% non-contiguous), 12127/204800 blocks

[[email protected] ~]# resize2fs -p /dev/vgtest/lvtest

resize2fs 1.39 (29-May-2006)

Resizing the filesystem on /dev/vgtest/lvtest to 409600 (1k) blocks.

Begin pass 1 (max = 25)

Extending the inode table     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

The filesystem on /dev/vgtest/lvtest is now 409600 blocks long.

 

 

 

2.LVM的增大(vg的增大)
新增一块磁盘/dev/sda6 将其添加至vgtest中,并扩充lvtest

[[email protected] ~]# pvcreate /dev/sdb6

  Writing physical volume data to disk "/dev/sdb6"

  Physical volume "/dev/sdb6" successfully created

[[email protected] ~]# vgextend vgtest /dev/sdb6

  Volume group "vgtest" successfully extended

[[email protected] ~]# umount /dev/vgtest/lvtest

[[email protected] ~]# lvextend -L 500m /dev/vgtest/lvtest

  Extending logical volume lvtest to 500.00 MB

  Logical volume lvtest successfully resized

[[email protected] ~]# e2fsck -f /dev/vgtest/lvtest

e2fsck 1.39 (29-May-2006)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/vgtest/lvtest: 11/102400 files (9.1% non-contiguous), 19351/409600 blocks

[[email protected] ~]# resize2fs -p /dev/vgtest/lvtest

resize2fs 1.39 (29-May-2006)

Resizing the filesystem on /dev/vgtest/lvtest to 512000 (1k) blocks.

Begin pass 1 (max = 13)

Extending the inode table     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

The filesystem on /dev/vgtest/lvtest is now 512000 blocks long.

[[email protected] ~]# mount /dev/vgtest/lvtest /lvdata/

[[email protected] ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda2             19840924   3943108  14873676  21% /

/dev/sda5             29854824   4686208  23627584  17% /data

/dev/sda1               101086     12218     83649  13% /boot

tmpfs                   292496         0    292496   0% /dev/shm

/dev/mapper/vgtest-lvtest

                        495718      6423    463695   2% /lvdata

 

 

总结:

对于LVM的增大:

       1.若vg空间足够扩充,则直接扩充lv即可

       2.若vg空间不够,需要创建pv加入到vg中扩充vg,然后再扩充lv

       3.扩充lv第一步需要卸载lv设备

       4.使用lvextend扩充lv

       5.使用e2fsck检查修复lv文件系统

       6.使用resize2fs扩充lv的文件系统边界至屋里边界大小

 

3.LVM的缩小(在vg的范围内对lv的容量缩小)

[[email protected] ~]# umount /dev/vgtest/lvtest

[[email protected] ~]# e2fsck -f /dev/vgtest/lvtest

e2fsck 1.39 (29-May-2006)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/vgtest/lvtest: 11/129024 files (9.1% non-contiguous), 22705/512000 blocks

[[email protected] ~]# resize2fs /dev/vgtest/lvtest 400M

resize2fs 1.39 (29-May-2006)

Resizing the filesystem on /dev/vgtest/lvtest to 409600 (1k) blocks.

The filesystem on /dev/vgtest/lvtest is now 409600 blocks long.

[[email protected] ~]# lvreduce -L 400M /dev/vgtest/lvtest

  WARNING: Reducing active logical volume to 400.00 MB

  THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce lvtest? [y/n]: y

  Reducing logical volume lvtest to 400.00 MB

  Logical volume lvtest successfully resized

[[email protected] ~]# mount /dev/vgtest/lvtest /lvdata/

[[email protected] ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda2             19840924   3943120  14873664  21% /

/dev/sda5             29854824   4686208  23627584  17% /data

/dev/sda1               101086     12218     83649  13% /boot

tmpfs                   292496         0    292496   0% /dev/shm

/dev/mapper/vgtest-lvtest

                        396672      6423    369769   2% /lvdata

 

 

4.LVM缩减(对带有数据的卷组缩减)

这里将/dev/sdb1这个100M的pv从vg卷组中去掉

[[email protected] ~]# vgreduce vgtest /dev/sdb1

  Physical volume "/dev/sdb1" still in use

[[email protected] ~]# pvmove /dev/sdb1

  /dev/sdb1: Moved: 0.0%

  /dev/sdb1: Moved: 100.0%

[[email protected] ~]#

[[email protected] ~]# vgreduce vgtest /dev/sdb1

  Removed "/dev/sdb1" from volume group "vgtest"

[[email protected] ~]# vgdisplay

  --- Volume group ---

  VG Name               vgtest

  System ID           

  Format                lvm2

  Metadata Areas        4

  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                4

  Act PV                4

  VG Size               400.00 MB

  PE Size               4.00 MB

  Total PE              100

  Alloc PE / Size       100 / 400.00 MB

  Free  PE / Size       0 / 0 

  VG UUID               4E19bc-ZzcC-wdV3-eeaH-5zNg-rZXW-2Gmg43

 

 

总结:

1.LVM的缩减的几种方式:第一就是直接对lv的大小进行缩减,第二对vg卷组的大小进行缩减

2.直接对lv的大小缩减:

     1.卸载文件系统

     2.强制检查文件系统

     3.缩减文件系统边界

     4.缩减lv大小

     注:一定要先缩减文件系统边界再去缩减lv,否则将会出现文件系统错乱

3.对vg卷组的缩减                      

     1.对vg卷组的缩减只能缩减整个指定pv

     2.对vg缩减的时候若指定减去的pv含有数据需要使用pvmove将数据移至其它pv(剩余容量要能够存放这个pv的数据)

     3.使用vgreduce 去除指定pv

 

四:LVM快照
在实现快照前,我们先要对快照有个简单的认识,然后通过一张原理图进一步理解快照的运作流程,从而对快照有一个更深入的理解。
LVM除了可以自由的增大或者减小容量外,它还有一个更强大的功能也就是实时快照功能,就像照相一样瞬时就可以记录当前的磁盘信息。下面我们通过图示来了解LVM的快照功能

注:1.分配给快照卷的大小将可以满足你日后更改文件内容的大小
2.分配快照卷的时候要确保你的卷组要有足够的空间,不要把整个卷组都分配给了LV(数据区域)
这里我的VG总大小是500M,实际分配给LV(数据区域)分配了300M 给快照区域分配150M

[[email protected] lvdata]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda2              19G  3.8G   15G  21% /

/dev/sda5              29G  4.5G   23G  17% /data

/dev/sda1              99M   12M   82M  13% /boot

tmpfs                 286M     0  286M   0% /dev/shm

/dev/mapper/vgtest-lvtest

                      291M   23M  254M   9% /lvdata

[[email protected] lvdata]# lvcreate -s -n lvsnapt -L 150M /dev/vgtest/lvtest

  Rounding up size to full physical extent 152.00 MB

  Logical volume "lvsnapt" created

#挂载快照卷

[[email protected] lvdata]# mkdir /lvsnap

[[email protected] lvdata]# mount /dev/vgtest/lvsnapt /lvsnap/

#快照区域和实际的数据区域大小事一样的,我们可以通过快照区域来访问数据区域的数据两者是共享存放数据的PE的

[[email protected] lvdata]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda2             19840924   3943184  14873600  21% /

/dev/sda5             29854824   4686208  23627584  17% /data

/dev/sda1               101086     12218     83649  13% /boot

tmpfs                   292496         0    292496   0% /dev/shm

/dev/mapper/vgtest-lvtest

                        297485     22821    259304   9% /lvdata

/dev/mapper/vgtest-lvsnapt

                        297485     22821    259304   9% /lvsnap

 

 

注:

1.可以通过快照区域去修改数据,但是修改后的数据不会影响实际的数据区域中的数据。所以建议一般对于快照区域应该设置为只读属性不允许修改

2.实际的数据区域修改后通过快照区域去访问的还是原来的数据(数据修改后将会将原来数据存放至快照区域,此时快照区域会变大)

3.快照的优点在于使用了COW机制也就是写时复制,在数据没有改动之前,快照区域和实际数据区域供共享PE,只有等实际数据发生了改变才将原来的数据保存至快照区域

4.快照非常适合于实时备份系统中,快照卷的创建速度非常之快。可以避免长时间的备份导致的数据不一致问题,并且时间占用空间的大小也很小

 

LVM优点

  • 文件系统可以跨多个磁盘,因此大小不会受物理磁盘的限制。
  • 可以在系统运行状态下动态地扩展文件系统大小。
  • 可以增加新磁盘到 LVM 的存储池中。
  • 可以以镜像的方式冗余重要数据到多个物理磁盘上。
  • 可以很方便地导出整个卷组,并导入到另外一台机器上。

LVM缺点

  • 在从卷组中移除一个磁盘时必须使用 reducevg,否则会出问题。
  • 当卷组中的一个磁盘损坏时,整个卷组都会受影响。
  • 仅支持有限个文件系统类型的减小操作(ext3不支持减少文件系统大小的操作)。
  • 因为加入了额外的操作,存储性能会受影响(使用 Stripe 的情况另当别论)

来源: 专注linux