LVM详解

LVM相关概念和机制

LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的。

lvm需要使用的软件包为lvm2,一般在CentOS发行版中都已经预安装了。

  • PV(Physical Volume)即物理卷

  硬盘分区后(还未格式化为文件系统)使用pvcreate命令可以将分区创建为pv,要求分区的system ID为8e,即为LVM格式的系统标识符。

  • VG(Volume Group)即卷组

将多个PV组合起来,使用vgcreate命令创建成卷组,这样卷组包含了多个PV就比较大了,相当于重新整合了多个分区后得到的磁盘。虽然VG是整合多个PV的,但是创建VG时会将VG所有的空间根据指定的PE大小划分为多个PE,在LVM模式下的存储都以PE为单元,类似于文件系统的Block。

  • PE(Physical Extend)

PE是VG中的存储单元。实际存储的数据都是存储在这里面的。

  • LV(Logical Volume)

VG相当于整合过的硬盘,那么LV就相当于分区,只不过该分区是通过VG来划分的。VG中有很多PE单元,可以指定将多少个PE划分给一个LV,也可以直接指定大小(如多少兆)来划分。划分为LV之后就相当于划分了分区,只需再对LV进行格式化即可变成普通的文件系统。

通俗地讲,非LVM管理的分区步骤是将硬盘分区,然后将分区格式化为文件系统。而使用LVM,则是在硬盘分区为特定的LVM标识符的分区后将其转变为LVM可管理的PV,其实PV仍然类似于分区,然后将几个PV整合为类似于磁盘的VG,最后划分VG为LV,此时LV就成了LVM可管理的分区,只需再对其格式化即可成为文件系统。

  • LE(logical extent)

PE是物理存储单元,而LE则是逻辑存储单元,也即为lv中的逻辑存储单元,和pe的大小是一样的。从vg中划分lv,实际上是从vg中划分vg中的pe,只不过划分lv后它不再称为pe,而是成为le。

LVM之所以能够伸缩容量,其实现的方法就是将LV里空闲的PE移出,或向LV中添加空闲的PE。

LVM的写入机制

LV是从VG中划分出来的,LV中的PE很可能来自于多个PV。在向LV存储数据时,有多种存储机制,其中两种是:

  • 线性模式(linear):先写完来自于同一个PV的PE,再写来自于下一个PV的PE。
  • 条带模式(striped):一份数据拆分成多份,分别写入该LV对应的每个PV中,所以读写性能较好,类似于RAID 0。

尽管striped读写性能较好也不建议使用该模式,因为lvm的着重点在于弹性容量扩展而非性能,要实现性能应该使用RAID来实现,而且使用striped模式时要进行容量的扩展和收缩将比较麻烦。默认的是使用线性模式。

 LVM实现图解

LVM常用命令汇总

任务

PV阶段

VG阶段

LV阶段

查找(scan)

pvscan

vgscan

lvscan

新建(create)

pvcreate

vgcreate

lvcreate

显示(display)

pvdisplay

vgdisplay

lvdisplay

增加(extend)

 

vgextend

lvextend(lvresize)

减少(reduce)

 

vgreduce

lvreduce(lvresize)

删除(remove)

pvremove

vgremove

lvremove

改变容量(resize)

 

 

lvresize

改变属性(attribute)

pvchange

vgchange

lvchange

LVM的实现

1、准备物理磁盘。

[root@localhost ~]# fdisk -l

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0005b35c

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448    41943039    20663296   8e  Linux LVM

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/mapper/cl-root:20.1 GB, 20107493376 字节,39272448 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/mapper/cl-swap:1048 MB, 1048576000 字节,2048000 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

我们从空的硬盘sdb上创建两个分区sdb1 5G,sdb2 5G为接下来做LVM做准备,注意的是我们在创建分区是需要设定分区的类型Linux LVM的分区类型为8e,并且这些分区要被内核识别,通过cat /proc/partions进行查看,若没有显示,则需要让内核重新进行探测

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x4822aff9 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4822aff9

   设备 Boot      Start         End      Blocks   Id  System

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4822aff9

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4822aff9

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
分区号 (2-4,默认 2):2
起始 扇区 (10487808-41943039,默认为 10487808):
将使用默认值 10487808
Last 扇区, +扇区 or +size{K,M,G} (10487808-41943039,默认为 41943039):+5G
分区 2 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4822aff9

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
/dev/sdb2        10487808    20973567     5242880   83  Linux

