LVM是什么?

    LVM是 Logical Volume Manager(逻辑卷管理)的简写。它基于linux内核中的dm模块,将一个或多个硬盘的分区在逻辑上进行组合在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的存储卷,在存储卷上建立文件系统并且在容量不够或容量太大时可随意进行扩容和缩减。相对于普通硬盘来讲,其具有很大的灵活性。CentOS6及以前的版本上,LVM应用比较广泛;CentOS7上新增了btrfs格式文件系统,btrfs也比较灵活,可随意扩容获缩减容量,所以,CentOS7上已经逐渐丢弃了LVM。



LVM的相关术语:

物理卷(Physical Volume,PV)

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


卷组(Volume Group,VG)

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



逻辑卷(Logical Volume,LV)

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


物理块(Physical Extent,PE)

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

    PE的大小在PV加入到VG以后决定的。因此,建立在相同PV上的不同VG中的PE有可能大小不等。


逻辑块(Logical Extent,LE)

逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。 Linux之LVM创建、扩容、缩减-2015082701_lvm扩容

综行所述:要创建lv需要进行如下步骤:

1、硬盘分区

2、创建PV

3、创建VG

4、创建LV


例如:创建一个至少可容纳20G数据的LV,可经过如下步骤:

实验所需硬盘容量为:20G以上,由于之前创建虚拟机时没有进行合理的分区划分,所以我在虚拟机上新增了一块120G的硬盘

[root@localhost ~]# fdisk -l       ##查看当前系统所识别出的硬盘

Linux之LVM创建、扩容、缩减-2015082701_lvm扩容_02

1、磁盘分区:

[root@localhost ~]# fdisk /dev/sdb          ##对硬盘sdb进行管理
Command (m for help): n        #创建一个新分区
Command action
   e   extended
   p   primary partition (1-4)
p                ##创建一个标准分区
Partition number (1-4): 1                ##分区编号
First cylinder (1-15665, default 1):         ##起始柱面;默认即可(回车)
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-15665, default 15665): +10G            ##结束柱面,或直接用"+"指定分区容量即可
Command (m for help): t                        ##调整分区类型
Partition number (1-4): 1                        ##指定分区编号
Hex code (type L to list codes): 8e            ##调整分区类型为 Linux LVM)
Command (m for help): w            ##保存退出
[root@localhost ~]# partx -a /dev/sdb        ##通知内核读取新创建的分区

这里我只演示了1个10G的分区,本次实验需要至少20G分区容量,请按照如上步骤创建。

****接下来先演示创建过程,具体命令总结见文档尾部:


创建PV

