一、LVM介绍

          LVMLogical Volume Manager,即逻辑卷管理,是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的存储卷,在存储卷上建立文件系统,以便实现对文件系统的大小灵活调整。

          试想有这样一个场景:home目录独立分区,刚开始只有一个用户使用,后来增加了10个用户,home目录空间不够用了。

有没有什么方法可以根据实际需要分配和控制分区大小,即随着数据的增长,当现有分区空间不够用时,可以调大分区空间;

当分区在初始分配时分配过大,过一段时间后,还可以随意缩减分区大小。这只是LVM的功能之一,LVM还可以实现快照功能,对数据进行增量备份,即对修改前的原数据进行备份,这样可以减少快照占用空间的大小。

 

二、PVVGLVPE相关概念

  •      PVPhysicalVolume),物理卷

  •      VGVolume Group),卷组

  •      LVLogical Volume),逻辑卷

  •      PEPhysical Extend),物理扩展块

 

       LVM的实现是通过将几个分区(或磁盘)调整System ID 8e,然后通过pvcreate命令转换成LVM最底层的物理卷PV

再将多个PV整合成一块看起来是独立的大磁盘,即卷组(VG);再将卷组分成一个或多个可使用的分区(LV),将LV格式化创建文件系统,挂载后就能正常使用了。PELVM最小的存储块,类似于文件系统里的blockVGLV的大小与PE有关,分区缩减或增加容量可以通过调整PE来实现。

 

三、创建PVVG以及LV

该实验对LVM的创建删除扩展缩减快照等功能进行操作,以下实验在虚拟环境VMWare上进

行,系统为Centos 6.6 64位,在虚拟机上对新添加的硬盘/dev/sdb进行操作。实验步骤如下:


1、创建LVM标识符分区

利用fdisk/dev/sdb进行分区,并指定System ID8eLinux LVM),具体的分区操作见上篇博文。

[root@localhost ~]# fdisk /dev/sdb          # 新建磁盘分区,见如下。
[root@localhost ~]# partx -a /dev/sdb    # 通知内核重新识别新建分区
[root@localhost ~]# fdisk -l /dev/sdb    # 查看/dev/sdb磁盘的分区信息
 
Disk /dev/sdb: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 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: 0x9d1b8246
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  8e  Linux LVM
/dev/sdb2            1307        2612    10490445   8e  Linux LVM
/dev/sdb3            2613        4571    15735667+  8e  Linux  LVM

 

2、创建PV

  pv管理命令:

  • pvs:简要pv信息显示

  • pvdisplay:显示pv的详细信息

  • pvscan查询当前系统含有PV的磁盘

  • pvremove:移除一个物理卷

    • 命令格式:pvmove  PhysicalDevicePath [PhysicalDevicePath...]

  • pvmove:移动物理卷数据

    • 命令格式:pvmove  [-n       LogicalVolume][SourcePhysicalVol-ume[:PE[-PE]...]       [DestinationPhysicalVolume[:PE[-PE]...]...]]

  • pvcreate: 创建pv

    • 命令格式:pvcreate  PhysicalDevicePath [PhysicalDevicePath...]

 

[root@localhost ~]# pvcreate /dev/sdb{1,2}     # 将/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               AznT7f-2ybU-MF4P-xkoM-F4tX-eonQ-fMjA74
 
  "/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               yVmQtU-UNue-i8o6-nQwc-PYFR-vvvL-UOD4w9

 

         创建PV非常简单,只需要pvcreate命令和创建PV的分区对象就可以了。从上面PV的信息中可以看出,PV在创建VG PE等相关信息为空,要想利用到PV的空间,那么下一步就要创建VG 和指定PE大小。

 

