如果对于生产环境下的服务器来说,如果存储数据的分区磁盘空间不够了怎么办?


因为如果要把一个分区的内容都拷贝到另一个分区上去,势必要首先卸载掉之前的那个分区,然后*对整个分区进行拷贝,如果服务器上运行着一个重要的服务,比如说WWW或者FTP,其要求是 7*24 小时运行正常的,那么卸载掉分区这是不可想象的,同时如果该分区保存的内容非常非常的多,那么在对分区进行转移时时间可能会耗费很久,所以,这个时候我们就会受到传统磁盘管理的限制,因为其不能够进行动态的磁盘管理。因此,为了解决这个问题,LVM技术就诞生了!!!


LVM(Logicalvolume Manager)是逻辑卷管理的简称。它是Linux环境下对磁盘分区进行管理的一种机制。现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制,对于其它的类UNIX操作系统,以及windows操作系统都有类似与LVM这种磁盘管理软件。


LVM的工作原理:

它就是通过将底层的物理硬盘封装起来,然后以逻辑卷的方式呈现给上层应用。在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。


 LVM最大的特点:

可以对磁盘进行动态管理:因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。

我们如果新增加了硬盘,其也不会改变现有上层的逻辑卷。

作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性!!!


LVM 常用的术语:

 

PV(Physical Volume),物理卷

PE(Physical Extend),我们的LVM磁盘管理中PE的默认大小是4M大小,其实PE就是我们逻辑卷管理的最基本单位。比如说我有一个400M的硬盘,那么在将其格式化成PV的时候,其实际就是将这块物理硬盘划分成了100个的PE,因为PE默认的大小就是4M。

VG即卷组 作用就是用来装PE的,我们可以把一个或者多个PV加到VG当中

LV(Logical Volume),所以第三步操作就是基于VG来创建我们最终要使用的LV。


创建LVM的基本步骤:

1)物理磁盘被格式化为PV,(空间被划分为一个个的PE) #PV包含PE

(2)不同的PV加入到同一个VG中,(不同PV的PE全部进入到了VG的PE池内) #VG包含PV

(3)LV基于PE创建,(组成LV的PE可能来自不同的物理磁盘) #LV基于PV创建

(4)LV直接可以格式化后挂载使用    #格式化挂载使用

(5)LV的扩充缩减实际上就是增加或减少组成该LV的PE数量,其过程不会丢失原始数据


lvm常用的命令

功能                   PV管理命令            VG管理命令      LV管理命令

scan扫描                    pvscan                         vgscan                  lvscan                       

create创建                  pvcreate                      vgcreate           lvcreate

display显示            pvdisplay                          vgdisplay          lvdisplay

remove移除           pvremove                     vgremove               lvremove                   

extend扩展                                                     vgextend             lvextend      

reduce减少                                       vgreduce           lvreduce


实战

[root@RHEL7 ~]# date

Sat Aug 20 20:39:15 CST 2016


 [root@RHEL7 ~]# pvcreate /dev/sdc1 /dev/sdc2

  Physical volume "/dev/sdc1" successfully created

  Physical volume "/dev/sdc2" successfully created

[root@RHEL7 ~]#  

[root@RHEL7 ~]# vgcreate vgtest /dev/sdc1 /dev/sdc2

  Volume group "vgtest" successfully created


创建LV

lvcreate -n 指定逻辑卷名称  -L 指定大小 

[root@RHEL7 ~]# lvcreate -n lvtest -L 100M vgtest

  Logical volume "lvtest" created

[root@RHEL7 ~]# ls /dev/vgtest/lvtest

/dev/vgtest/lvtest


格式化LV

[root@RHEL7 ~]# mkfs.xfs  /dev/vgtest/lvtest

meta-data=/dev/vgtest/lvtest     isize=256    agcount=4, agsize=6400 blks

         =                       sectsz=512   attr=2, projid32bit=1

         =                       crc=0

data     =                       bsize=4096   blocks=25600, imaxpct=25

         =                       sunit=0      swidth=0 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal log           bsize=4096   blocks=853, version=2

         =                       sectsz=512   sunit=0 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@RHEL7 ~]#

挂载

[root@RHEL7 ~]# mkdir /lvdisk

[root@RHEL7 ~]# mount /dev/vgtest/lvtest /lvdisk

[root@RHEL7 ~]# df -h | tail -1

/dev/mapper/vgtest-lvtest   97M  5.2M   92M   6% /lvdisk

[root@RHEL7 ~]#

[root@RHEL7 ~]# cd /lvdisk/

