一、需求分析

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

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

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

二、什么是LVM

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


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

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

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

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

wKiom1LHY9CQhNN5AAEwVJIrI8Q338.jpg

三、如何创建LVM

   LVM创建步骤

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

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

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

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

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

       我们来一步步创建LVM

   1.创建LVM分区

[root@localhost ~]# fdisk /dev/sdbCommand (m for help): nCommand actione   extendedp   primary partition (1-4)pPartition number (1-4): 1First cylinder (1-6527, default 1):Using default value 1Last cylinder, +cylinders or +size{K,M,G} (1-6527, default 6527): +5GCommand (m for help): tSelected partition 1Hex code (type L to list codes): 8eChanged system type of partition 1 to 8e (Linux LVM)Command (m for help): w[root@localhost ~]# fdisk -l /dev/sdbDisk /dev/sdb: 53.7 GB, 53687091200 bytes255 heads, 63 sectors/track, 6527 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0xccb363d8Device 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/sdb3Physical volume "/dev/sdb1" successfully createdPhysical volume "/dev/sdb2" successfully createdPhysical volume "/dev/sdb3" successfully created[root@localhost ~]#

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

[root@localhost ~]# pvsPV         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/sdb1VG Name             PV Size               5.01 GiBAllocatable           NOPE Size               0 Total PE              0Free PE               0Allocated PE          0PV 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/sdb3Volume group "myvg" successfully created[root@localhost ~]#

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

[root@localhost ~]# vgsVG            #PV #LV #SN Attr   VSize  VFreemyvg            3   0   0 wz--n- 15.02g 15.02gvg_centos6464   1   2   0 wz--n- 19.51g     0[root@localhost ~]#

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

       创建逻辑卷用lvcreate命令

NAMElvcreate - create a logical volume in an existing volume groupSYNOPSISlvcreate  [--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|--stripesizeStripeSize]] {[-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|--nameLogicalVolume{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 myvgLogical volume "mylv" created[root@localhost ~]#

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

[root@localhost ~]# lvsLV      VG            Attr      LSize  Pool Origin Data%  Movemylv    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-mylvmke2fs 1.41.12 (17-May-2010)文件系统标签=操作系统:Linux块大小=4096 (log=2)分块大小=4096 (log=2)Stride=0 blocks, Stripe width=0 blocks655360 inodes, 2621440 blocks131072 blocks (5.00%) reserved for the super user第一个数据块=0Maximum filesystem blocks=268435456080 block groups32768 blocks per group, 32768 fragments per group8192 inodes per groupSuperblock 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 or180 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/sdb5No physical volume label read from /dev/sdb5Physical volume "/dev/sdb5" successfully createdVolume 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/sdb1Removed "/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-mylvExtending logical volume mylv to 13.00 GiBLogical volume mylv successfully resized[root@localhost ~]# lvsLV      VG            Attr      LSize  Pool Origin Data%  Move Log Cpy%Sync Convertmylv    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-mylv9.9G  179M  9.2G   2% /data[root@localhost ~]#

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

       扩展逻辑边界使用resize2fs命令

       resize2fs LV_NAME

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

[root@localhost ~]# umount /data[root@localhost ~]# resize2fs /dev/mapper/myvg-mylvresize2fs 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 ~]# !dfdf -h /data文件系统      容量  已用  可用 已用%% 挂载点/dev/mapper/myvg-mylv13G  182M   12G   2% /data[root@localhost ~]#

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

   4.减小逻辑卷容量

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

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

       e2fsck -f LV_NAME

[root@localhost ~]# e2fsck -f /dev/mapper/myvg-mylve2fsck 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 10Gresize2fs 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-mylvWARNING: Reducing active logical volume to 10.00 GiBTHIS MAY DESTROY YOUR DATA (filesystem etc.)Do you really want to reduce mylv? [y/n]: yReducing logical volume mylv to 10.00 GiBLogical volume mylv successfully resized[root@localhost ~]#


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

[root@localhost ~]# lvsLV      VG            Attr      LSize  Pool Origin Data%  Move Log Cpy%Sync Convertmylv    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-mylv9.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-mylvDo you really want to remove active logical volume mylv? [y/n]: yLogical volume "mylv" successfully removed[root@localhost ~]#


   移除卷组使用vgremove命令

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


   移除物理卷使用pvremove

   pvremove PV_NAME

[root@localhost ~]# pvsPV         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/sdb5Labels on physical volume "/dev/sdb5" successfully wiped[root@localhost ~]# pvsPV         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的更多详细使用还需要大家上网查阅详细资料,我也会在后期做一些补充,在阅读完本文后,希望能提出宝贵的意见,以帮助我更快的进步^_^