3、创建VG

  vg管理命令:

  • vgs简要VG信息显示

  • vgdisplay:详细的VG信息显示

  • vgcreate:创建VG

    • 命令格式:vgcreate[-s       #[kKmMgGtTpPeE]] VolumeGroupName        PhysicalDevicePath [PhysicalDevicePath...]

    • 选项:-s:指定VG大小,单位为kKmMgGtTpPeE(字节,兆,千兆...

  • vgextend:扩展VG

    • 命令格式:vgextend  VolumeGroupName  PhysicalDevicePath       [PhysicalDevicePath...]

  • vgreduce:缩减VG

    • 命令格式:vgreduceVolumeGroupName  PhysicalDevicePath       [PhysicalDevicePath...]

    • 减少或移除pv,为了避免数据损坏,需要先做pvmove

  • vgremove:移除一个卷组

 

如下:将PV /dev/sdb1/dev/sdb2创建成名为testvgVGPE大小指定为16M

[root@localhost ~]# vgcreate -s 16M testvg /dev/sdb{1,2}     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
  PE Size               16.00 MiB
  Total PE              1280
  Alloc PE / Size       0 / 0  
  Free  PE / Size       1280 / 20.00 GiB
  VG UUID               hBmQdf-Z2hW-1UOM-xJ5n-yvrp-yX0d-8DrIof


 4、创建LV

    LV管理命令:

  • lvs:简要显示LV信息

  • lvscan:查询当前系统具有LV的分区

  • lvceate:创建LV

    • 命令格式:lvcreate -L #[mMgGtT] -n       NAME  LogicalVolume{Name|Path}

    • 选项:-L:指定LV大小   

 -n:指定LV名称

  • lvreduce:缩减LV

    • 命令格式:lvreduce -L [-]#[mMgGtT] LogicalVolume{Name|Path}

    • 选项:-L:指定LV大小-表示缩减多少,不加-表示缩减至多少

  • lvextend:扩展LV

  • lvremove:移除一个LV

 

如下:创建大小为5G,名称为testlvPV

[root@localhost ~]# lvcreate  -L 5G -n testlv /dev/testvg   

[root@localhost ~]# lvdisplay /dev/testvg/testlv
  --- Logical volume ---
  LV Path                /dev/testvg/testlv
  LV Name                testlv
  VG Name                testvg
  LV UUID                icxsNx-y53V-81KM-Iqp3-1PFZ-U0d6-1E22dL
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-08-15 02:50:24 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             320
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

 

  • 创建文件系统并挂载使用        

[root@localhost ~]# mke2fs -t ext4 /dev/testvg/testlv  # testlv的文件系统创建为ext4
[root@localhost ~]# mkdir /users
[root@localhost ~]# mount /dev/testvg/testlv /users      #将testlv挂载至/users目录
[root@localhost ~]# ls /users
lost+found      # 新增lost+found目录表示挂载成功


四、扩展PEVGLV

1、扩展PV步骤如下:

只需用fdisk /dev/sdb命令将指定分区的System ID指定为 8e (Linux LVM),再用pvcreate 命令将该

分区转换为PV,即可使用。
[root@localhost ~]# pvcreate /dev/sdb3

 

2、扩展VG步骤如下:

  • pvscanpvdisplay      命令查看PV剩余空间是否满足扩展需求,若不满足则需扩展PV

[root@localhost ~]# pvscan
  PV /dev/sdb1   VG testvg   lvm2 [10.00 GiB / 7.00 GiB free]
  PV /dev/sdb2   VG testvg   lvm2 [10.00 GiB / 10.00 GiB free]
  PV /dev/sdb3               lvm2 [15.01 GiB]
  Total: 3 [35.01 GiB] / in use: 2 [20.00 GiB] / in no VG: 1 [15.01 GiB]
  • vgextend      命令增加VG

[root@localhost ~]# vgextend testvg /dev/sdb3
  Volume group "testvg" successfully extended

 

3扩展LV步骤如下:

  • vgdisplay查看VGPE剩余大小,确保有足够的剩余空间供扩展

[root@localhost ~]# vgdisplay /dev/testvg  # 查看testvg PE剩余大小,对应项为Free PE/Size
  • lvextend命令扩展物理边界

[root@localhost ~]# lvextend -L 7G /dev/testvg/testlv          
  Size of logical volume testvg/testlv changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents).
  Logical volume testlv successfully resized
  • resize2fs      扩展逻辑边界

[root@localhost ~]# resize2fs /dev/testvg/testlv
  • 查看是否扩展成功

[root@localhost ~]# lvdisplay /dev/testvg/testlv | grep "LV Size"
   LV Size                7.00 GiB             # 物理边界扩展成功
[root@localhost ~]# df -hP | awk '/testlv/{print $2}'                 
7.00G                  # 逻辑边界扩展成功


五、缩减逻辑卷(LV)

缩减逻辑卷不支持在线缩减,需要umount LV,在缩减前要确保有足够的空余空间供缩

减,要保障正常的数据不受影响,步骤如下:


1、先用vsdisplay查看剩余的空间,确保有足够的空间供缩减

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

2、卸载LV

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

3、缩减前需要强制检查文件系统,没有报告错误可继续下面步骤

[root@localhost ~]# e2fsck -f /dev/testvg/testlv
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/testvg/testlv: 40/327680 files (0.0% non-contiguous), 55927/1310720 blocks

4、用 resize2fs 命令缩减到3G

[root@localhost ~]# resize2fs /dev/testvg/testlv 3G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/testvg/testlv to 786432 (4k) blocks.
The filesystem on /dev/testvg/testlv is now 786432 blocks long.

5、重新挂载并查看大小调整是否成功

[root@localhost ~]# mount /dev/testvg/testlv /users
[root@localhost ~]# df -hP | awk '/testlv/{print $2}'  
   2.9G
[root@localhost ~]# lvdisplay /dev/testvg/testlv | grep "LV Size"
  LV Size                3.00 GiB

6、查看调整前后文件是否有减少或者损坏情况,若没有,则缩减正常

 

六、快照功能

快照的功能是在创建快照区,如果有数据需要改动,则在改动之前备份一份原始数据到快

照卷中,没有被改动的区域则由快照区和文件系统共享。由于快照区和被快照的LV共享PE块,

因此快照区和被快照区需要在同一个VG中。


命令:lvcreate

作用:可以用来创建LVM快照

格式:lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name

选项:-p:指定权限,rrw

  -ssnapshot,指定创建快照

  -n:设定快照卷名称


1、创建快照

[root@localhost ~]# lvcreate -L 3G -p r -s -n testsnsh /dev/testvg/testlv
  Logical volume "testsnsh" created.

 

2、查看快照相关信息

[root@localhost ~]# lvdisplay /dev/testvg/testsnsh
  --- Logical volume ---
  LV Path                /dev/testvg/testsnsh
  LV Name                testsnsh
  VG Name                testvg
  LV UUID                4f18IK-oJWi-tpnv-1wNT-7X1i-RwID-vXhxlq
  LV Write Access        read only
  LV Creation host, time localhost.localdomain, 2015-08-15 03:45:14 +0800
  LV snapshot status     active destination for testlv    # 为testlv所建快照
  LV Status              available
  # open                 0
  LV Size                3.00 GiB
  Current LE             192
  COW-table size         3.00 GiB
  COW-table LE           192
  Allocated to snapshot  0.00%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3
[root@localhost ~]# lvdisplay /dev/testvg/testlv
  --- Logical volume ---
  LV Path                /dev/testvg/testlv
  LV Name                testlv
  VG Name                testvg
  LV UUID                icxsNx-y53V-81KM-Iqp3-1PFZ-U0d6-1E22dL
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2015-08-15 02:50:24 +0800
  LV snapshot status     source of
                         testsnsh [active]     # 快照状态正常
  LV Status              available


3、验证

[root@localhost users]# rm -rf pam.d/     # 将挂载目录下的pam.d目录及目录的所有文件删除
[root@localhost users]# ls
lost+found
[root@localhost ]#  mount /dev/testvg/testsnsh  /mnt
mount: block device /dev/mapper/testvg-testsnsh is write-protected, mounting read-only
[root@localhost ]# cd /mnt
[root@localhost mnt]# ls pam.d/      # 所删除的文件被备份到快照卷中
chfn         crond             login    passwd         remote    runuser         smtp          ssh-keycat  sudo-i
chsh         cvs               newrole  password-auth  ricci     runuser-l       smtp.postfix  su   su-l
config-util  fingerprint-auth  other    polkit-1       run_init  smartcard-auth  sshd          sudo        system-auth

 

4、归档和恢复快照

  • 把快照区的内容归档压缩备份

[root@localhost users]# tar -Jcf /tmp/testlv.tar.xz *
  • 卸载快照区并移除

[root@localhost ~]# umount /dev/testvg/testsnsh 
[root@localhost ~]# lvremove /dev/testvg/testsnsh
Do you really want to remove active logical volume testsnsh? [y/n]: y
  Logical volume "testsnsh" successfully removed
  • 恢复

[root@localhost ~]# umount /dev/testvg/testlv
[root@localhost ~]# mkfs -t ext4 /dev/testvg/testlv
[root@localhost ~]# mount /dev/testvg/testlv /users
[root@localhost ~]# tar -Jxf /tmp/testlv.tar.xz -C /users
[root@localhost ~]# ll /users
total 20
drwxr-xr-x. 2 root root  4096 Aug 15 03:48 archlinux
drwx------. 2 root root 16384 Aug 15 03:12 lost+found


总结:

    在LVM管理的时候需要特别注意的是,PVVGLV在扩展时要先扩展物理边界,再扩展逻辑边界;在缩减时要保证FREE空间满足,而且不能损坏正常数据,要先缩减逻辑边界再缩减物理边界。在移除PV的时候要查看要移除的PV上是否有数据,即确保Allocated PE0,不为0,则需要用盘pvmove命令将数据移动到其他PVFree 空间上去。