命令(输入 m 获取帮助):t
分区号 (1,2,默认 2):2
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4822aff9

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
/dev/sdb2        10487808    20973567     5242880   8e  Linux LVM

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

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

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4822aff9

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
/dev/sdb2        10487808    20973567     5242880   8e  Linux LVM
[root@localhost ~]# cat /proc/pa
pagetypeinfo  partitions    
[root@localhost ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   20971520 sda
   8        1     307200 sda1
   8        2   20663296 sda2
   8       16   20971520 sdb
   8       17    5242880 sdb1
   8       18    5242880 sdb2
   8       32   20971520 sdc
   8       48   20971520 sdd
  11        0    4277248 sr0
 253        0   19636224 dm-0
 253        1    1024000 dm-1

创建物理卷

将新创建的两个分区/dev/sdb1 /dev/sdb2创建成物理卷:所用的命令为pvcreate /dev/adb{1,2} 当然也可以分开进行设定

[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs
  PV         VG Fmt  Attr PSize  PFree 
  /dev/sda2  cl lvm2 a--  19.70g     0 
  /dev/sdb1     lvm2 ---   5.00g  5.00g
  /dev/sdb2     lvm2 ---   5.00g  5.00g
  /dev/sdc      lvm2 ---  20.00g 20.00g
  /dev/sdd      lvm2 ---  20.00g 20.00g

通过pvs 和pvdisplay可以查看物理卷的信息,后面也可以指定特定的物理磁盘,查看某一个物理卷的信息

[root@localhost ~]# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               19.71 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5044
  Free PE               0
  Allocated PE          5044
  PV UUID               uTbh7P-pmtL-KRqx-uAys-fxUA-PdUa-LIpvOX
   
  "/dev/sdb1" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               UFLcKK-XrDv-1wZi-FYIL-FDSW-Bsn0-Xy1Era
   
  "/dev/sdc" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               gHJF8r-cqBO-EV3L-yxD9-3CaA-K3OR-jcFDtU
   
  "/dev/sdb2" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name               
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               9Y3f1L-3M35-lAHU-27xd-XpvI-ptOT-bRekUW
   
  "/dev/sdd" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd
  VG Name               
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               IKH97P-igyp-aaC7-bw2h-tQOF-gjXy-2pc9z0

创建卷组

物理卷pv创建好之后,才可以创建卷组,创建卷组则用命令vgcreate,并将刚才创建的两个物理卷加入该卷组,其中PE的默认大小为4MB,PE是卷组的最小存储单位,可以通过-s选项指定PE的大小,可以通过vgs或者vgdisplay来查看创建的卷组

[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2
  Volume group "myvg" successfully created
[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  cl     1   2   0 wz--n- 19.70g    0 
  myvg   2   0   0 wz--n-  9.99g 9.99g
[root@localhost ~]# vgdisplay 
  --- Volume group ---
  VG Name               cl
  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               19.70 GiB
  PE Size               4.00 MiB
  Total PE              5044
  Alloc PE / Size       5044 / 19.70 GiB
  Free  PE / Size       0 / 0   
  VG UUID               AbayDZ-NRTB-EILO-IjLH-kHji-Ixek-LI1Kdx
   
  --- Volume group ---
  VG Name               myvg
  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               9.99 GiB
  PE Size               4.00 MiB
  Total PE              2558
  Alloc PE / Size       0 / 0   
  Free  PE / Size       2558 / 9.99 GiB
  VG UUID               bRctGj-xKXV-C2pw-hzqk-KSyI-h5mR-BATF9A

创建逻辑卷

卷组VG创建好之后,才可以创建逻辑卷LV,逻辑卷的创建命令为lvcreate,创建好之后可以通过lvs或者lvdisplay开查看创建的逻辑卷,需要说明的是在创建lv的时候需要指定其大小,选项为-L,逻辑卷的名字选项-n,也可以指定PE的个数选项-l

[root@localhost ~]# lvcreate -L 5G -n textlv myvg
  Logical volume "textlv" created.
[root@localhost ~]# lvs
  LV     VG   Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   cl   -wi-ao----   18.73g                                                    
  swap   cl   -wi-ao---- 1000.00m                                                    
  textlv myvg -wi-a-----    5.00g                                                    
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/cl/swap
  LV Name                swap
  VG Name                cl
  LV UUID                Y06H4S-vcF7-GIAf-AV1U-0TlK-yR39-FiR7bD
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-12-08 20:41:35 +0800
  LV Status              available
  # open                 2
  LV Size                1000.00 MiB
  Current LE             250
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
   
  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                L9AAAm-gjjC-dF5S-fOyd-XOTG-fxBC-CI0j2Y
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-12-08 20:41:36 +0800
  LV Status              available
  # open                 1
  LV Size                18.73 GiB
  Current LE             4794
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/myvg/textlv
  LV Name                textlv
  VG Name                myvg
  LV UUID                LhE6yQ-t3cn-BmwW-css0-dvua-CvCO-pSf2pe
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-12-26 21:41:01 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   

创建文件系统

逻辑卷textlv创建好之后,就可以在上面创建文件系统,以ext3文件系统为例,应该注意的是逻辑卷的引用需要逻辑卷的设备文件,逻辑卷的设备文件有两种书写方式

/dev/VG_NAME/LV_NAME

/dev/mapper/VG_NAME-LV_NAME

以我们做的为例逻辑卷的设备文件为

/dev/myvg/textlv或者是/dev/mapper/myvg-textlv

[root@localhost ~]# mkfs -t ext4 /dev/myvg/textlv 
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1342177280
40 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

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

挂载

将创建好的文件系统/dev/myvg/textlv挂载到/mnt上,若实现以后服务器重启自动挂载,需要将创建好的文件系统挂载到配置文件/etc/fstab里面

[root@localhost ~]# mount /dev/myvg/textlv /mnt
[root@localhost ~]# mount |tail -1
/dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
[root@localhost ~]# vi /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Dec  8 20:41:38 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=d6e819c3-6d45-4b79-8179-746c005bf567 /boot                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
/dev/myvg/textlv        /mnt                    ext4    defaults        0 0

为了查看/etc/fstab/是否正确,可以先卸载逻辑卷textlv,然后使用mount –a是内核重新读取/etc/fstab,看是否能够自动挂载

[root@localhost ~]# umount /dev/myvg/textlv 
[root@localhost ~]# mount -a
[root@localhost ~]# mount |tail -1
/dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-12-26 22:09  星火撩原  阅读(2286)  评论(0编辑  收藏  举报