首页 > 代码库 > LVM逻辑盘卷管理

LVM逻辑盘卷管理

一、简介

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

LVM的工作原理是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。

LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。

基本的逻辑卷管理概念:

PV(Physical Volume)- 物理卷

物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。

VG(Volumne Group)- 卷组

卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。

LV(Logical Volume)- 逻辑卷

逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。

关系图如下:

技术分享

PE(Physical Extent)- 物理块

LVM 默认使用4MB的PE区块,而LVM的LV最多仅能含有65534个PE (lvm1 的格式),因此默认的LVM的LV最大容量为4M*65534/(1024M/G)=256G。PE是整个LVM 最小的储存区块,也就是说,其实我们的资料都是由写入PE 来处理的。简单的说,这个PE 就有点像文件系统里面的block 大小。所以调整PE 会影响到LVM 的最大容量!

技术分享

二、系统环境及磁盘准备

系统平台:CentOS 7

LVM版本:lvm2-2.02.130-5.el7.x86_64

设备类型:分区、物理磁盘

磁盘准备:新增一块磁盘做实验

三、安装LVM管理工具

1、检查系统中是否安装了LVM管理工具

[root@bash ~]# rpm -qa |grep lvm
mesa-private-llvm-3.6.2-2.el7.x86_64
lvm2-2.02.130-5.el7.x86_64
lvm2-libs-2.02.130-5.el7.x86_64

2、如果未安装,则使用yum方式安装

# yum -y install lvm*
[root@localhost ~]# rpm -qa lvm2
lvm2-2.02.130-5.el7.x86_64

四、新建一个分区

1、使用/dev/sdb模拟分区

# fdisk /dev/sdb

文件系统类型为:8e (Linux LVM)

