一、LVM简介

        LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。


二、常用术语

物理存储介质:指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。


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


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


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


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


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


LVM抽象模型:

wKiom1WbK2rDspnWAAHlhbGobJI081.jpg

三、搭建LVM

本例linux系统为CentOS 6.6;

1、安装lvm

[root@hpf-linux ~]# yum install -y lvm2


2、创建物理存储介质

为避免浪费篇幅就将创建物理存储介质的步骤省略,创建步骤就按磁盘分区的步骤差不多,不过需要更改创建类型为8e(Linux LVM);

[root@hpf-linux~]# fdisk /dev/sdb
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (1308-2610, default 1308): 
Using default value 1308
Last cylinder, +cylinders or +size{K,M,G} (1308-2610, default 2610): +2G
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xb7c76144
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         784     6297448+  8e  Linux LVM
/dev/sdb2             785        1307     4200997+  8e  Linux LVM
/dev/sdb3            1308        1569     2104515   8e  Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.

3、创建物理卷

[root@hpf-linux~]# pvcreate /dev/sdb{1,2,3,}       //创建物理卷
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created
  Physical volume "/dev/sdb3" successfully created
  Device /dev/sdb not found (or ignored by filtering).
[root@hpf-linux~]# pvs                                     //简单显示物理卷信息
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb1       lvm2 ---  6.01g 6.01g
  /dev/sdb2       lvm2 ---  4.01g 4.01g
  /dev/sdb3       lvm2 ---  2.01g 2.01g
[root@hpf-linux ~]# pvdisplay                              //显示系统是物理卷的详细信息
  "/dev/sdb1" is a new physical volume of "6.01 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               6.01 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               Crxaq7-He6i-bmN3-9CFO-azWN-s1Uz-7kXLP0
   
  "/dev/sdb2" is a new physical volume of "4.01 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name               
  PV Size               4.01 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               uNxVQf-9plR-gwEV-Het2-WB2o-NYko-LKfcX2
   
  "/dev/sdb3" is a new physical volume of "2.01 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb3
  VG Name               
  PV Size               2.01 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               x4j5VX-2VF2-aFgs-6mwo-eMmN-m9OM-La3GxG

4、创建逻辑卷组

在创建前用vgs命令查看当前系统上是否创建的有vg,若有则不能在同一系统创建同名的vg;

[root@hpf-linux~]# vgs
  No volume groups found
[root@hpf-linux~]# vgcreate vg1 /dev/sdb{1,2,3}     //创建
  Volume group "vg1" successfully created