[root@RHEL7 lvdisk]# dd if=/dev/zero of=lv.txt bs=2M count=50

dd: error writing ‘lv.txt’: No space left on device

46+0 records in

45+0 records out

95936512 bytes (96 MB) copied, 0.66916 s, 143 MB/s

[root@RHEL7 lvdisk]# du /lvdisk/lv.txt

93688    /lvdisk/lv.txt

[root@RHEL7 lvdisk]#

 查看PV信息

[root@RHEL7 lvdisk]# pvdisplay

  --- Physical volume ---

  PV Name               /dev/sdc1

  VG Name               vgtest

  PV Size               95.00 MiB / not usable 3.00 MiB

  Allocatable           yes

  PE Size               4.00 MiB

  Total PE              23

  Free PE               23

  Allocated PE          0

  PV UUID               L6mWDE-0cek-zMWQ-8jiZ-IS1O-bVn0-hGs8Fu

  --- Physical volume ---

  PV Name               /dev/sdc2

  VG Name               vgtest

  PV Size               191.00 MiB / not usable 3.00 MiB

  Allocatable           yes

  PE Size               4.00 MiB

  Total PE              47

  Free PE               22

  Allocated PE          25

  PV UUID               cbV60E-zrNB-FV6a-pIFX-JTb2-ZFNo-S3u5jE

查看VG卷信息

[root@RHEL7 lvdisk]# vgdisplay

  --- Volume group ---

  VG Name               rhel

  System ID             

  Format                lvm2

  Metadata Areas        1

  Metadata Sequence No  3

  VG Access             read/write

  VG Status             resizable

  MAX LV                0

  Cur LV                2

  Open LV               2

  Max PV                0

  Cur PV                1

  Act PV                1

  VG Size               10.75 GiB

  PE Size               4.00 MiB

  Total PE              2751

  Alloc PE / Size       2750 / 10.74 GiB

  Free  PE / Size       1 / 4.00 MiB

  VG UUID               hjnlV1-hW10-AaJc-s0eS-mdnh-obfZ-EY2miG

  --- Volume group ---

  VG Name               vgtest

  System ID             

  Format                lvm2

  Metadata Areas        2

  Metadata Sequence No  2

  VG Access             read/write

  VG Status             resizable

  MAX LV                0

  Cur LV                1

  Open LV               1

  Max PV                0

  Cur PV                2

  Act PV                2

  VG Size               280.00 MiB

  PE Size               4.00 MiB

  Total PE              70

  Alloc PE / Size       25 / 100.00 MiB

  Free  PE / Size       45 / 180.00 MiB

  VG UUID               rSEMrZ-IfzS-jsyX-p4Ei-qTPV-ni7V-u7MGLu

VG扩容

[root@RHEL7 lvdisk]# pvcreate /dev/sdb1

[root@RHEL7 lvdisk]# partprobe /dev/sdb

[root@RHEL7 lvdisk]# vgextend vgtest /dev/sdb1

  Volume group "vgtest" successfully extended

[root@RHEL7 lvdisk]# pvs

  PV         VG     Fmt  Attr PSize   PFree

  /dev/sda2  rhel   lvm2 a--   10.75g  4.00m

  /dev/sdb1  vgtest lvm2 a--   10.00g 10.00g

  /dev/sdc1  vgtest lvm2 a--   92.00m 92.00m

  /dev/sdc2  vgtest lvm2 a--  188.00m 88.00m

LV扩容

[root@RHEL7 lvdisk]# df -hT

Filesystem                Type      Size  Used Avail Use% Mounted on

/dev/mapper/rhel-root     xfs       9.8G  3.3G  6.5G  34% /

devtmpfs                  devtmpfs  908M     0  908M   0% /dev

tmpfs                     tmpfs     914M   80K  914M   1% /dev/shm

tmpfs                     tmpfs     914M  8.9M  905M   1% /run

tmpfs                     tmpfs     914M     0  914M   0% /sys/fs/cgroup

/dev/sda1                 xfs       197M   91M  106M  47% /boot

/dev/mapper/vgtest-lvtest xfs       109M   97M   12M  89% /lvdisk

[root@RHEL7 lvdisk]# lvextend -L +100MB /dev/vgtest/lvtest

  Extending logical volume lvtest to 212.00 MiB

  Logical volume lvtest successfully resized

[root@RHEL7 lvdisk]# xfs_growfs /lvdisk/

meta-data=/dev/mapper/vgtest-lvtest isize=256    agcount=5, agsize=6400 blks

         =                       sectsz=512   attr=2, projid32bit=1

         =                       crc=0