[root@bash ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x141c2b15

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
/dev/sdb2        10487808    20973567     5242880   8e  Linux LVM
/dev/sdb3        20973568    31459327     5242880   8e  Linux LVM
/dev/sdb4        31459328    41943039     5241856   8e  Linux LVM

五、创建PV

命令介绍:

#pvs 查看pv状态

# pvcreate 将物理分区新建成为PV

# pvscan 查询目前系统里面任何具有PV的磁盘

# pvdisplay 显示出目前系统上面的PV状态

# pvremove 将PV属性移除,让该分区不具有PV属性

1、将/dev/sdb1 - /dev/sdb4新建成为PV格式

[root@bash test]# pvcreate /dev/sdb{1..4}
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created
  Physical volume "/dev/sdb3" successfully created
  Physical volume "/dev/sdb4" successfully created

2、查询目前系统里面任何具有PV的磁盘

[root@bash test]# pvscan
  PV /dev/sdb3         lvm2 [5.00 GiB]
  PV /dev/sdb2         lvm2 [5.00 GiB]
  PV /dev/sdb1         lvm2 [5.00 GiB]
  PV /dev/sdb4         lvm2 [5.00 GiB]
  Total: 4 [20.00 GiB] / in use: 0 [0   ] / in no VG: 4 [20.00 GiB]

六、创建VG

命令介绍:

# vgcreate 新建VG

vgcreate [-s N[mgt]] VG名称 设备名称

-s 接PE的大小

# vgscan 查询目前系统里面是否有VG的磁盘

#vgs查看vg状态

# vgdisplay 显示出目前系统上面的VG状态

# vgextend 在VG内增加额外的PV

# vgreduce 在VG内删除PV

# vgchange 设置VG是否启动(active)

# vgremove 删除一个VG

PV的名称是分区的设备文件名字,VG名称可以自定义的,我将VG的名称定义为myvg

1、将/dev/sdb1-/dev/sdb3新建为一个VG,且指定PE为15MB

[root@bash test]# vgcreate -s 15M "myvg" /dev/sdb{1..3}
  Volume group "myvg" successfully created

2、查看系统上的VG状态

[root@bash test]# pvscan
  PV /dev/sdb1   VG myvg   lvm2 [5.00 GiB / 5.00 GiB free]
  PV /dev/sdb2   VG myvg   lvm2 [5.00 GiB / 5.00 GiB free]
  PV /dev/sdb3   VG myvg   lvm2 [5.00 GiB / 5.00 GiB free]
  PV /dev/sdb4             lvm2 [5.00 GiB]
  Total: 4 [19.98 GiB] / in use: 3 [14.99 GiB] / in no VG: 1 [5.00 GiB]

3.显示出目前系统上面的VG状态

[root@bash test]# vgdisplay
  --- Volume group ---
  VG Name               myvg
  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               14.99 GiB
  PE Size               15.00 MiB
  Total PE              1023
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1023 / 14.99 GiB
  VG UUID               CT1KmC-upAS-0r1t-5KQV-MR7z-2jfj-ufOc8Q

4、新增PV给myvg

[root@bash test]# vgextend "myvg" /dev/sdb4
  Volume group "myvg" successfully extended

5、显示出目前系统上面的VG状态

[root@bash test]# vgdisplay
  --- Volume group ---
  VG Name               myvg
  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               19.98 GiB
  PE Size               15.00 MiB
  Total PE              1364
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1364 / 19.98 GiB
  VG UUID               CT1KmC-upAS-0r1t-5KQV-MR7z-2jfj-ufOc8Q

七、创建LV

命令介绍:

# lvcreate 新建LV

lvcreate [-L N[mgt]] [-n LV名称] VG名称

lvcreate [-l N] [-n LV名称] VG名称

注意: -L 后面接容量,最小单位为PE, 数量必须是PE的倍数,若不相符,系统会自行计算最相近的容量

-l 后面接PE的“个数”,而不是数量

-n 后面接LV的名称

# lvscan 查询系统LV

# lvdisplay 显示系统LV状态

# lvextend 在LV里增加容量

#lvs 查看lvs状态

# lvreduce 在LV里减少容量

# lvremove 删除一个LV

# lvresize 对LV进行容量大小的调整

1、将整个myvg全部分配给mglv

[root@bash test]# lvcreate -L 19.98G -n mylv myvg
  Rounding up size to full physical extent 19.98 GiB
  Logical volume "mylv" created.

:如果报错,说明分配lv的容量不是PE的整数倍,一个PE为15M,将lv容量调整为15的整数倍就可以。

2.查看LV情况

[root@bash test]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/myvg/mylv
  LV Name                mylv
  VG Name                myvg
  LV UUID                crtMed-duu9-Nrfc-tCJR-wzby-wFP0-v1P9pT
  LV Write Access        read/write
  LV Creation host, time bash, 2017-02-07 17:01:23 +0800
  LV Status              available
  # open                 0
  LV Size                19.98 GiB
  Current LE             1364
  Segments               4
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

[root@bash test]# ll /dev/myvg/mylv 
lrwxrwxrwx 1 root root 7 Feb  7 17:01 /dev/myvg/mylv -> ../dm-0
[root@bash test]# ll /dev/dm-0 
brw-rw---- 1 root disk 253, 0 Feb  7 17:01 /dev/dm-0

3、进行格式化与挂载

# mke2fs -t ext4 /dev/myvg/mglv

# mkdir /mnt/lvm

# mount /dev/myvg/mglv /mnt/lvm

[root@bash lvm]# df
Filesystem            1K-blocks    Used Available Use% Mounted on
/dev/sda2              20961280 4709020  16252260  23% /
devtmpfs                 486140       0    486140   0% /dev
tmpfs                    500664      76    500588   1% /dev/shm
tmpfs                    500664   50776    449888  11% /run
tmpfs                    500664       0    500664   0% /sys/fs/cgroup
/dev/sda3              20961280 2971196  17990084  15% /usr
/dev/sda1                520876  157624    363252  31% /boot
tmpfs                    100136      44    100092   1% /run/user/0
/dev/sr0                7587292 7587292         0 100% /media/centos7-mirror
/dev/mapper/myvg-mylv  20490832   45080  19381816   1% /mnt/lvm

4、复制文件

[root@bash lvm]# cp -a /etc/fstab /mnt/lvm/
[root@bash lvm]# ls /mnt/lvm/
fstab  lost+found

八、放大LV容量

步骤:

  • 1)、利用fdisk设置新的额具有8e /systemID的分区

  • 2)、利用pvcreate构建PV

  • 3)、利用vgextend将PV加进myvg

  • 4)、利用lvresize将新加入的PV内的PE加入mylv中

  • 5)、通过resize2fs将文件系统的容量增加

1、新增硬盘/dev/sdc

[root@bash lvm]# ll /dev/sdc
brw-rw---- 1 root disk 8, 32 Feb  7 17:18 /dev/sdc

2、新建新的PV

[root@bash lvm]# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created

[root@bash lvm]# pvscan
  PV /dev/sdb1   VG myvg   lvm2 [5.00 GiB / 0    free]
  PV /dev/sdb2   VG myvg   lvm2 [5.00 GiB / 0    free]
  PV /dev/sdb3   VG myvg   lvm2 [5.00 GiB / 0    free]
  PV /dev/sdb4   VG myvg   lvm2 [5.00 GiB / 0    free]
  PV /dev/sdc              lvm2 [20.00 GiB]
  Total: 5 [39.98 GiB] / in use: 4 [19.98 GiB] / in no VG: 1 [20.00 GiB]

3、增加VG容量

[root@bash lvm]# vgextend myvg /dev/sdc
  Volume group "myvg" successfully extended

