一、需求分析

   1,当我们需要存储一个500G的不可分割文件时,但是我们设备上没有这么大的单个磁盘。

   2,当我们在搭建一个服务,由于日常运转产生大量文件,磁盘容量不够用了,怎么办?添加磁盘,不行,换个大的,好像也不太合适。

   3,由于磁盘损坏等各种原因,需要换磁盘,但是还不能停止服务,这个...有难度。

二、什么是LVM

   LVM(Logical Volume Manager,逻辑卷管理),lvm将linux中物理磁盘虚拟化,这样以来,我们看到的和我们操作磁盘并非对应一个真正物理磁盘,而是将一块或多块物理磁盘虚拟之后组合在一起形成一个大容器,然后从这个大容器中虚拟出一块或多块硬盘出来供我们操作。这样就便于我们对磁盘进行扩展和管理,就可以轻松解决上面的各种需求。


   LVM的组成结构分为三层,分别是物理卷,卷组还有逻辑卷。

   物理卷(physical volume,PV):有物理磁盘或是RAID设备构成,一个物理卷和一块磁盘分区一一对应,用于构建卷组。

   卷组(Volume Group,VG):由一个或者多个物理卷构成的大容器,这个容器不能直接使用,需要将它划分成区块使用。

   逻辑卷(logical volume,LV):逻辑卷就是我们真正要使用的空间,它和使用普通磁盘分区没有任何区别,需要格式化、挂载后方可使用。

linux磁盘管理------LVM_LVM

三、如何创建LVM

   LVM创建步骤

       1.提供可供LVM使用物理磁盘分区

       2.将物理磁盘分区转换为物理卷

       3.将一个或多个物理卷创建为卷组

       4.在创建好的卷组中创建逻辑卷

       5.然后就是格式化和挂载了

       我们来一步步创建LVM

   1.创建LVM分区

[root@localhost ~]# fdisk /dev/sdb
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-6527, default 1):
    Using default value 1
    Last cylinder, +cylinders or +size{K,M,G} (1-6527, default 6527): +5G
                                                                                                                                                                                                                                 
    Command (m for help): t
    Selected partition 1
    Hex code (type L to list codes): 8e
    Changed system type of partition 1 to 8e (Linux LVM)
                                                                                                                                                                                                                                 
    Command (m for help): w
                                                                                                                                                                                                                                 
    [root@localhost ~]# fdisk -l /dev/sdb
    Disk /dev/sdb: 53.7 GB, 53687091200 bytes
    255 heads, 63 sectors/track, 6527 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: 0xccb363d8
                                                                                                                                                                                                                                 
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1               1         654     5253223+  8e  Linux LVM
    [root@localhost ~]#

   重复以上步骤创建三个LVM分区

   2.将物理分区转换为逻辑分区

       用到的命令为pvcreate,这个命令基本不需要什么选项

       用法:pvcreate [选项] 物理磁盘(可多个)

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

       就这样,三个物理卷就创建好了,要查看已经创建好的物理卷可以用pvs和pvdisplay两命令,pvs是简单列出所有物理卷,pvdisplay列出每个详细信息

[root@localhost ~]# pvs
      PV         VG            Fmt  Attr PSize  PFree
      /dev/sda2  vg_centos6464 lvm2 a--  19.51g    0
      /dev/sdb1                lvm2 a--   5.01g 5.01g
      /dev/sdb2                lvm2 a--   5.01g 5.01g
      /dev/sdb3                lvm2 a--   5.01g 5.01g
    [root@localhost ~]#

       以上有四个物理,其中有三个是我们刚刚创建的

       pvdisplay查看物理卷的详细信息

       pvdisplay [选项] [指定物理卷]

[root@localhost ~]# pvdisplay /dev/sdb1
      "/dev/sdb1" is a new physical volume of "5.01 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdb1
      VG Name             
      PV Size               5.01 GiB
      Allocatable           NO
      PE Size               0 
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               8hc2Yw-pM79-fS4E-223V-k5Ra-9GVp-EezZZV
                                                                                                                                                                                                                                 
    [root@localhost ~]#


   3.将以创建的三个物理卷组合成卷组

       创建卷组用vgcreate命令

       vgcreate [选项] 卷组名称  物理卷(一个或多个)

       常用选项-s,设置物理卷的扩展块大小(PhysicalExtentSize,PE),PE就相当于磁盘分区中的块大小,是逻辑卷伸缩的基本单位,默认为4MB,这个在至少是1K,而且是2的倍数。