data     =                       bsize=4096   blocks=28672, imaxpct=25

         =                       sunit=0      swidth=0 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal               bsize=4096   blocks=853, version=2

         =                       sectsz=512   sunit=0 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

data blocks changed from 28672 to 54272

[root@RHEL7 lvdisk]# df -hT

Filesystem                Type      Size  Used Avail Use% Mounted on

/dev/mapper/rhel-root     xfs       9.8G  3.3G  6.5G  34% /

devtmpfs                  devtmpfs  908M     0  908M   0% /dev

tmpfs                     tmpfs     914M   80K  914M   1% /dev/shm

tmpfs                     tmpfs     914M  8.9M  905M   1% /run

tmpfs                     tmpfs     914M     0  914M   0% /sys/fs/cgroup

/dev/sda1                 xfs       197M   91M  106M  47% /boot

/dev/mapper/vgtest-lvtest xfs       209M   97M  112M  47% /lvdisk

移除VG

[root@RHEL7 lvdisk]# vgreduce vgtest /dev/sdb1

  Removed "/dev/sdb1" from volume group "vgtest"

[root@RHEL7 lvdisk]# vgs

  VG     #PV #LV #SN Attr   VSize   VFree

  rhel     1   2   0 wz--n-  10.75g  4.00m

  vgtest   2   1   0 wz--n- 280.00m 68.00m

[root@RHEL7 lvdisk]# pvs

  PV         VG     Fmt  Attr PSize   PFree

  /dev/sda2  rhel   lvm2 a--   10.75g  4.00m

  /dev/sdb1         lvm2 a--   10.00g 10.00g

  /dev/sdc1  vgtest lvm2 a--   92.00m 68.00m

  /dev/sdc2  vgtest lvm2 a--  188.00m     0

删除LVM:先删除lv,再删除vg,再删除pv

[root@RHEL7 lvdisk]# umount /lvdisk/

umount: /lvdisk: target is busy.

        (In some cases useful info about processes that use

         the device is found by lsof(8) or fuser(1))

[root@RHEL7 lvdisk]# cd

[root@RHEL7 ~]# umount /lvdisk/

[root@RHEL7 ~]# lvremove /dev/vgtest/lvtest

Do you really want to remove active logical volume lvtest? [y/n]: y

  Logical volume "lvtest" successfully removed

[root@RHEL7 ~]# vgremove vgtest

  Volume group "vgtest" successfully removed

[root@RHEL7 ~]# pvremove /dev/sdc1 /dev/sdc2

  Labels on physical volume "/dev/sdc1" successfully wiped

  Labels on physical volume "/dev/sdc2" successfully wiped

LVM快照

先准备一个LV

[root@RHEL7 ~]# pvcreate /dev/sdc

  Physical volume /dev/sdc not found

  Device /dev/sdc not found (or ignored by filtering).

[root@RHEL7 ~]# pvcreate /dev/sdc1

  Physical volume "/dev/sdc1" successfully created

[root@RHEL7 ~]# vgcreate vgtest /dev/sdc1

  Volume group "vgtest" successfully created

[root@RHEL7 ~]# lvcreate -n lvtest -L 50M vgtest

  Rounding up size to full physical extent 52.00 MiB

  Logical volume "lvtest" created

[root@RHEL7 ~]#

格式化LV

[root@RHEL7 ~]# mkfs.xfs /dev/vgtest/lvtest

meta-data=/dev/vgtest/lvtest     isize=256    agcount=2, agsize=6656 blks

         =                       sectsz=512   attr=2, projid32bit=1

         =                       crc=0

data     =                       bsize=4096   blocks=13312, imaxpct=25

         =                       sunit=0      swidth=0 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal log           bsize=4096   blocks=853, version=2

         =                       sectsz=512   sunit=0 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@RHEL7 ~]# mkdir /lvdisk

[root@RHEL7 ~]# mount /dev/vgtest/lvtest /lvdisk/

[root@RHEL7 ~]# df -h | tail -1

/dev/mapper/vgtest-lvtest   49M  2.7M   46M   6% /lvdisk

创建一个文件来测试

[root@RHEL7 ~]# cd /lvdisk/

[root@RHEL7 lvdisk]# touch test.txt

[root@RHEL7 lvdisk]# ls

test.txt

[root@RHEL7 lvdisk]# vgs

  VG     #PV #LV #SN Attr   VSize  VFree

  rhel     1   2   0 wz--n- 10.75g  4.00m

  vgtest   1   1   0 wz--n- 92.00m 40.00m

[root@RHEL7 lvdisk]#