[root@bash lvm]# vgdisplay #查看
  --- Volume group ---
  VG Name               myvg
  System ID             
  Format                lvm2
  Metadata Areas        5
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                5
  Act PV                5
  VG Size               39.98 GiB
  PE Size               15.00 MiB
  Total PE              2729
  Alloc PE / Size       1364 / 19.98 GiB
  Free  PE / Size       1365 / 20.00 GiB
  VG UUID               CT1KmC-upAS-0r1t-5KQV-MR7z-2jfj-ufOc8Q

4.增加LV容量

[root@bash lvm]# lvresize -l +200 /dev/myvg/mylv #无单位表示增减PE个数,
+表示增加,无+号代表增加到
  Size of logical volume myvg/mylv changed from 19.98 GiB (1364 extents) to 22.91 GiB (1564 extents).
  Logical volume mylv successfully resized.
[root@bash lvm]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/myvg/mylv
  LV Name                mylv
  VG Name                myvg
  LV UUID                crtMed-duu9-Nrfc-tCJR-wzby-wFP0-v1P9pT
  LV Write Access        read/write
  LV Creation host, time bash, 2017-02-07 17:01:23 +0800
  LV Status              available
  # open                 1
  LV Size                22.91 GiB
  Current LE             1564
  Segments               5
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

5.查看

[root@bash lvm]# df -h
/dev/mapper/myvg-mylv   20G   45M   19G   1% /mnt/lvm

6、将LV的容量扩充到整个文件系统

# dumpe2fs /dev/myvg/mglv 查看文件系统内的superblock记录情况

# resize2fs [-f] [device] [size] 将LV的容量扩充到整个文件系统

[root@bash lvm]# resize2fs /dev/myvg/mylv
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylv is mounted on /mnt/lvm; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 3
The filesystem on /dev/myvg/mylv is now 6005760 blocks long.

7、查看

[root@bash lvm]# df -h
/dev/mapper/myvg-mylv   23G   45M   22G   1% /mnt/lvm

九、缩小LV容量

1、先卸载

[root@bash ~]# umount /mnt/lvm/

2、检测文件系统

[root@bash ~]# e2fsck -f /dev/myvg/mylv
e2fsck 1.42.9 (28-Dec-2013)
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/myvg/mylv: 12/1507328 files (0.0% non-contiguous), 138659/6005760 blocks

3.降低文件系统容量

[root@bash ~]# resize2fs /dev/myvg/mylv 5000M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/mylv to 1280000 (4k) blocks.
The filesystem on /dev/myvg/mylv is now 1280000 blocks long.

4、重新挂载并查看容量大小

[root@bash ~]# mount /dev/myvg/mylv /mnt/lvm/
[root@bash ~]# df -h |grep /dev/mapper/ 
/dev/mapper/myvg-mylv  4.7G   33M  4.4G   1% /mnt/lvm

5、降低LV容量

[root@bash ~]# lvresize -L 5000M /dev/myvg/mylv #降低lv到5000M,-号表示减少多少
  Rounding size to boundary between physical extents: 4.89 GiB
  WARNING: Reducing active and open logical volume to 4.89 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mylv? [y/n]: y
  Size of logical volume myvg/mylv changed from 22.91 GiB (1564 extents) to 4.89 GiB (334 extents).
  Logical volume mylv successfully resized.

6、查看容量大小