[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2    ##创建PV
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created

[root@localhost ~]# pvdisplay                     ##显示当前系统已有的PV
  "/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
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               xBH83J-IOi1-Bgr7-rs1f-1XWW-iYbW-9QIsWQ
   
  "/dev/sdb2" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               tD2HgH-i0N8-vDDd-15v4-sNk6-eWZ5-G6zoNH


创建VG:

[root@localhost ~]# vgcreate -s 8M testvg /dev/sdb1 /dev/sdb2   ##意为将sdb1和sdb2创建为PE为8M,名为testvg的VG
  Volume group "testvg" successfully created
[root@localhost ~]# vgdisplay 
  --- Volume group ---
  VG Name               testvg
  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               20.00 GiB    ##2个10G分区组合成了1个20G的VG
  PE Size               8.00 MiB       ##创建时-s指定了PEsize为8M
  Total PE              2560
  Alloc PE / Size       0 / 0   
  Free  PE / Size       2560 / 20.00 GiB
  VG UUID               UeoGuC-79gO-lxLa-bpcO-EXTO-uJPI-cc9vt4

   


创建LV :****因为LV是在VG上划分的,所以LV的容量必须小于等于VG的容量

[root@localhost ~]# lvcreate -L 20G -n testlv testvg    ##意为在testvg的VG中创建名为testlv,容量为20G的LV
  Logical volume "testlv" created
[root@localhost ~]# lvdisplay            ##显示已创建的LV属性
  --- Logical volume ---
  LV Path                /dev/testvg/testlv
  LV Name                testlv
  VG Name                testvg
  LV UUID                uxVd7w-X7tI-1zpP-hORA-3igb-hCM0-Lm2y8M
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-08-27 07:24:39 +0800
  LV Status              available
  # open                 0
  LV Size                20.00 GiB
  Current LE             2560        ##由于LE与PE大小相等且一一对应,所以20480M(20G)/8M=2560
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  

为LV创建文件系统,并挂载使用:

[root@localhost ~]# mke2fs -t ext4  -b 2048 -m 3 /dev/testvg/testlv   ##意为创建ext4格式文件系统,blocksize=2048Bytes,预留管理空间为%3
[root@localhost ~]# mkdir /testdir            ###在根下创建testdir目录
[root@localhost ~]# mount /dev/testvg/testlv /testdir/    ##将LV挂载至testdir使用
[root@localhost ~]# ls /testdir/
lost+found

至此,20G的LV已创建完成,并已挂载使用,若此时我们发现20G容量已达不到我们的业务需求,我们可以随意对其进行扩容,步骤如下:

首先添加PV:————————————————————

我在创建分区的时候已划分好了3个10GB的分区(/dev/sdb1  /dev/sdb2  /dev/sdb3 ),若您不知道如何操作,请见文档前半部分磁盘分区:

1、首先新增PV

[root@localhost ~]# pvcreate /dev/sdb3


2、扩展VG:

[root@localhost ~]# vgextend testvg /dev/sdb3    ##意为将sdb3添加至testvg中
  Physical volume "/dev/sdb3" successfully created
  Volume group "testvg" successfully extended
[root@localhost ~]# vgdisplay 
  --- Volume group ---
  VG Name               testvg
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               30.00 GiB            ##已扩展至30G
  PE Size               8.00 MiB
  Total PE              3840
  Alloc PE / Size       2560 / 20.00 GiB
  Free  PE / Size       1280 / 10.00 GiB
  VG UUID               UeoGuC-79gO-lxLa-bpcO-EXTO-uJPI-cc9vt4


3、扩展LV

[root@localhost ~]# lvextend -L +10G -v /dev/testvg/testlv   ##意为为testlv添加10G;或-L 30G,意为扩展到30G
    DEGRADED MODE. Incomplete RAID LVs will be processed.
    Finding volume group testvg
    Archiving volume group "testvg" metadata (seqno 3).
    Extending logical volume testvg/testlv to 30.00 GiB
  Size of logical volume testvg/testlv changed from 20.00 GiB (2560 extents) to 30.00 GiB (3840 extents).
    Loading testvg-testlv table (253:0)
    Suspending testvg-testlv (253:0) with device flush
    Resuming testvg-testlv (253:0)
    Creating volume group backup "/etc/lvm/backup/testvg" (seqno 4).
  Logical volume testlv successfully resized
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/testvg/testlv
  LV Name                testlv
  VG Name                testvg
  LV UUID                uxVd7w-X7tI-1zpP-hORA-3igb-hCM0-Lm2y8M
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-08-27 07:24:39 +0800
  LV Status              available
  # open                 1
  LV Size                30.00 GiB            ##已扩展至30G
  Current LE             3840
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
    - currently set to     256
  Block device           253:0



4、扩展文件系统:

Linux之LVM创建、扩容、缩减-2015082701_LVM_03

由图可见,现在testlv的文件系统容量为20G

执行如下操作:

[root@localhost ~]# resize2fs /dev/testvg/testlv

Linux之LVM创建、扩容、缩减-2015082701_lvm扩容_04 

扩展成功。  

由上述可知:对于已在生产环境中使用的LV,无需卸载格式化便可直接对其扩容。

——————————————————————————————————————————————————

LV的容量缩减:****特别注意!!LV缩减到的容量必须能容纳的下现在的已有数据!!!!!

1、卸载文件系统

[root@localhost ~]# umount /testdir/

2、强制修复文件系统:

[root@localhost ~]# fsck -f -t ext4 /dev/testvg/testlv 
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
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/mapper/testvg-testlv: 99/1966080 files (1.0% non-contiguous), 288393/15728640 blocks

3、缩减文件系统

[root@localhost ~]# resize2fs /dev/testvg/testlv 20G   ##意为将文件系统大小缩减为20G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/testvg/testlv to 10485760 (2k) blocks.
The filesystem on /dev/testvg/testlv is now 10485760 blocks long.

4、缩减LV

[root@localhost ~]# lvreduce -L -10G -v /dev/testvg/testlv   ##意为将LV减掉10G 或 -L 20G意为缩减到20G
    DEGRADED MODE. Incomplete RAID LVs will be processed.
    Finding volume group testvg
  WARNING: Reducing active logical volume to 20.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce testlv? [y/n]: y
    Archiving volume group "testvg" metadata (seqno 10).
    Reducing logical volume testvg/testlv to 20.00 GiB
  Size of logical volume testvg/testlv changed from 30.00 GiB (3840 extents) to 20.00 GiB (2560 extents).
    Loading testvg-testlv table (253:0)
    Suspending testvg-testlv (253:0) with device flush
    Resuming testvg-testlv (253:0)
    Creating volume group backup "/etc/lvm/backup/testvg" (seqno 11).
  Logical volume testlv successfully resized

5、挂载文件系统进行使用

[root@localhost ~]# mount /dev/testvg/testlv  /testdir/

实验结束。至此我们已经完成了LV的创建、扩容、及缩减实验。




LVM管理的命令及常用选项总结:

        PV相关:

                    pvmove***

                            若生产环境中对VG容量进行缩减时,硬盘上有数据,则需先使用该命令将原有数据进行转移!

                            pvmove [源PV] [目标PV] 若目标PV省略,则默认将源PV上的数据移动至VG中。

                                    -n LVname   指明只移动属于指定LV的数据(PE块)

                    pvcreate 创建PV

                    pvremove    删除pv

                    pvs    显示当前系统已有的PV简要信息

                    pvdisplay    显示当前系统已有的PV详细信息

                    pvresize    更改PV的大小

                        -s size    指明要更改的PV容量大小

       

         VG相关

                    vgcreate   VGname PV     创建VG

                        -s    指明PE大小

                        

                    vgremove    删除VG

                    vgrename    重命名VG

                    vgreduce    缩减VG ,若存在数据,则需要先pvmove

                    

        LV相关:

           lvcreate创建LV

        -L| --size  逻辑卷大小

        -n|--name逻辑卷名字 卷组 

        -l    指明要扩展或要扩展到的LE的数目

                lvreduce    缩减LV

                        -L    [+]n    指明要扩展或扩展到的LV容量

                

                lvextend   扩展LV

                        -L    [-]n    指明要缩减或缩减到的LV容量


        创建LVM快照 (关于LVM的快照特性,还请各位自行查阅相关文档)

lvcreate -L 大小 -p r -s -n 快照卷名字 原卷名字

-p  权限 。 一般是只读  r





                    待续。若文档有欠缺之处,劳烦您在线指出,甚是感激!