[root@hpf-linux~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg1    3   0   0 wz--n- 12.01g 12.01g
[root@hpf-linux ~]# vgdisplay            //查看创建逻辑卷组的信息
  --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        3
  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                3
  Act PV                3
  VG Size               12.01 GiB
  PE Size               4.00 MiB
  Total PE              3075
  Alloc PE / Size       0 / 0   
  Free  PE / Size       3075 / 12.01 GiB
  VG UUID               GxPcdn-C9Dl-YOmz-EjHo-pvu0-dVWK-wgpmkc

        通过上例可以看出物理块(PE)大小为默认的4M,若想更改只能删除逻辑卷组从新创建,同时创建时要用到 -s 选项指定块大小,同时切记你的物理卷上一段不要有数据,不然会删除你的数据的,创建后可以发现你的物理卷(PV)上的物理块(PE)会从4M变为8M。

[root@hpf-linux~]# vgremove vg1     //移除逻辑卷组,切记物理卷组上有数据一定不要这么玩,不然你会死的很惨!
  Volume group "vg1" successfully removed
[root@hpf-linux~]# vgs
  No volume groups found
[root@hpf-linux~]# vgcreate -s 8M vg1 /dev/sdb{1,2,3}    //指定PE大小为8M
  Volume group "vg1" successfully created
[root@hpf-linux~]# vgdisplay 
  --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        3
  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                3
  Act PV                3
  VG Size               12.00 GiB
  PE Size               8.00 MiB
  Total PE              1536
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1536 / 12.00 GiB
  VG UUID               nD4VhC-o2EW-zk4Q-5Nsh-f2WC-0Czs-C79Qk8
[root@hpf-linux ~]# pvdisplay /dev/sdb1
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg1
  PV Size               6.01 GiB / not usable 5.85 MiB
  Allocatable           yes 
  PE Size               8.00 MiB
  Total PE              768
  Free PE               768
  Allocated PE          0
  PV UUID               Crxaq7-He6i-bmN3-9CFO-azWN-s1Uz-7kXLP0

5、在逻辑卷组中继续添加新的物理卷

大概步骤:

     1.准备要添加的物理卷

     2 扩展卷组:

       添加物理卷至卷组中

       vgextend vg_name /path/to/device

首先,用fdisk分区工具添加一个3G的磁盘/dev/sdc1。

[root@hpf-linux~]# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created
[root@hpf-linux~]# vgextend vg1 /dev/sdc1
  Volume group "vg1" successfully extended
[root@hpf-linux~]# vgdisplay 
  --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               15.01 GiB
  PE Size               8.00 MiB
  Total PE              1921
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1921 / 15.01 GiB
  VG UUID               nD4VhC-o2EW-zk4Q-5Nsh-f2WC-0Czs-C79Qk8


6、在逻辑卷组中移除物理卷

大概步骤:

    1.确定要移除的物理卷的总空间大小,要小于VG当前的可用空间大小

    2.将要移除的物理卷上的所有pe移动至其他PV

       pvmove /path/to/pv_device

    3.缩减vg

      #vgreduce vg_name /path/to/pv/device

        首先,你要保证你要移除的物理卷大小远远大于逻辑卷组中空闲的磁盘空间,同时在移除前要将数据给别的磁盘,在做此步时一定要小心不然删除了数据,剩下的你自己想把!

[root@hpf-linux~]# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb1  vg1  lvm2 a--  6.00g 6.00g
  /dev/sdb2  vg1  lvm2 a--  4.00g 4.00g
  /dev/sdb3  vg1  lvm2 a--  2.00g 2.00g
  /dev/sdc1  vg1  lvm2 a--  3.01g 3.01g
[root@hpf-linux~]# pvmove /dev/sdb3      //移除物理卷上的数据,此步是关键!由于没有数据所以很快
  No data to move for vg1
[root@hpf-linux~]# vgreduce vg1 /dev/sdb3
  Removed "/dev/sdb3" from volume group "vg1"
[root@hpf-linux ~]# vgdisplay vg1
  --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               13.01 GiB
  PE Size               8.00 MiB
  Total PE              1665
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1665 / 13.01 GiB
  VG UUID               nD4VhC-o2EW-zk4Q-5Nsh-f2WC-0Czs-C79Qk8
   
[root@hpf-linux ~]# pvremove /dev/sdb3
  Labels on physical volume "/dev/sdb3" successfully wiped
[root@hpf-linux ~]# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb1  vg1  lvm2 a--  6.00g 6.00g
  /dev/sdb2  vg1  lvm2 a--  4.00g 4.00g
  /dev/sdc1  vg1  lvm2 a--  3.01g 3.01g

7、创建逻辑卷(LV)

创建逻辑卷命令lvcreate常用选项:

    -n:指定名称

    -L: 指定大小

    -l:%vg|pvs|FREE,打算分配%

[root@hpf-linux~]# lvs                    //提前查看下逻辑卷,避免创建时同名
[root@hpf-linux~]# lvcreate -L 4G -n testlv vg1
  Logical volume "testlv" created
[root@hpf-linux~]# lvs                
  LV     VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  testlv vg1  -wi-a----- 4.00g                                                    
[root@hpf-linux~]# lvdisplay /dev/vg1/testlv      //查看逻辑卷的详细信息
  --- Logical volume ---
  LV Path                /dev/vg1/testlv
  LV Name                testlv
  VG Name                vg1
  LV UUID                E6bd3O-cH27-OE7D-dBCo-03qj-Vr4J-MDNRQH
  LV Write Access        read/write
  LV Creation host, time hpf-linux, 2015-07-06 08:00:27 +0800
  LV Status              available
  # open                 0
  LV Size                4.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
[root@hpf-linux ~]# mke2fs -t ext4 -L DATA /dev/vg1/testlv    //格式化逻辑卷testlv  
[root@hpf-linux ~]# mount /dev/vg1/testlv /tmp/data/
[root@hpf-linux ~]# ls /tmp/data/
lost+found
[root@hpf-linux ~]# cp /etc/[a-e]* /tmp/data/ 
[root@hpf-linux ~]# ls /tmp/data/
adjtime     asound.conf     crontab    DIR_COLORS               environment
aliases     bashrc          crypttab   DIR_COLORS.256color      ethers
aliases.db  centos-release  csh.cshrc  DIR_COLORS.lightbgcolor  exports
anacrontab  cron.deny       csh.login  dracut.conf              lost+found

8、扩展逻辑卷

 逻辑卷扩展的步骤:

   a、先确保扩展的大小;并确保所属的卷组有足够的剩余空间

   b、扩展物理边界

      lvextend -L [+]size /path/to/lv_device

   c、扩展逻辑边界

      resize2fs /path/to/lv_devive


        扩展前要查看你的逻辑卷组是否有多余的空间来给你添加逻辑卷,同时最好将挂载的逻辑卷给卸载后检测下文件是否有故障,若没有则要按5的步骤来在逻辑卷组中添加物理卷。

[root@hpf-linux~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  vg1    3   1   0 wz--n- 13.01g 9.01g
[root@hpf-linux~]# lvs
  LV     VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  testlv vg1  -wi-ao---- 4.00g                                                    
[root@hpf-linux~]# lvextend -L 6G /dev/vg1/testlv         //添加大小有两种格式6G为增加到6G,+4G为在原有存储空间基础上增加4G。
  Size of logical volume vg1/testlv changed from 4.00 GiB (512 extents) to 6.00 GiB (768 extents).
  Logical volume testlv successfully resized
[root@hpf-linux~]# lvs
  LV     VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  testlv vg1  -wi-ao---- 6.00g                                                    
[root@hpf-linux~]# df -h             //可以看到只是将逻辑卷给增加了,但文件系统并没有识别
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda5              13G  2.6G  9.5G  22% /
tmpfs                 504M     0  504M   0% /dev/shm
/dev/sda1             190M   24M  157M  13% /boot
/dev/sda2             4.7G  9.9M  4.5G   1% /home
/dev/mapper/vg1-testlv
                      3.9G  8.1M  3.7G   1% /tmp/data
[root@hpf-linux~]# resize2fs /dev/vg1/testlv     //识别文件系统默认什么都不加为更新到最新的大小
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vg1/testlv is mounted on /tmp/data; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/vg1/testlv to 1572864 (4k) blocks.
The filesystem on /dev/vg1/testlv is now 1572864 blocks long.
[root@hpf-linux ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda5              13G  2.6G  9.5G  22% /
tmpfs                 504M     0  504M   0% /dev/shm
/dev/sda1             190M   24M  157M  13% /boot
/dev/sda2             4.7G  9.9M  4.5G   1% /home
/dev/mapper/vg1-testlv
                      5.8G  8.1M  5.5G   1% /tmp/data

9、缩减逻辑卷

此步骤请慎用,若自己操作把数据丢失,那。。。。。

缩减逻辑卷的步骤:

   a、卸载卷,并执行强制检查

     e2fsck -f /path/to/lv_devive

   b、缩减逻辑边界

     resize2fs /path/to/lv_device SIZE

   c、缩减物理边界:

     lvreduce -L [-]size /path/to/lv_device

   d、挂载卷

[root@hpf-linux~]# umount /dev/vg1/testlv 
[root@hpf-linux~]# ls /tmp/data/
[root@hpf-linux~]# e2fsck -f /dev/vg1/testlv 
e2fsck 1.41.12 (17-May-2010)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
DATA: 30/393216 files (0.0% non-contiguous), 59522/1572864 blocks
[root@hpf-linux~]# resize2fs /dev/vg1/testlv 3G               //先缩减文件系统
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vg1/testlv to 786432 (4k) blocks.
The filesystem on /dev/vg1/testlv is now 786432 blocks long.
[root@hpf-linux~]# lvreduce -L 3G /dev/vg1/testlv          //在缩减逻辑卷
  WARNING: Reducing active logical volume to 3.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce testlv? [y/n]: y
  Size of logical volume vg1/testlv changed from 6.00 GiB (768 extents) to 3.00 GiB (384 extents).
  Logical volume testlv successfully resized
[root@hpf-linux~]# mount /dev/vg1/testlv /tmp/data/     
[root@hpf-linux~]# ls /tmp/data/
adjtime     asound.conf     crontab    DIR_COLORS               environment
aliases     bashrc          crypttab   DIR_COLORS.256color      ethers
aliases.db  centos-release  csh.cshrc  DIR_COLORS.lightbgcolor  exports
anacrontab  cron.deny       csh.login  dracut.conf              lost+found
[root@hpf-linux ~]# lvs
  LV     VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  testlv vg1  -wi-ao---- 3.00g       
[root@hpf-linux ~]# df -h            
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda5              13G  2.6G  9.5G  22% /
tmpfs                 504M     0  504M   0% /dev/shm
/dev/sda1             190M   24M  157M  13% /boot
/dev/sda2             4.7G  9.9M  4.5G   1% /home
/dev/mapper/vg1-testlv
                      2.9G  6.1M  2.7G   1% /tmp/data   
[root@hpf-linux ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vg1/testlv
  LV Name                testlv
  VG Name                vg1
  LV UUID                E6bd3O-cH27-OE7D-dBCo-03qj-Vr4J-MDNRQH
  LV Write Access        read/write
  LV Creation host, time hpf-linux, 2015-07-06 08:00:27 +0800
  LV Status              available
  # open                 1
  LV Size                3.00 GiB
  Current LE             384
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0   
[root@hpf-linux ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg1    3   1   0 wz--n- 13.01g 10.01g

  

10、创建逻辑卷快照

     快照也是逻辑卷的一种,提供过去某一时间的元卷的通道

     lvcreate -s  -L Size -n name 卷组名 -p r,rw /path/to/lv_devsive

     -p:访问权限

[root@hpf-linux ~]# lvcreate -s -L 50M -n testlv_snap -p r /dev/vg1/testlv   
Rounding up size to full physical extent 56.00 MiB  Logical volume "testlv_snap" created
[root@hpf-linux ~]# mkdir /tmp/data_snap
[root@hpf-linux ~]# mount /dev/vg1/testlv_snap /tmp/data_snap/
mount: block device /dev/mapper/vg1-testlv_snap is write-protected, mounting read-only
[root@hpf-linux ~]# cd /tmp/data
[root@hpf-linux data]# vim + crontab 
[root@hpf-linux data]# cat crontab
.............
# *  *  *  *  * user-name command to be executed
bols
longls
[root@hpf-linux ~]# cd /tmp/data_snap
[root@hpf-linux data_snap]# cat crontab 
...........
# *  *  *  *  * user-name command to be executed

[root@hpf-linux data_snap]# tar -Jcf /tmp/data.tar.xz /tmp/data_snap/*
[root@hpf-linux tmp]# ls /tmp/data.tar.xz 
/tmp/data.tar.xz
[root@hpf-linux data_snap]# cd ..
[root@hpf-linux tmp]# umount /tmp/data_snap/
[root@hpf-linux tmp]# lvremove /dev/vg1/testlv_snap 
Do you really want to remove active logical volume testlv_snap? [y/n]: y
  Logical volume "testlv_snap" successfully removed