[root@bash ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/myvg/mylv
  LV Name                mylv
  VG Name                myvg
  LV UUID                crtMed-duu9-Nrfc-tCJR-wzby-wFP0-v1P9pT
  LV Write Access        read/write
  LV Creation host, time bash, 2017-02-07 17:01:23 +0800
  LV Status              available
  # open                 1
  LV Size                4.89 GiB
  Current LE             334
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

7、将/dev/sdc从myvg中移除

[root@bash ~]# vgreduce myvg /dev/sdc 
  Removed "/dev/sdc" from volume group "myvg"
[root@bash ~]# pvremove /dev/sdc
  Labels on physical volume "/dev/sdc" successfully wiped
[root@bash ~]# pvscan
  PV /dev/sdb1   VG myvg   lvm2 [5.00 GiB / 105.00 MiB free]
  PV /dev/sdb2   VG myvg   lvm2 [5.00 GiB / 5.00 GiB free]
  PV /dev/sdb3   VG myvg   lvm2 [5.00 GiB / 5.00 GiB free]
  PV /dev/sdb4   VG myvg   lvm2 [5.00 GiB / 5.00 GiB free]
  Total: 4 [19.98 GiB] / in use: 4 [19.98 GiB] / in no VG: 0 [0   ]

十、删除逻辑卷

我们在创建好逻辑卷后可以通过创建文件系统,挂载逻辑卷来使用它,如果说我们不想用了也可以将其删除掉。

【注意】对于创建物理卷、创建卷组以及创建逻辑卷我们是有严格顺序的,同样,对于删除逻辑卷、删除卷组以及删除物理卷也是有严格顺序要求的

  • ①首先将正在使用的逻辑卷卸载掉  通过 umount 命令

  • ②将逻辑卷先删除  通过 lvremove 命令

  • ③删除卷组  通过 vgremove 命令

  • ④最后再来删除我们的物理卷  通过 pvremove 命令

    [root@bash ~]# umount /mnt/lvm/ #卸载
    [root@bash ~]# lvremove /dev/myvg/mylv #删除LV 
    Do you really want to remove active logical volume mylv? [y/n]: y
      Logical volume "mylv" successfully removed
    [root@bash ~]# vgremove myvg  #删除VG
      Volume group "myvg" successfully removed
    [root@bash ~]# pvremove /dev/sdb{1..4} #删除PV
      Labels on physical volume "/dev/sdb1" successfully wiped
      Labels on physical volume "/dev/sdb2" successfully wiped
      Labels on physical volume "/dev/sdb3" successfully wiped
      Labels on physical volume "/dev/sdb4" successfully wiped

十一、逻辑卷快照

当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。

在写操作写入块之前,将原始数据移动到 snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是读取数据块是没有修改过的,那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。

创建snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。

技术分享

1.查看挂在情况

[root@bash ~]# df | grep /dev/mapper
/dev/mapper/myvg-mylv   3030800    4676   2868840   1% /mnt/lvm

2、拷贝数据

[root@bash ~]# cp -a /etc/fstab /etc/issue /mnt/lvm/
[root@bash ~]# ll /mnt/lvm/
total 24
-rw-r--r--. 1 root root   595 Dec 26 05:39 fstab
-rw-r--r--. 1 root root    78 Dec 26 05:50 issue
drwx------  2 root root 16384 Feb  7 18:43 lost+found

3、创建快照

[root@bash ~]# lvcreate -L 80M -s -p r -n lvsnap /dev/myvg/mylv #-p r指定权限为只读
  Logical volume "lvsnap" created.

[root@bash snapshot]# lvdisplay /dev/myvg/lvsnap 
  --- Logical volume ---
  LV Path                /dev/myvg/lvsnap
  LV Name                lvsnap
  VG Name                myvg
  LV UUID                CcICLA-SV2u-ojuv-ZWnX-3JBg-h1Bg-NJNieO
  LV Write Access        read/write
  LV Creation host, time bash, 2017-02-08 01:36:53 +0800
  LV snapshot status     active destination for mylv
  LV Status              available
  # open                 1
  LV Size                3.00 GiB
  Current LE             768
  COW-table size         80.00 MiB
  COW-table LE           20
  Allocated to snapshot  0.00%   #快照卷为空
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

:建立快照的卷大小只需要原始逻辑卷的15%~20%就够了。也可以使用lvextend放大快照。

4、将刚才创建的快照挂载查看

[root@bash ~]# mkdir /mnt/snapshot
[root@bash ~]# mount /dev/myvg/lvsnap /mnt/snapshot/
[root@bash ~]# cd /mnt/snapshot/
[root@bash snapshot]# ls
fstab  issue  lost+found
[root@bash snapshot]# df -h | grep /dev/mapper*
/dev/mapper/myvg-mylv    2.9G  4.6M  2.8G   1% /mnt/lvm
/dev/mapper/myvg-lvsnap  2.9G  4.6M  2.8G   1% /mnt/snapshot

:可使用tar命令对快照数据进行归档,以便以后恢复使用

5、删除快照

[root@bash ~]# umount /mnt/snapshot/   #先卸载
[root@bash ~]# lvremove /dev/myvg/lvsnapshot  #后删除
Do you really want to remove active logical volume lvsnapshot? [y/n]: y
  Logical volume "lvsnapshot" successfully removed

总结:

1、LVM最主要的用处是在实现一个可以弹性调整容量的文件系统上,而不是在新建一个性能为主的磁盘上。LVM默认的读写模式是线性模式

2、实现的流程:

技术分享

3、删除系统内的LVM

  • 1)先卸载系统上面的 LVM 文件系统(包括快照与所有LV)

  • 2)使用 lvremove 删除 LV

  • 3)使用 vgchange -an VGname 让 VGname 这个 VG 不具有 Active 的标志

  • 4)使用 vgremove 删除VG

  • 5)使用 pvremove 删除PV

  • 6)使用 fdisk 将 ID 修改回来

4、PV, VG, LV 常用命令的总结

技术分享

5、/boot分区与/swap分区不能使用LVM


本文出自 “追求不完美” 博客,请务必保留此出处http://yolynn.blog.51cto.com/11575833/1895905

LVM逻辑盘卷管理