[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2 /dev/sdb3
      Volume group "myvg" successfully created
    [root@localhost ~]#

       和物理卷类似,查看卷组用vgs和vgdispaly命令。

[root@localhost ~]# vgs
      VG            #PV #LV #SN Attr   VSize  VFree
      myvg            3   0   0 wz--n- 15.02g 15.02g
      vg_centos6464   1   2   0 wz--n- 19.51g     0
    [root@localhost ~]#

   4.在已经创建好的卷组中创建逻辑卷

       创建逻辑卷用lvcreate命令

NAME
           lvcreate - create a logical volume in an existing volume group
                                                                                                                                                                                                                                 
    SYNOPSIS
           lvcreate  [--addtag  Tag]  [--alloc  AllocationPolicy]  [-a|--activate  [a|e|l]{y|n}]
           [-A|--autobackup {y|n}] [-C|--contiguous {y|n}] [-d|--debug] [-h|-?|--help] [--noude-
           vsync]  [--ignoremonitoring] [--monitor {y|n}] [-i|--stripes Stripes [-I|--stripesize
           StripeSize]] {[-l|--extents LogicalExtentsNumber[%{VG|PVS|FREE}]  |  -L|--size  Logi-
           calVolumeSize[bBsSkKmMgGtTpPeE]]  |  -V|--virtualsize  VirtualSize[bBsSkKmMgGtTpPeE]}
           [-M|--persistent {y|n}] [--minor minor] [-m|--mirrors Mirrors [--nosync] [--mirrorlog
           {disk|core|mirrored}  |  --corelog] [-R|--regionsize MirrorLogRegionSize]] [-n|--name
           LogicalVolume{Name|Path}]  [-p|--permission  {r|rw}]  [-r|--readahead  {ReadAheadSec-
           tors|auto|none}]   [-t|--test]   [-T|--thin   [-c|--chunksize  ChunkSize[bBsSkKmMgG]]
           [--discards   {ignore|nopassdown|passdown}]   [--poolmetadatasize   ThinPoolMetadata-
           Size[bBsSkKmMgG]]] [--thinpool ThinPoolLogicalVolume{Name|Path}] [--type SegmentType]
           [-v|--verbose] [-Z|--zero  {y|n}]  VolumeGroup{Name|Path}[/ThinPoolLogicalVolumeName]
           [PhysicalVolumePath[:PE[-PE]]...]

       常用选项

       -n name:指定逻辑卷名称

      -l #:指定逻辑卷大小,#用PE个数表示,很少用

       -L #:指定逻辑卷大小,#用K,M,G等单位表示,很常用

       -p #:指定访问权限,#是r或者rw

[root@localhost ~]# lvcreate -p rw -L 10G -n mylv myvg
      Logical volume "mylv" created
    [root@localhost ~]#

       和物理卷类似,使用lvs和lvdisplay查看所有逻辑卷

[root@localhost ~]# lvs
      LV      VG            Attr      LSize  Pool Origin Data%  Move
      mylv    myvg          -wi-a---- 10.00g                                           
      lv_root vg_centos6464 -wi-ao--- 15.60g                                           
      lv_swap vg_centos6464 -wi-ao---  3.91g                                           
    [root@localhost ~]#


   5.使用逻辑卷

       到处为止,LVM创建已经搞定

       值得注意的是逻辑卷的访问路径,每当成功创建一个逻辑卷,就会在/dev/中创建一个md-[数字]的设备文件,这个文件就是该逻辑卷的访问路径,但是不便于区分,与此同时,会在/dev/mapper/中创建一个软连接文件,还会在/dev/中创建一个与卷组名同名的目录,在这个目录中会创建与逻辑卷同名的软连接文件,这两个软连接文件都同时指向/dev/md-[数字]文件。

   

       接下来的工作就是格式化和挂载

[root@localhost ~]# mke2fs -t ext4 /dev/mapper/myvg-mylv
    mke2fs 1.41.12 (17-May-2010)
    文件系统标签=
    操作系统:Linux
    块大小=4096 (log=2)
    分块大小=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    655360 inodes, 2621440 blocks
    131072 blocks (5.00%) reserved for the super user
    第一个数据块=0
    Maximum filesystem blocks=2684354560
    80 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
                                                                                                                                                                                                                                 
    正在写入inode表: 完成                          
    Creating journal (32768 blocks): 完成
    Writing superblocks and filesystem accounting information: 完成
                                                                                                                                                                                                                                 
    This filesystem will be automatically checked every 24 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    [root@localhost ~]# mkdir /test
    [root@localhost ~]# mount /dev/mapper/myvg-mylv /test/
    [root@localhost ~]# ls /test/
    lost+found
    [root@localhost ~]#


五、调整LVM

   1.为卷组扩容

       首先创建一个物理卷,然后将这个物理卷添加至卷组

       使用vgextend命令添加物理卷至卷组

       vgextend VG_NAME PV_NAME(一个或者多个)

[root@localhost ~]# vgextend myvg /dev/sdb5
      No physical volume label read from /dev/sdb5
      Physical volume "/dev/sdb5" successfully created
      Volume group "myvg" successfully extended
    [root@localhost ~]#

   2.减小卷组容量,移除物理卷

       由于上层逻辑卷的数据是分散存储在各个物理卷上,所以当需要移除物理卷时,需要将该物理卷的数据转移到别的物理卷上

       a.移动数据用pvmove命令

       pvmove PV_NAME(要移除的物理卷)

[root@localhost ~]# pvmove /dev/sdb1
      /dev/sdb1: Moved: 10.8%
      /dev/sdb1: Moved: 30.7%
      /dev/sdb1: Moved: 49.8%
      /dev/sdb1: Moved: 69.4%
      /dev/sdb1: Moved: 88.6%
      /dev/sdb1: Moved: 100.0%
    [root@localhost ~]#

       b.用vgreduce命令移除物理卷

vgreduce VG_NAEM PV_NAME
    [root@localhost ~]# vgreduce myvg /dev/sdb1
      Removed "/dev/sdb1" from volume group "myvg"
    [root@localhost ~]#

   3.为逻辑卷扩容

       为逻辑卷扩容分为两部分,首页是扩展物理边界,然后是扩展逻辑边界。那么什么是物理边界,什么又是逻辑边界。

       物理边界:新创建的逻辑卷,还没有格式化的,不能直接使用

       逻辑边界:已经对逻辑卷格式化,格式化之后的大小才是我们可以真正使用的大小

       所以我们需要先扩展物理边界,然后扩展逻辑边界

       扩展物理边界使用lvextend

       lvextend -L [+]SIZE LV_NAME

       -L [+]SIZE:指定扩展大小,+表示增加多少,没有+表示增加到多少

       在扩展之前如果该逻辑卷已经挂载,需要将它卸载


       为了验证扩展容量不会丢失数据,我们先先创建一些数据

[root@localhost ~]# cp -R /etc/ /data
    [root@localhost ~]# ls /data/
    etc  lost+found
    [root@localhost ~]#


       然后我们卸载这个逻辑卷,然后对其扩展物理边界

[root@localhost ~]# umount /data
    [root@localhost ~]# lvextend -L +3G /dev/mapper/myvg-mylv
      Extending logical volume mylv to 13.00 GiB
      Logical volume mylv successfully resized
    [root@localhost ~]# lvs
      LV      VG            Attr      LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
      mylv    myvg          -wi-a---- 13.00g                                           
      lv_root vg_centos6464 -wi-ao--- 15.60g                                           
      lv_swap vg_centos6464 -wi-ao---  3.91g                                           
    [root@localhost ~]# mount /dev/mapper/myvg-mylv /data/
    [root@localhost ~]# ls /data/
    etc  lost+found
    [root@localhost ~]# df -h /data
    文件系统      容量  已用  可用 已用%% 挂载点
    /dev/mapper/myvg-mylv
                          9.9G  179M  9.2G   2% /data
    [root@localhost ~]#

       从上面的操作我们可以看出,我们已经成功扩展了逻辑边界,数据也没有丢失,但是真正可以使用的空间并没有扩大,这是我们就需要来扩展逻辑边界了

       扩展逻辑边界使用resize2fs命令

       resize2fs LV_NAME

       扩展逻辑分区时,逻辑卷同样不能挂载

[root@localhost ~]# umount /data
    [root@localhost ~]# resize2fs /dev/mapper/myvg-mylv
    resize2fs 1.41.12 (17-May-2010)
    The filesystem is already 3407872 blocks long.  Nothing to do!
                                                                                                                                                                                                                                 
    [root@localhost ~]# mount /dev/mapper/myvg-mylv /data
    [root@localhost ~]# ls /data/
    etc  lost+found
    [root@localhost ~]# !df
    df -h /data
    文件系统      容量  已用  可用 已用%% 挂载点
    /dev/mapper/myvg-mylv
                           13G  182M   12G   2% /data
    [root@localhost ~]#

   到此,逻辑卷扩容已经搞定了

   4.减小逻辑卷容量

       减小逻辑卷容量和逻辑卷扩展正好相反,先减小逻辑边界再减小物理边界,但是在缩减逻辑边界之前需要强制检查文件系统

       强制检查文件系统使用e2fsck命令

       e2fsck -f LV_NAME

[root@localhost ~]# e2fsck -f /dev/mapper/myvg-mylv
    e2fsck 1.41.12 (17-May-2010)
    第一步: 检查inode,块,和大小
    第二步: 检查目录结构
    第3步: 检查目录连接性
    Pass 4: Checking reference counts
    第5步: 检查簇概要信息
    /dev/mapper/myvg-mylv: 2099/851968 files (0.0% non-contiguous), 99908/3407872 blocks
    [root@localhost ~]#

       减小逻辑边界用resize2fs命令

       resize2fs LV_NAME SIZE

[root@localhost ~]# resize2fs /dev/mapper/myvg-mylv 10G
    resize2fs 1.41.12 (17-May-2010)
    Resizing the filesystem on /dev/mapper/myvg-mylv to 2621440 (4k) blocks.
    The filesystem on /dev/mapper/myvg-mylv is now 2621440 blocks long.
                                                                                                                                                                                                                                 
    [root@localhost ~]#


       缩减物理分区用lvreduce命令

       lvreduce -L [-]SIZE LV_NAME

       缩减物理边界和扩展物理边界类似,指定大小时,-表示减少多少,没有-表示减少到多少

[root@localhost ~]# lvreduce -L -3G /dev/mapper/myvg-mylv
      WARNING: Reducing active logical volume to 10.00 GiB
      THIS MAY DESTROY YOUR DATA (filesystem etc.)
    Do you really want to reduce mylv? [y/n]: y
      Reducing logical volume mylv to 10.00 GiB
      Logical volume mylv successfully resized
    [root@localhost ~]#


       我们来检验一下数据是否丢失

[root@localhost ~]# lvs
      LV      VG            Attr      LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
      mylv    myvg          -wi-a---- 10.00g                                           
      lv_root vg_centos6464 -wi-ao--- 15.60g                                           
      lv_swap vg_centos6464 -wi-ao---  3.91g                                           
    [root@localhost ~]# mount /dev/mapper/myvg-mylv /data
    [root@localhost ~]# ls /data/
    etc  lost+found
    [root@localhost ~]# df -h /data
    文件系统      容量  已用  可用 已用%% 挂载点
    /dev/mapper/myvg-mylv
                          9.9G  179M  9.2G   2% /data
    [root@localhost ~]#

       到此,逻辑卷缩减工作就已经搞定了


六、移除LVM

   移除LVM就很简单了,但是,一定提醒大家,在移除LVM之前,请确保数据备份已经搞定

   移除LVM分为以下几个步骤:

   1.移除逻辑卷

   2.移除卷组

   3.移除物理卷


   移除逻辑卷使用lvremove命令

   lvremove LV_NAME

[root@localhost ~]# lvremove /dev/mapper/myvg-mylv
    Do you really want to remove active logical volume mylv? [y/n]: y
      Logical volume "mylv" successfully removed
    [root@localhost ~]#


   移除卷组使用vgremove命令

vgremove VG_NAME
    [root@localhost ~]# vgremove myvg
      Volume group "myvg" successfully removed
    [root@localhost ~]#


   移除物理卷使用pvremove

   pvremove PV_NAME

[root@localhost ~]# pvs
      PV         VG            Fmt  Attr PSize  PFree
      /dev/sda2  vg_centos6464 lvm2 a--  19.51g    0
      /dev/sdb1                lvm2 a--   5.01g 5.01g
      /dev/sdb2                lvm2 a--   5.01g 5.01g
      /dev/sdb3                lvm2 a--   5.01g 5.01g
      /dev/sdb5                lvm2 a--   5.01g 5.01g
    [root@localhost ~]# pvremove /dev/sdb5
      Labels on physical volume "/dev/sdb5" successfully wiped
    [root@localhost ~]# pvs
      PV         VG            Fmt  Attr PSize  PFree
      /dev/sda2  vg_centos6464 lvm2 a--  19.51g    0
      /dev/sdb1                lvm2 a--   5.01g 5.01g
      /dev/sdb2                lvm2 a--   5.01g 5.01g
      /dev/sdb3                lvm2 a--   5.01g 5.01g
    [root@localhost ~]#


   LVM的创建、调整和移除就到此结束了,本文仅仅介绍了一个基本的流程,简单的使用没有什么问题了,关于LVM的更多详细使用还需要大家上网查阅详细资料,我也会在后期做一些补充,在阅读完本文后,希望能提出宝贵的意见,以帮助我更快的进步^_^